#652 ダイアログでの操作結果を呼び出し元フォームに返す方法(1) フォーム、VBA

よくある画面のフローとして、画面のボタンをクリックしたらまずダイアログを表示し、そこでの入力値や選択肢に応じてそのあとの処理を切り替えるということがよくあります。

その際、一連の後処理もダイアログ側のモジュールに記述する方法がシンプルなのですが、一方で、呼び出し元フォームとダイアログ側とでデータをやり取りして、ダイアログ側の操作結果を呼び出し元で取得、呼び出し元のモジュールで後処理を行うということもあります。つまりダイアログは単に処理内容などを選択するためだけに使う方法です。

そのようなケースにおいて、ダイアログでどのような操作が行われたか、たとえばテキストボックスにどのような値が入力されたか、オプショングループでどのオプションボタンが選択されたか、あるいは実行を指示する[OK]ボタンがクリックされたのか中止を指示する[キャンセル]ボタンがクリックされたのかなどの操作結果を呼び出し元フォームに返す方法を説明します。

ここでは、『ダイアログ側のフォームモジュールの「Declarationsセクションで宣言されたPublic変数」を使う方法』について説明します。


まず、例として次のような2つのフォームを使うものとします。

■呼び出し元のフォームデザイン


■ダイアログのフォームデザイン

  1. 呼び出し元フォームでボタンをクリックしたらダイアログを表示します。
  2. ダイアログ側ではテキストボックスに数値を入力したあと[OK]ボタンをクリックするか、[キャンセル]ボタンをクリックします。
  3. ダイアログでの操作結果をテキストボックスに表示します。

一方、プログラムとしては、呼び出し元のフォームとダイアログのフォームのモジュールに次のようなコードを記述します。

■呼び出し元のフォームのモジュール

Private Sub cmdOpenDlg_Click()

  Const cstrDlgName As String = "ダイアログサンプル1"

  On Error GoTo Err_Handler

  'ダイアログを開く
  DoCmd.OpenForm cstrDlgName, , , , , acDialog

  'ダイアログでの操作を取得
  With Forms(cstrDlgName)
    If .pblnOKBtn Then
      '[OK]ボタンがクリックされたとき
      Me!txt操作結果 = "OKボタンがクリックされました!" & vbCrLf & _
                        "入力された値は " & .pvarInputData & " です。"
    Else
      '[キャンセル]ボタンがクリックされたとき
      Me!txt操作結果 = "キャンセルされました!"
    End If
  End With

Exit_Here:
  On Error Resume Next
  'ダイアログを閉じる
  DoCmd.Close acForm, cstrDlgName
  Exit Sub

Err_Handler:
  If Err.Number = 2450 Then
    'ダイアログが[×]ボタンで閉じられたとき
    Me!txt操作結果 = "ダイアログが[×]ボタンで閉じられました!"
  End If
  Resume Exit_Here

End Sub


■ダイアログのフォームのモジュール

Option Compare Database
Option Explicit

Public pvarInputData As Variant   '入力値を代入する変数
Public pblnOKBtn As Boolean       'OKが押されたかどうかのフラグ

Private Sub cmdOK_Click()
'[OK]ボタンクリック時

  '入力値を変数に保存
  pvarInputData = Me!txt入力値
  'OKボタンのフラグをON
  pblnOKBtn = True

  'このフォームを非表示にする
  Me.Visible = False

End Sub

Private Sub cmdCancel_Click()
'[キャンセル]ボタンクリック時

  'このフォームを非表示にする
  Me.Visible = False

End Sub


これらのプログラムの構造は次のようなイメージになっています。

  1. 呼び出し元では、引数に「acDialog」を指定することで”ダイアログサンプル1”フォームを”ダイアログ”として開きます。実行時、呼び出し元のプログラムはダイアログが閉じられるまでここで一時停止します。

  2. ダイアログ側でデータ入力やボタン操作が行われたら、その結果をダイアログ側のDeclarationsセクションの変数に代入します。これらはPublicで宣言することで、他のフォームモジュールからも参照することができます。

  3. ダイアログ側では[OK]か[キャンセル]ボタンがクリックされたらこのフォームを”非表示”にします。ここではフォームを”閉じない”ことがポイントです。閉じてしまうとダイアログのモジュールの変数が参照できなくなってしまうからです。

  4. ダイアログが非表示状態になることで、いったん停止した呼び出し元のプログラムが再開されます。

  5. 呼び出し元から”ダイアログ側のPublic変数”を参照することで、ダイアログでの入力・選択値やボタン操作結果などを取得し、それに応じて後処理を実行します。

  6. 最後に、非表示になっていたダイアログを正式に閉じます。

※なお、ダイアログのウィンドウの右上の[×](閉じる)ボタンがクリックされた場合、ダイアログは非表示にはならずそのまま閉じられてしまいます。その場合、「With Forms(cstrDlgName)」の部分で開いていないフォームを参照しようとするため、エラーが発生します。そのようなときに備えて呼び出し元ではエラートラップを行い、そのような操作が行われたときの処理を行っています。


実行例:

■数値を入力して[OK]ボタンをクリックしたとき






■[キャンセル]ボタンをクリックしたとき


■ダイアログが[×]ボタンで閉じられたとき



関連Tips:
ダイアログでの操作結果を呼び出し元フォームに返す方法(2)
ダイアログでの操作結果を呼び出し元フォームに返す方法(3)
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved