Accessの鎖を解き放つ:OpenArgsとJSONで実現する「疎結合」な画面遷移アーキテクチャ
Access開発の現場で、長年我々を悩ませてきた「引き数の呪縛」がある。`DoCmd.OpenForm` メソッド。これに用意されている `OpenArgs` 引数は、残念ながら `Variant` 型の単一値しか受け付けない。
多くのエンジニアは、この制限を回避するためにグローバル変数に頼り、メモリを汚染し、再入可能性(Reentrancy)を破壊する。あるいは、コンマ区切りの文字列をパースする泥臭いコードを量産し、将来の仕様変更で自らの首を絞める。
今日のテーマは、この制約を「JSON」という汎用的なインターフェースで突破し、Accessのフォームを、独立性の高い「コンポーネント」へと昇華させる手法だ。
—
なぜJSONなのか:アーキテクトの視点
フォーム間のデータ受け渡しにおいて、引数の型を固定することは設計上の「死」を意味する。JSONを利用するメリットは以下の3点に集約される。
1. スキーマの柔軟性: プロパティの追加が既存のコードを破壊しない。
2. 型安全性(擬似): パース後のオブジェクトは、任意の構造を持つことができる。
3. システム間連携: 将来的なWeb API連携を見据えた場合、JSONはそのままペイロードとして再利用可能である。
実装:ScriptControlによる軽量パース
Access VBAでJSONを扱う際、外部ライブラリ(VBScript.RegExp等)に頼るのも手だが、最もシンプルかつ軽量なのは `MSScriptControl.ScriptControl` を利用してJSON.parseを叩く方法だ。
1. JSONパースエンジンの構築
まずは、JSON文字列をオブジェクトに変換するラッパーを用意する。
‘ 参照設定: Microsoft Script Control 1.0
Public Function ParseJson(ByVal jsonString As String) As Object
Dim sc As Object
Set sc = CreateObject(“MSScriptControl.ScriptControl”)
sc.Language = “JScript”
‘ JSON.parseを呼び出すための評価式
Set ParseJson = sc.Eval(“(” & jsonString & “)”)
‘ 明示的な解放: オブジェクトのライフサイクルを制御する
Set sc = Nothing
End Function
2. フォーム呼び出し側:送信の作法
呼び出し側では、Dictionaryライクにパラメータを構築し、JSON化して渡す。
Public Sub OpenDetailForm(ByVal targetID As Long, ByVal mode As String)
‘ JSON文字列を構築
Dim jsonArgs As String
jsonArgs = “{“”id””: ” & targetID & “, “”mode””: “”” & mode & “””, “”timestamp””: ” & CDbl(Now) & “}”
‘ OpenArgsに詰め込む
DoCmd.OpenForm “frmDetail”, , , , , , jsonArgs
End Sub
3. 受信側:初期化の最適化
`Form_Load` イベントでこれを受け取り、適切に処理する。ここでのポイントは、パース後のオブジェクトをフォームのプライベート変数として保持しないことだ。必要な情報を抽出したら直ちにメモリから解放する。
Private Sub Form_Load()
If IsNull(Me.OpenArgs) Then Exit Sub
Dim params As Object
Set params = ParseJson(Me.OpenArgs)
‘ プロパティの抽出
Me.txtTargetID.Value = params.id
Me.Caption = “編集モード: ” & params.mode
‘ ライフサイクル管理:paramsを明示的に破棄
Set params = Nothing
End Sub
—
シニアエンジニアが留意すべき「極限の最適化」
この手法を採用する上で、単なるコードのコピペでは終わらせないための「プロの視点」を提示する。
メモリと参照の管理
`MSScriptControl` は強力だが、過度なインスタンス生成はメモリリークの原因となる。大量の画面遷移が発生するシステムでは、`ScriptControl` をグローバルなクラスモジュールでシングルトンとして管理するか、必要最小限の生存期間に抑える必要がある。
異常系への備え:バリデーション
`OpenArgs` はあくまで「外部からの入力」である。JSONのパースエラーは `Err.Number` をトリガーするため、必ず `On Error GoTo` で囲い、不正な文字列が渡された場合でもシステムがクラッシュしない「堅牢性」を確保せよ。
Windows APIによる「フォームの焼き直し」
もし、このJSONに含まれるデータが巨大で、かつ画面の描画を高速化したい場合、`LockWindowUpdate` (user32.dll) を活用せよ。パース中にフォームの再描画を一時的に停止することで、チラつきのない洗練されたUI体験を提供できる。
—
結論:技術は「疎結合」のためにある
Access VBAはレガシーと言われることもある。しかし、アーキテクチャ次第で、現代的なWebシステムと同等の柔軟な疎結合性を実現できる。
JSONでOpenArgsを管理することは、単なるテクニックではない。それは「データ」と「処理」を切り離し、再利用可能なコンポーネントを構築するという、システム開発の根本原理をAccessで体現することに他ならない。
君のコードが、次に触る誰かの、そして未来の君自身の時間を奪わないことを願っている。コードは、常に美しくあれ。
