Access VBAの限界を突破する:OpenArgsのJSON化による疎結合な画面設計の極致
Access開発において、画面遷移時のパラメータ受け渡しは長年の呪縛だ。多くのエンジニアが「グローバル変数」という名の劇薬に頼り、または「隠しテキストボックス」という場当たり的な実装で設計を汚染している。
もし君が、システムの堅牢性を維持しつつ、モダンなデータ構造をAccessに持ち込みたいと願うなら、「OpenArgsのJSON化」という選択肢を今すぐ採用すべきだ。これは単なる小手先のテクニックではない。画面間の依存関係を極限まで排除し、保守性を最大化するためのアーキテクチャである。
—
なぜ「文字列の連結」ではいけないのか
`OpenArgs`に「ID=123,Mode=Edit,User=Admin」のように独自ルールで文字列を連結するのはやめろ。区切り文字の重複やパース処理の複雑化は、未来の自分がデバッグで血を流す原因となる。
我々が求めるのは、型安全に近い柔軟性と、拡張性だ。JSONを用いることで、パラメータの階層構造を維持し、将来的な機能拡張にもコードの改変を最小限に抑えることができる。
—
JSON処理の核心:VBAでのシリアライズ・デシリアライズ
VBAには標準でJSONパーサーが存在しない。そのため、軽量かつ高速な`ScriptControl`(あるいは`MSScriptControl`)をラップしたクラスを設計するのが定石だ。
実装の戦略
1. Windows Script Componentの活用: `ScriptControl`を使用して、JScriptのJSON.stringify/parseを呼び出す。
2. オブジェクトの寿命管理: `ScriptControl`はメモリリークを起こしやすい。必ずクラスの`Class_Terminate`で明示的に解放し、参照カウントをゼロにする。
‘ JSON操作専用クラス: clsJsonHandler
Option Compare Database
Option Explicit
Private sc As Object
Private Sub Class_Initialize()
‘ MSScriptControl.ScriptControlを利用してJSONを処理
Set sc = CreateObject(“MSScriptControl.ScriptControl”)
sc.Language = “JScript”
End Sub
Public Function Parse(ByVal jsonString As String) As Object
‘ JSON文字列をオブジェクトに変換
Set Parse = sc.Eval(“(” + jsonString + “)”)
End Function
Public Function Stringify(ByVal obj As Object) As String
‘ オブジェクトをJSON文字列に変換
Stringify = sc.CodeObject.JSON.stringify(obj)
End Function
Private Sub Class_Terminate()
‘ メモリリークを防止するため、明示的に解放
Set sc = Nothing
End Sub
—
実践:画面遷移時のアーキテクチャ
呼び出し元(親フォーム)でデータを構築し、呼び出し先(子フォーム)で受け取る。このとき、子フォーム側では「パラメータが存在しない場合」を想定したデフォルト値の実装が必須だ。
親フォーム:パラメータの構築
‘ 親フォーム側: 子フォームを開く際の処理
Dim json As String
‘ JSON形式で複数の引数をパッケージング
json = “{“”TargetID””: 1001, “”Mode””: “”Edit””, “”ReadOnly””: false}”
DoCmd.OpenForm “frmEditDetail”, OpenArgs:=json
子フォーム:パラメータの解析と適用
‘ 子フォーム側: Form_Openイベント
Private Sub Form_Open(Cancel As Integer)
If IsNull(Me.OpenArgs) Then Exit Sub
Dim jsonH As New clsJsonHandler
Dim params As Object
On Error Resume Next
Set params = jsonH.Parse(Me.OpenArgs)
‘ プロパティへの直接代入はせず、バリデーションを経由させる
If Not params Is Nothing Then
Me.txtTargetID = params.TargetID
Me.Mode = params.Mode
Me.AllowEdits = Not params.ReadOnly
End If
Set jsonH = Nothing
End Sub
—
伝説のエンジニアからの忠告:パフォーマンスとメモリの最適化
Accessというレガシー環境でこの手法を導入する際、以下の3点は心に刻んでおけ。
1. 参照の破壊: `ScriptControl`を大量にインスタンス化してはならない。画面遷移が頻発するシステムでは、JSON処理クラスをシングルトンパターンで実装し、アプリケーション全体で共有せよ。
2. メモリの明示的解放: VBAのガベージコレクションは信用に値しない。`Set Nothing`は儀式ではなく、生存戦略だ。特にオブジェクトをJSONでやり取りする際は、循環参照が発生しないよう注意を払え。
3. レガシー環境の罠: Windows 10/11環境では`MSScriptControl`が制限されることがある。その場合は、`VBJSON`のような純粋なVBA実装のライブラリに切り替えるか、VBAから直接PowerShellの`ConvertFrom-Json`をパイプ経由で叩くという「禁じ手」も視野に入れろ。
結論
AccessはGUIフロントエンドとしてまだ死んではいない。しかし、そのコードの書き方はアップデートする必要がある。`OpenArgs`のJSON化は、複雑化する業務ロジックをスマートに制御するための最初の一歩だ。
技術は常に「動く」ことが前提だが、真のエンジニアはその先にある「保守される」未来までコードに刻み込む。君が書くその一行が、数年後の開発者を救うことを忘れるな。
