【実務・中級編】【初心者】フォームのOpenArgsをJSON形式で拡張する:画面間データ受け渡しのスマートな設計 – Access VBA解析バイブル

スポンサーリンク

プロローグ:その「セミコロン区切り」が、あなたのシステムの寿命を縮めている

Access VBAエンジニア諸君。画面から画面へデータを引き継ぐ際、君たちはまだ `DoCmd.OpenForm` の `OpenArgs` に「ID;名前;区分」といった、独自のデリミタ(区切り文字)で固めた文字列を流し込んではいないだろうか?

もしそうなら、今すぐその設計を捨てろ。

なぜか。その設計は「データの整合性」と「拡張性」に対する敗北宣言だからだ。
データの中に偶然セミコロンが含まれた瞬間にパースは崩壊し、引数の順番を一つ間違えるだけで実行時エラーの迷宮に放り込まれる。そんな脆いコードは、プロフェッショナルの仕事とは呼べない。

現代の設計思想において、構造化データの受け渡しは JSON(JavaScript Object Notation) で行うのが標準だ。Access VBAという枯れた環境であっても、その恩恵を享受することは十分に可能であり、むしろAccessのような小規模〜中規模開発でこそ、その堅牢性は絶大な威力を発揮する。

今回は、`OpenArgs` をJSON形式で拡張し、スマートかつバグの起きない画面間連携を実現する「極限の設計パターン」を伝授しよう。

1. なぜ「JSON形式のOpenArgs」なのか

従来の `Split` 関数を使った文字列操作と比較して、JSON形式を採用するメリットは圧倒的だ。

1. キー指定によるアクセス: `args(“CustomerID”)` のように名前で値を取り出せる。引数の順番に依存しない。
2. データ型の維持: 数値、文字列、Boolean、さらにはネストされた構造まで、型情報を損なわずに伝達できる。
3. エスケープ処理の自動化: 文字列内にカンマやクォーテーションが含まれていても、パーサーが適切に処理するため、パースエラーが激減する。

2. 準備:VBA用JSONパーサーの導入

VBAには標準でJSON解析機能がない。ここで車輪の再発明をするのは時間の無駄だ。世界中のVBAエンジニアが信頼を寄せる [VBA-JSON](https://github.com/VBA-Tools/VBA-JSON) などのライブラリを利用するのが最短ルートだが、今回は「現場ですぐに使える」よう、標準的なクラスライブラリを利用した実装イメージを提示する。

※参照設定に「Microsoft Scripting Runtime」を追加しておくことを強く推奨する。辞書オブジェクト(Dictionary)はJSONとの親和性が極めて高い。

3. 実装ガイド:JSONを生成してフォームを開く

まずは、呼び出し側のコードだ。ここでは「取引先ID」「処理モード」「更新フラグ」という3つの異なる型のデータを一つのJSONにまとめて送信する。

【送信側】標準モジュール

Option Compare Database
Option Explicit

”’

”’ 詳細画面をJSONパラメータで起動する
”’

Public Sub OpenCustomerDetail(ByVal customerID As Long, ByVal editMode As String)
Dim args As New Scripting.Dictionary

‘ 1. 辞書オブジェクトにパラメータを格納
args.Add “CustomerID”, customerID
args.Add “ProcessMode”, editMode
args.Add “IsAdmin”, True
args.Add “Timestamp”, Now()

‘ 2. DictionaryをJSON文字列に変換
‘ ※ここではJsonConverter.ConvertToJson(args) を想定
Dim jsonString As String
jsonString = JsonConverter.ConvertToJson(args)

‘ 3. OpenArgsにJSONを載せてフォームを開く
DoCmd.OpenForm “frmCustomerDetail”, _
View:=acNormal, _
OpenArgs:=jsonString

‘ [注釈] CurrentDbやApplicationオブジェクトのライフサイクルを意識せよ。
‘ OpenArgsはフォームがロードされる際、メモリ上のプロパティとして確実に保持される。
End Sub

4. 実装ガイド:JSONを解析してデータを受け取る

次に、受け取り側のフォームだ。`Form_Open` イベントで、渡されたJSONを再び Dictionary オブジェクトに戻す。これにより、型安全で読みやすいコードが実現する。

【受信側】フォームモジュール(frmCustomerDetail)

Option Compare Database
Option Explicit

‘ フォームレベル変数でパラメータを保持(必要に応じて)
Private m_Args As Scripting.Dictionary

Private Sub Form_Open(Cancel As Integer)
On Error GoTo Err_Handler

‘ 1. OpenArgsが空でないかチェック
If IsNull(Me.OpenArgs) Then
MsgBox “不正なアクセスです。引数が不足しています。”, vbCritical
Cancel = True
Exit Sub
End If

‘ 2. JSON文字列をDictionaryにパース
‘ ※JsonConverter.ParseJson(Me.OpenArgs) を使用
Set m_Args = JsonConverter.ParseJson(Me.OpenArgs)

‘ 3. キーを指定して値を取り出す(順番を気にする必要はない)
Dim custID As Long: custID = m_Args(“CustomerID”)
Dim mode As String: mode = m_Args(“ProcessMode”)
Dim isAdmin As Boolean: isAdmin = m_Args(“IsAdmin”)

‘ 4. 業務ロジックへの適用
Me.Caption = “顧客詳細 – ID:” & custID

If mode = “READONLY” Then
Me.AllowEdits = False
Me.btnSave.Enabled = False
End If

Exit Sub

Err_Handler:
MsgBox “パラメータの解析に失敗しました。システム管理者に連絡してください。” & vbCrLf & _
“Error: ” & Err.Description, vbCritical
Cancel = True
End Sub

Private Sub Form_Close()
‘ オブジェクトの解放を忘れるな。
‘ VBAのガベージコレクションは優秀だが、明示的な解放は「意思」の表明だ。
Set m_Args = Nothing
End Sub

5. チーフアーキテクトが教える「運用の極意」

1. バリデーション(検証)を怠るな

JSON形式にしたからといって安心するな。`m_Args.Exists(“RequiredKey”)` を使って、期待するキーが存在するか必ずチェックしろ。データを受け取った直後のバリデーションが、後の不可解なバグを防ぐ防波堤になる。

2. 巨大なデータは渡さない

JSONは便利だが、数千行のレコードをJSON化して `OpenArgs` に詰め込むような真似はするな。`OpenArgs` はあくまで「制御引数」を渡すためのパイプだ。大量のデータは、共有のテンポラリテーブルや、クラスモジュールのプロパティを経由させるのが定石だ。

3. パフォーマンスの重み

`JsonConverter` によるパースは、文字列分割よりもわずかにオーバーヘッドがある。しかし、現代のPCスペックにおいて、1つのフォームを開く際に数ミリ秒の差を気にするよりも、メンテナンス性と堅牢性を取るのが賢者の選択だ。

結言:一段上のステージへ

`OpenArgs` にJSONを使う。この一歩は、君のVBA開発を「単なるマクロの延長」から「ソフトウェアエンジニアリング」へと昇華させる重要な転換点になる。

構造化されたデータの受け渡しができるようになれば、Accessはもはや古いデータベースソフトではない。API連携、複雑なUI制御、堅牢な業務ロジックを支える強力なプラットフォームへと変貌する。

このコードをコピペして満足するな。なぜこれが優れているのかを理解し、君のチームの標準仕様にまで高めてほしい。健闘を祈る。

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