#648 フォームに複数のOpenArgsを渡すには? フォーム、VBA

フォームのボタンをクリックしたときなどに、別のフォームを開いたりレポートを開いたりする際、次のようなコードを実行することによって、それらのフォームやレポートに引数を渡すことができます。

DoCmd.OpenForm "フォーム2", , , , , , "あいうえお"

ここでは、DoCmdオブジェクトのOpenFormメソッドにおいて、7番目の引数に「あいうえお」と指定することでその文字列をフォーム2に渡しています。

一方、それを受け取った側のフォームやレポートでは、次のようにフォームなどの「OpenArgs」プロパティの値を見ることでそれを扱うことができます。

Private Sub Form_Load()

  MsgBox Me.OpenArgs

End Sub


しかし、このOpenArgsの引数はひとつだけです。そのままでは複数の情報を渡すことはできません。

そのようなとき、たとえば「,(カンマ)」で区切られた複数の情報をひとつの文字列に組み立てることで、OpenArgsひとつに複数の情報を指定することができます。

またそれを受け取った側のフォームでは、
  • OpenArgsプロパティにはカンマ区切りで複数の値が格納されている
  • そこに格納されている値の数はあらかじめルールとして決まっている
  • さらにその順番もルールとして決まっている
という前提で、カンマごとにそれぞれのデータを分解して取り出すことで、各値を別個のものとして取り扱うことができます。
もちろん、呼び出す側と受け取る側でルールが決められていれば、コロン区切り、セミコロン区切り、Tab区切り、何でもかまいません。
  ※データ自体にそれらの区切り文字が含まれていないことが前提となります。


次の例では、5つのテキストボックスに入力されているデータをひとつのOpenArgsにまとめて別のフォームに渡しています。
また受け取り側のフォームでは、OpenArgsを分解してそれぞれを同様の5つのテキストボックスに代入し、画面表示しています。
  ※いずれのフォームもテキストボックスの名前は「データ1、データ2......、データ5」です。

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

Private Sub cmd別フォーム_Click()
'[別のフォームを開く]ボタンクリック時

  Dim strOpenArgs As String

  '別フォームに渡す引数を組み立てる
  With Me
    strOpenArgs = !データ1 & "," & !データ2 & "," & !データ3 & "," & !データ4 & "," & !データ5
  End With

  '別のフォームをダイアログで開く
  DoCmd.OpenForm "フォーム1", , , , , acDialog, strOpenArgs

End Sub

■受け取り側フォームのモジュール

Private Sub Form_Load()
'フォーム読み込み時

  Dim avarOpenArgs As Variant
  Dim iintLoop As Integer

  'OpenArgsをカンマごとに分解して配列に格納する
  avarOpenArgs = Split(Nz(Me.OpenArgs), ",")

  '配列の要素ごとにテキストボックスに代入する
  For iintLoop = 0 To UBound(avarOpenArgs)
    Me("データ" & (iintLoop + 1)) = avarOpenArgs(iintLoop)
  Next iintLoop

End Sub

※Split関数は、第1引数の値を、第2引数に指定された文字で区切って、分解結果を配列として返す関数です。
※Split関数の第1引数をNz関数に通しているのは、もしOpenArgsが空だった場合のエラーを回避するためです。
※実際にはどのようなデータが渡されるか分かりませんので、テキストボックスに代入する前にいろいろなチェックや置き換え、データ型変換などが要るかもしれません。


実行例:


| Index | Prev | Next |



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