【入門編】フォームのOpenArgsをJSON文字列で拡張する:画面間の複雑なデータ受け渡しをスマートに解決 – Access VBA解析バイブル

スポンサーリンク

Access VBAの限界を突破せよ:OpenArgsをJSONで拡張する「画面間連携」の極意

こんにちは。現場で泥臭く、しかし誰よりも美しくシステムを組み上げることを信条としているエンジニアです。

Accessでの開発、順調ですか?「フォームを開くときに、ちょっとしたフラグを渡したいだけなのに、グローバル変数がどんどん増えていく…」なんて悩みに直面しているなら、今日の記事はあなたのためのものです。

今回は、Accessの隠れた実力者`OpenArgs`を、現代的なJSON形式で使いこなすための極意を伝授します。これを知れば、あなたのコードは劇的にスッキリし、保守性が別次元へと進化します。

1. なぜ「OpenArgs」をJSON化するのか?

通常、`DoCmd.OpenForm`メソッドには、引数として文字列をひとつだけ渡せる`OpenArgs`という枠があります。

  • 素朴な使い方: `”Edit”` や `”New”` といった単一のキーワードを渡す。
  • 現場の現実: 実際は「編集モード」かつ「IDは123」かつ「戻り先のフォーム名はMenu」といった、複数の情報が必要になることが多い。

これを解決するために、「ID=123,Mode=Edit,Return=Menu」のような文字列を自作して分解するコードを書いていませんか? その場しのぎの分割処理は、バグの温床です。

そこでJSONです。構造化されたデータとしてパラメータを渡すことで、複雑な条件もたった一つの引数で、美しく管理できるようになります。

2. 実装の設計図:JSONでスマートに渡す

VBAには標準でJSONパーサーがありません。そのため、今回は`ScriptControl`(Microsoft Script Control 1.0)を活用して、JavaScriptのエンジンを借りる手法を紹介します。これが最もAccess環境で導入しやすい「賢い」方法です。

ステップ1:送信側のコード(呼び出し元)

フォームを開く直前、JSON文字列を生成して`OpenArgs`に放り込みます。

‘ 呼び出し元フォームのボタンクリックイベントなど
Private Sub btnOpenDetail_Click()
Dim jsonArgs As String

‘ JSON文字列を作成(※ダブルクォーテーションの扱いに注意)
jsonArgs = “{“”ID””: 123, “”Mode””: “”Edit””, “”User””: “”Admin””}”

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

ステップ2:受信側のコード(呼び出し先)

受け取った側では、ScriptControlを使ってJSONをオブジェクト化します。

‘ 呼び出し先フォームのLoadイベント
Private Sub Form_Load()
Dim sc As Object
Dim json As Object
Dim rawArgs As String

rawArgs = Me.OpenArgs

‘ OpenArgsが空でない場合のみ処理
If Len(rawArgs) > 0 Then
‘ ScriptControlのインスタンス化
Set sc = CreateObject(“ScriptControl”)
sc.Language = “JScript”

‘ JSONとして評価(eval)させる
Set json = sc.Eval(“(” & rawArgs & “)”)

‘ プロパティへアクセス
Debug.Print “ID: ” & json.ID
Debug.Print “Mode: ” & json.Mode

‘ ここでフォームの初期化処理を実行
Call InitializeForm(json)
End If
End Sub

3. 陥りやすいエラーと回避策

伝説的なエンジニアを目指すなら、エラーを「未然に防ぐ」視点が不可欠です。

  • ダブルクォーテーションの迷宮: VBAの文字列内で`”`を使いたい場合、`””`と二重に重ねる必要があります。JSONの構文とVBAの文字列定義が混ざるとカオスになります。
  • 対策: 複雑なJSONなら、関数化して文字列生成を切り出しましょう。
  • 空のOpenArgs: `OpenArgs`がNullの場合、そのまま処理すると実行時エラーになります。
  • 対策: 必ず `If Len(Me.OpenArgs & “”) > 0 Then` のように、Nullチェックを行ってください。
  • ScriptControlの制約: 64bit版Accessでは`ScriptControl`が利用できない場合があります。その場合は「JSON変換用の標準モジュール(GitHub等で公開されているもの)」をインポートするのが定石です。

4. 最後に:なぜこの手法が「強い」のか

グローバル変数は、プログラムの「どこからでも書き換えられる」という性質上、システムの複雑度を一気に跳ね上げます。一方で、`OpenArgs`によるデータ受け渡しは、「フォームの依存関係を明示化する」というオブジェクト指向の原則に近い考え方です。

JSON形式で渡すことで、「将来的にパラメータが増えても、コードの構造を変える必要がない」という柔軟性を手に入れることができます。

ここをクリアすれば、あなたのAccess開発は「マクロの延長」から「堅牢なソフトウェア開発」へと大きく歩を進めたことになります。

コードを書くときは、常に「次にこのコードを読む自分」を想像してください。その配慮こそが、プロフェッショナルへの第一歩です。また次回の講義でお会いしましょう。

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