Access

【Access】OpenArgsでフォームを開く引数に複数の値を渡したい

フォーム引数渡し
記事内に商品プロモーションを含む場合があります

Access VBAではDocmd.OpenFormでフォームを開く際、引数として開く側のフォームに値を渡すことができます。

連続した処理をしたい場合、主キーを渡したり呼び出し側で入力した値を渡したりなど活用する機会は多いかと思います。

今回は複数の値を渡したかったので、いっそ配列で渡せないかと思ったのですが無理でしたね(笑)

引数の形式は文字列型です。

ただし、文字列を特定の文字区切りで作成することで開いた先のフォームで配列として展開して使えます。

今回はOpenArgsの使用方法について解説します。

DoCmd.OpenForm

まずはフォームを開く基本のコードです。

基本の構文

DoCmd.OpenForm フォーム名, ビュー, フィルター名, WHERE句, データモード, ウィンドウモード, 引数

パラメータ

パラメータの定義は以下の通りです。

フォーム名 フォーム名を文字列で指定します。

例:”Formテスト”:ダブルクォート囲み

ビュー 以下の定数のいずれを指定。指定しない場合はacNormalが適用されます。

  • acNormal(デフォルト):フォームビュー
  • acDesign : デザインビュー
  • acPreview :印刷プレビュー
  • acFormDS: データシート ビュー
  • acFormPivotChart:ピボットグラフ ビュー
  • acFormPivotTable:ピボットテーブル ビュー
  • acLayout:レイアウトビュー
フィルター名 カレントデータベースのクエリーの名前 ← 使ったことないです
WHERE句 WHERE句を指定します。WHEREの記述は不要です。

例:”商品名 LIKE ‘りんご*'”

データモード フォームを開いたときのデータのモードを以下の定数から指定します。

  • acFormAdd:レコード追加モード
  • acFormEdit:既存のレコード編集・レコードを追加モード
  • acFormPropertySettings:(デフォルト)フォームのプロパティ変更モード
  • acFormReadOnly: レコード参照のみモード
ウィンドウモード フォームを開くときのウィンドウのモードを以下の定数から指定します。

  • acDialog:作業ウィンドウ固定・ポップアップモード
  • acHidden:非表示モード
  • acIcon:最小化モード
  • acWindowNormal:(デフォルト) フォームのプロパティで設定されたモード
引数 文字列式で指定。

今回設定するのはパラメータ「引数」です。

引数渡しの利用方法

呼び出し側のフォーム

DoCmd.OpenForm “Frm商品マスタ”, , , , , , “りんご”

コマンドボタンのクリックイベントやメッセージボックスのOKボタンクリックなど、フォームを開きたいイベントにOpenFormメソッドを記述します。

呼び出されたフォーム

Private Sub Form_Open(Cancel As Integer)

    '引数の有無によってメッセージを出し分ける
    If IsNull(Me.OpenArgs) Then
        MsgBox "引数なし"
    Else
        MsgBox Me.OpenArgs
    End If
    
End Sub

呼び出されたフォーム側ではForm_OpenイベントにてOpenArgsを取得し何らかの処理を実行します。

サンプルではメッセージボックスに引数の文字列を出力しています。

引数なしで起動される場合もあるときは、IsNull()関数で引数があるか否か事前にチェックします。

複数の値を渡す場合の取得方法

複数の値を引数として渡したい場合は各値を固定の文字で連結してOpenArgsに渡します。

呼び出し側のフォーム

DoCmd.OpenForm “Frm商品マスタ”, , , , , , “りんご,みかん,ぶどう”

引数にりんご・みかん・ぶどうの3つの文字列を渡したい場合、カンマ(,)などの区切りの記号で各文字列を結合した文字列を渡します。

呼び出されたフォーム

Private Sub Form_Open(Cancel As Integer)
    Dim strFruit    As Variant
    Dim strMsg      As String

    '引数がNULLでなければテキストボックスにそれぞれの文字列をセットする
    If not IsNull(Me.OpenArgs) Then
        'カンマ区切りで文字を分割し配列にセット
        strFruit = Split(Me.OpenArgs, ",", , vbTextCompare)
        
        '各テキストボックスに値をセット
        Me.txt果物1 = strFruit(0)
        Me.txt果物2 = strFruit(1)
        Me.txt果物3 = strFruit(2)
    End If
    
End Sub

呼び出されたフォーム側ではForm_Openイベントにて取得したOpenArgsをSplit関数を使うことで区切り文字で分割し配列として取得します。

サンプルでは取得した配列の要素を1つずつテキストボックスに代入しています。

Split関数

基本の構文

Split(分割したい元の文字列, 区切り文字, 配列数,比較モード)

 パラメータ

パラメータの定義は以下の通りです。
分割したい元の文字列 文字列と区切り文字を含む文字列を必ず指定します。

空文字(長さ0の文字列)を渡した場合、Split関数は空の配列を返します。

区切り文字 区切り文字を指定します。カンマ(”,”)やダブルコロン(“:”)などの区切り文字を指定します。

省略した場合、区切り文字としてスペース(” “)が使用されます。

配列数 返す配列の要素数を指定します。

-1 を指定した場合はすべての文字列を含んだ配列を返します。(省略した場合も同様)

比較モード 比較モードを以下の定数から指定します。

  • vbBinaryCompare:バイナリ モード
  • vbTextCompare:テキストモード
フォームの位置
Accessのフォームの位置/サイズ固定方法MoveSizeメソッドを使ってフォームの位置やサイズを変更します。最後にフォームを閉じた位置・サイズを保存しておいて次回同じ場所にフォームを開くサンプルプログラムをご紹介しています。...
ABOUT ME
アズビーパートナーズ
プログラマー→社内SE→SIerのお仕事をしています。 メーカー勤務を経て、中小企業の社内SE、フリーランスなど様々な形態で働いてきました。 業務上生まれた困った…を解決してきたTipsを備忘録も兼ねて公開しています。 困っている誰かのお役に立てれば幸いです。