モーダルフォームから呼び出し元のフォームへ戻り値を渡す方法(プロパティ、プロシージャ、一時変数)
Accessであるフォームから別のフォームをモーダルで呼び出した後、今度は、モーダルフォームから戻り値を受け取りたい場合があります。
プロパティ(またはプロシージャ)を使った方法と、一時変数を使った方法があったのでメモしておきます。
目次
- プロパティ(またはプロシージャ)の利用
- 一時変数の利用
- どれを利用するのがいいかの個人的な見解
プロパティ(またはプロシージャ)の利用
プロパティを使って戻り値を取得する場合、まず呼び出し元のフォームに以下のような戻り値用のプロパティを用意します。(呼び出し元のフォームを「商品検索画面」、モーダルで開くフォームを「商品登録画面」とした場合)
Dim blnReturnValue As Boolean
Property Let ReturnValue(value As Boolean)
blnReturnValue = value
End Property
Property Get ReturnValue() As Boolean
ReturnValue = blnReturnValue
End Property
プロパティを用意したら、今度はこのプロパティに対して、モーダルフォーム側から値をセットします。
Private Sub btn閉じる_Click()
Form_商品検索画面.ReturnValue = True
DoCmd.Close acForm, "商品登録画面", acSaveNo
End Sub
あとはモーダルフォームを閉じた後の処理で、上記のプロパティの値を読み取ればOKです。
上記はプロパティを利用していますが、Public指定のプロシージャ(FunctionやSub)を呼び出すことも可能です。
この方法の弱点は呼び出し元のフォームを特定しないといけない点で、フォーム同士の結合度が強くなり、複数の画面から呼び出されるフォームには向いていません。
一時変数の利用
モーダルフォームを開く際のパラメータでも紹介しましたが、戻り値を渡す際にも一時変数を使うことができます。
モーダルフォーム側で一時変数の値を設定して、
Private Sub btn閉じる_Click()
TempVars("tmp商品登録画面_結果") = True
End Sub
呼び出し元でその一変数の内容を読み取るだけです。
Private Sub btn編集_Click()
DoCmd.OpenForm "商品登録画面", acNormal, , , , acDialog
Dim rtn As Boolean
rtn = TempVars("tmp商品登録画面_結果")
Debug.Print rtn
TempVars.Remove ("tmp商品登録画面_結果")
End Sub
簡単ですね。
どれを利用するのがいいかの個人的な見解
複数の画面で共有して使うようなフォームは一時変数で戻り値のやりとりを行い、特定の画面からしか呼び出されないフォームであれば、直接、呼び出し元フォームのプロパティやプロシージャを実行する方法でいいと思います。