【入門編】フォームのOpenArgsにJSON文字列を渡して、画面間の複雑なパラメータ制御を一括管理する – Access VBA解析バイブル

スポンサーリンク

Accessの「OpenArgs」をJSONで操る:画面遷移を劇的にスマートにする極意

こんにちは。Access開発の深淵へようこそ。
現場で「画面から画面へ、たくさんの条件を渡したいのに、引数は一つしか使えない……どうしよう?」と悩んだことはありませんか?

多くの初心者は、グローバル変数(Public変数)を乱用しがちです。しかし、それは「メモリの爆弾」をあちこちに仕掛けるようなもの。開発が大きくなればなるほど、どこで値が書き換わったのか分からなくなり、デバッグ地獄に直面します。

今回は、そんな制約を鮮やかに突破する「OpenArgsにJSONを詰め込む」というプロのテクニックを伝授します。これさえマスターすれば、あなたのAccess開発は一気に「設計者」の領域へ足を踏み入れることができますよ。

1. なぜ「OpenArgs」が重要なのか?

Accessの `DoCmd.OpenForm` メソッドには、`OpenArgs` という引数があります。これは「フォームを開くときに、そのフォームへ何か秘密のメモを渡す」ための場所です。

しかし、このメモは「ただの文字列」という制約があります。
「顧客ID」も「検索モード」も「初期フィルター」も渡したいのに、文字列一つでは限界がある……そう思うでしょう。そこで、JSON形式の出番です。

2. 実装のステップ:JSONで包んで運ぶ

VBA単体ではJSONを解釈できませんが、文字列として組み立てることは簡単です。

ステップ①:送り側(親画面)での組み立て

まずは、渡したい情報をJSON風の文字列に整形します。

‘ 親フォーム:ボタンクリックイベント
Private Sub cmdOpenDetail_Click()
Dim jsonArgs As String

‘ 渡したい情報を{“キー”:”値”}の形式で文字列にする
jsonArgs = “{“”CustomerID””:101, “”Mode””:””Edit””, “”AutoSave””:true}”

‘ OpenArgsにJSON文字列を乗せてフォームを開く
DoCmd.OpenForm “frmDetail”, , , , , , jsonArgs
End Sub

ステップ②:受け取り側(子画面)での解析

受け取った文字列から、必要な値を取り出します。ここではシンプルに `Split` を使って切り出す手法を紹介します。

‘ 子フォーム:開く時のイベント
Private Sub Form_Open(Cancel As Integer)
Dim rawArgs As String
rawArgs = Me.OpenArgs

‘ 簡易的な解析:値を取り出す
‘ 実際には正規表現や専用クラスを使うとより強固になります
If Len(rawArgs) > 0 Then
‘ ここでは「CustomerID」を探す処理例
‘ ※簡易実装のため、実務では文字列操作関数を駆使してください
MsgBox “渡されたJSONデータ: ” & rawArgs

‘ 応用:ここで「Editモード」なら特定のコントロールをロックする等の制御が可能
If InStr(rawArgs, “””Mode””:””Edit”””) > 0 Then
Me.txtCustomerName.Locked = False
End If
End If
End Sub

3. なぜこれが「プロの設計」なのか?

この手法には、単なる小手先のテクニック以上のメリットがあります。

1. 疎結合(Loosely Coupled)の実現:
親フォームと子フォームがグローバル変数という「共有領域」に依存しません。必要な情報はすべて「箱(OpenArgs)」に入れて渡す。これだけで、コードの独立性が格段に上がります。
2. 拡張性:
「やっぱり日付の条件も追加したい」となったとき、JSONならキーと値を追加するだけ。関数や変数を増やす必要はありません。
3. デバッグの容易さ:
`Debug.Print Me.OpenArgs` と一行書くだけで、その画面が「どんな意図で開かれたのか」がログとして一目瞭然です。

4. 陥りやすいエラーと対策

初学者がよくやるミスは、「JSON文字列内のダブルクォーテーションの扱い」です。

  • エラー: `”{ “ID”: 1 }”` のように書くと、VBAは文字列の区切りと勘違いして混乱します。
  • 対策: VBAの文字列内でダブルクォーテーションを表現したい場合は、`””` と2つ重ねてください。先ほどのコード例でも `””CustomerID””` としているのは、これが理由です。

最後に:エンジニアとして成長するために

「マクロの記録」を卒業し、自分の手でロジックを組むようになると、「いかにコードを汚さず、意図を明確にするか」という視点が生まれます。

今回紹介したOpenArgsの活用は、まさにその第一歩です。
「引数は一つしかない」という制約を「工夫すればいくらでも詰め込める」と捉える。このポジティブなハック精神こそが、優れたエンジニアの証です。

ここをクリアすれば、Access VBAの画面設計はもう怖くありません。さあ、次はどんな複雑な画面遷移を作ってみましょうか?あなたの挑戦を応援していますよ!

タイトルとURLをコピーしました