モーダルフォームへのパラメータの渡し方(OpenArgs、呼び出し元のコントロール指定、一時変数)
Accessであるフォームから別のフォームをモーダルで呼び出す場合、呼び出し元のフォームからモーダルフォームへコントロールの値など、パラメータを渡したいことが多々あります。
Accessでパラメータを渡すにはいくつか方法があるので、ここではそれぞれの方法について記します。
目次
- OpenArgsの利用
- 呼び出し元のフォームを指定してコントロールの設定値を読み取る
- 一時変数の利用
- どれを利用するのがいいかの個人的な見解
OpenArgsの利用
「DoCmd.OpenForm」メソッドでフォームを開く場合、起動時にパラメータを設定することが可能です。
設定の仕方は以下の通り。
DoCmd.OpenForm "商品登録画面", acNormal, , , , acDialog, "商品ID"
上記の場合、最後の引数である「商品ID」というのがパラメータになります。
これを呼び出し側で受け取るには、以下のようにします。
Private Sub Form_Load()
Dim strProductId As String
If Not IsNull(Me.OpenArgs) Then
strProductId = Me.OpenArgs
Debug.Print strProductId
End If
End Sub
通常はこれで問題ありませんが、この方法での渡し方の弱点は1つしかパラメータを渡せない点で、パラメータに配列やオブジェクトを指定することはできず、複数のパラメータを渡そうとしたらカンマ区切りの文字列といった形式で渡す必要があります。
呼び出し元のフォームを指定してコントロールの設定値を読み取る
呼び出し元のフォームが1つしかないような場合は、直接、フォーム内のコントロールを読み取ることができます。
モーダルで呼び出されたフォームから、呼び出し元のコントロール「txt商品ID」を読み取るコードは以下の通りです。
Private Sub Form_Load()
Dim strProductId As String
strProductId = [Forms]![商品検索画面]![txt商品ID].value
Debug.Print strProductId
End Sub
Parentで呼び出し元のフォームを指定できたら良かったですが、それは出来ないようなので、呼び出し元のフォームが1つだけの場合にしか、上記のやり方は使えません。
一時変数の利用
複数のフォームから呼び出されるようなフォームで、起動時のパラメータが2つ以上必要な場合、一時変数を使います。
一時変数の設定は以下の通り。
TempVars("tmp商品登録画面_商品ID") = [txt商品ID].value
TempVars("tmp商品登録画面_商品名") = [txt商品名].value
設定した一時変数を呼び出されたフォームで読み取ります。
Private Sub Form_Load()
Dim strProductId As String
Dim strProductName As String
strProductId = TempVars("tmp商品登録画面_商品ID")
strProductName = TempVars("tmp商品登録画面_商品名")
'TempVars.RemoveAll
TempVars.Remove ("tmp商品登録画面_商品ID")
TempVars.Remove ("tmp商品登録画面_商品名")
Debug.Print strProductId
Debug.Print strProductName
End Sub
便利な一時変数ですが、一度設定した変数はなにもしなければアプリが終了するまで残ってしまい、かつ、255個までという制限があるので、使い終わったら削除するようにします。
削除は一つ一つ変数名を指定していますが、まとめて削除していいなら「TempVars.RemoveAll」を使うと楽です。
どれを利用するのがいいかの個人的な見解
個人的には一時変数を使うのが、複数のパラメータの受け渡しに使えて、フォーム同士の結合も弱く、255個という制限があるにしても普通はそんなに使わないので、いいと思います。
使った後に削除することを忘れていなければ、制限を超えることはまずないでしょう。