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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

ポップアップ

一般的に、ポップアップは、ウィンドウやアプリケーションに上に浮かぶUIエレメントを指します。

Q&A

解決済

1回答

1173閲覧

Access ダイアログボックス

access

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

ポップアップ

一般的に、ポップアップは、ウィンドウやアプリケーションに上に浮かぶUIエレメントを指します。

0グッド

0クリップ

投稿2020/07/05 12:05

Access について質問です。
以下のようなフォームを作成してます。

●フォームA
テキストボックス1、ボタン1
ボタン1を押下すると、テキストボックス1へ入力した値をpublic変数s_codeへ代入し、
フォームBを開き、フォームAを閉じる。

●フォームB
・テキストボックス1~5
テーブルAの変数s_codeに合致するレコードの各フィールドの値を
テキストボックス1~5へ表示(フォームBアクティブ時のイベントとして)
・ボタン1
フォームCを開く。

●フォームC
・ボタン1
テーブルAの変数s_codeに合致するレコードの各フィールドの値を書き換える。
フォームCを閉じる

【 質問 】
フォームCでボタン1を押下したら、フォームBのテキストボックス1~5はすぐ書き換わるようになっておりましたが、フォームB又はフォームCを「ポップアップ」に設定すると書き換わらなくなりました(テーブルのデータは書き換わっています)

【 調べたこと 】
フォームをダイアログやポップアップに設定するとアクティブイベントにひっかからなくなるようです。ダイアログやポップアップで、フォームCからフォームBへ戻ったときのイベントとしては、どのようなイベントにすると良いでしょうか。
結構いろいろ試したのですが、どのイベントにひっかからず・・・

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

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

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

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

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

guest

回答1

0

ベストアンサー

タイトルと質問内容から、フォームC をダイアログボックス的な仕様にしたいということと推測しました。
具体的には下記のような仕様。

フォームBで該当データを表示させる(閲覧)
ボタン1でフォームCを呼び出して、そこで該当データを更新する。
フォームCを閉じると、フォームBは更新が反映されている。

一般的にダイアログボックスを開いているときはそれ以外での操作はできないようになります。
(InputBox, Msgbox, ファイル選択ダイアログなど)

現状の問題点は、「ポップアップ」に設定するとアクティブイベントが発生しないというという点ですね(これはAccessの仕様のようです。)

あと「ポップアップ」を設定するだけでは、他のフォームの操作ができてしまうというのも問題だと思います。

フォームCを開いている間にフォームBでデータ操作したり、閉じたりしたすると、いろいろ複雑になりバグの元になります。

自分ならフォームBのボタン1のクリック時のイベントプロシージャを下記のようなコードにします。

vba

1Private Sub ShowDate() 2 'テーブルAの変数s_codeに合致するレコードの各フィールドの値を 3 'テキストボックス1~5へ表示するコード 4End Sub 5 6Private Sub Form_Load() 7 Call ShowDate 8End Sub 9 10Private Sub ボタン1_Click() 11 DoCmd.OpenForm "フォームC", WindowMode:=acDialog 'ダイアログモードで開く 12 Call ShowDate 13End Sub

ダイアログモード(WindowMode:=acDialog)で開くと、フォームはポップアップかつ他のオブジェクトは操作できない状態で開く。さらに、開いたフォームが閉じるまで、次のコードは実行されない。というダイアログボックスと同様の仕様になります。


質問内容とはずれますが、

ボタン1を押下すると、テキストボックス1へ入力した値をpublic変数s_codeへ代入し、

フォームBを開き、フォームAを閉じる。

public変数は、複雑なシステムになってくると想定外に書き変わっていたりとかのバグの元になるので、できる限り使用しないというのが定説です。

OpenFormメソッドには、OpenArgs引数という値を渡すことのできる引数がありますので、それを利用するのが得策だと思います。

フォームA

vba

1Private Sub ボタン1_Click() 2 DoCmd.OpenForm "フォームB", OpenArgs:=Me.テキストボックス1.Value 3 DoCmd.Close acForm, Me.Name 4End Sub

フォームB

vba

1Private s_code 2 3Private Sub ShowDate() 4 'テーブルAの変数s_codeに合致するレコードの各フィールドの値を 5 'テキストボックス1~5へ表示するコード 6End Sub 7 8'フォームの読み込み時 9Private Sub Form_Load() 10 s_code = Me.OpenArgs 11 Call ShowDate 12End Sub

投稿2020/07/05 13:17

編集2020/07/05 13:37
hatena19

総合スコア33699

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

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

access

2020/07/07 10:02

お返事遅くなり失礼しました。 おっしゃるとおりにモジュールを分けましたら 簡単に実現できました。 Private Sub ShowDate() 'テーブルAの変数s_codeに合致するレコードの各フィールドの値を 'テキストボックス1~5へ表示するコード End Sub Public変数についてもアドバイス有難うございます。 openformにOpenArgsなんていう引数があったのですね。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問