質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

3601閲覧

Access登録ボタンをクリックされたときのみレコードを保存する方法について

0531

総合スコア15

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2022/11/16 07:04

前提

Accessで車両を管理するシステムを作成しています。
今回テーブルの結合でフォームを作成しました。
作り方は、フォームウィザード→サブフォームがあるフォーム→表形式で作成しました。
ここで入力する内容はサブフォームのみで、車両の運転記録の実績を入力します。
メインフォームは値を参照するためのもので入力はしません。
サブフォームに戻るボタン、登録ボタン、閉じるボタンを作成しました。
このフォームにマクロを設定し登録前に閉じるボタンをクリックすると、「保存しますか?」とメッセージがでるように設定したのですが、表示されずそのままウィンドウが閉じてしまいます。保存ボタンをクリックした場合のみレコードを登録できるようにしたいです。
サブフォームなしのフォームで同じように設定したところうまくできましたが、今回のようにサブフォームありのフォームはできないのでしょうか。
アドバイスをいただきたいのでよろしくお願いします。
設定内容は以下の通りになります。

フォーム名:F_運転日報入力
サブフォーム名:F_運転日報入力のサブフォーム

フォームの設定
「読み込み時」
レコードの移動 F_運転日報入力
一時変数の設定 名前:onSave 式:False

「更新前処理」
If [TempVars]![onSave]=False Then
If MsgBox("保存しますか?",4,"確認")=7 Then
イベントの取り消し
If文の最後
一時変数の設定 名前:onSave 式:False
If文の最後

「閉じるとき」
一時変数の削除 名前onSave

ボタンの設定
「戻る」
If [Dirty]=True Then
メニューコマンドの実行 コマンド レコードを元に戻す
If文の最後

「登録」
一時変数の設定 名前 onSave 式=True
メニューコマンドの実行 コマンド レコードの保存
If MsgBox("登録完了!",0+64+0,"確認")=6 Then
If文の最後

「閉じる」
エラー時 移動先 次 マクロ名
メニューコマンドの実行 コマンド レコードの保存
If [MacroError]=0
ウィンドウを閉じる オブジェクトの種類 フォーム オブジェクト名 フォーム名入力 オブジェクトの保存 確認

作業手順としては以下の通りになります。
①サブフォームで運転記録の実績を入力
②登録ボタンをクリックしレコードの登録
③閉じるボタンをクリックしウィンドウを閉じる

実現したいこと

登録前に「閉じる」ボタンをクリックしてウィンドウを閉じようとすると「保存しますか?」と表示されるようにしたい。

発生している問題・エラーメッセージ

エラーメッセージは特に表示されません

該当のソースコード

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

サブフォームは表形式フォームということなので、複数レコードを表示していますよね。
ご希望の「登録ボタンをクリックされたときのみレコードを保存する」とは、1レコード単位ではなく、複数レコードを入力してから、登録ボタンをクリックしてテーブルに保存させたいということですか。

だとしたら、連結フォームではレコード移動するときにテーブル保存されるという仕様ですので、不可能です。
また、非連結フォームにしたら複数レコードを表示するのは不可能です。

マクロでするには難しいので、VBAが必須と考えた方いいでしょう。また、VBAで構築するにしてもそれなりのスキルが必要です。

方法としては、ソースのテーブルと同じ構造のワークテーブルを作成しておいて、サブフォームのレコードソースはこのワークテーブルにします。編集したいレコードをワークテーブルにコピーして、サブフォームで編集後、登録ボタンで、ワークテーブルの更新内容を元のテーブルに反映させるという処理を自身で作成する必要があります。

投稿2022/11/16 11:18

編集2022/11/16 11:19
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0531

2022/11/17 01:41

いつもお世話になっております。 回答ありがとうございます。 入力は基本的に車を使用すればその月の分を入力するという仕様で、1レコード入力したら保存をかけて画面を閉じれるようにしたいです。1月に対して1レコードという考え方です。 VBAが必要なんですね。作成方法は理解できましたがかなり難易度が難しいと思われますので別の方法を考えた方がよさそうですね。
hatena19

2022/11/17 04:55

表形式ということは複数レコードが表示されていますよね。そこで1レコード入力したら保存をかけて画面を閉じるですか。 表形式フォームからレコードを選択して、単票フォームに表示して、そこで入力/保存するようにしたらどうですか。 どちらにしてもマクロでは難しいし、回答がつきにくいと思います。私も含めて、ここの回答者はおそらくVBAメインで開発していると思いますので。
0531

2022/11/17 08:44

色々教えていただき助かります。 上記野内容を参考に作成したいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問