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

スポンサーリンク

こんにちは!Access VBAの世界へようこそ。
普段、Accessでシステムを作っていると、「ボタンを押して次の画面(フォーム)を開くときに、複数のデータを一緒に引き渡したい」という場面によく遭遇しますよね。

Accessには、フォームを開くときに後ろにそっとデータを忍ばせることができる`OpenArgs`(オープン引数)という便利な仕組みが用意されています。しかし、この`OpenArgs`は「ただの1枚のテキスト(文字列)」しか渡せません。

「会員IDも、会員名も、処理モード(新規か編集か)も、全部次の画面に渡したいのに……!」

そんなとき、多くの人が「カンマで区切って合体させて、受け取り側で分解(Split)しよう」と考えます。しかし、実はその方法、実務ではバグを生む最大の原因になってしまうのです。

今回は、カンマ区切りの危うさから脱却し、現代のプログラミングで標準的に使われている「JSON(ジェイソン)形式」を使って、スマートかつ安全に複数のパラメータを受け渡す方法を解説します。

一見難しそうに見えるかもしれませんが、仕組みさえ理解すれば驚くほどシンプルです。「ここをクリアすれば、Access VBAの基本はバッチリですよ」と言える、一歩上の設計手法を一緒に学んでいきましょう!

1. なぜ「カンマ区切り」はダメなのか?

具体的な実装に入る前に、なぜ従来の「カンマ区切り」や「セミコロン区切り」が危険なのかを整理しておきましょう。

例えば、以下のようにデータを繋げて送ったとします。

‘ 危険な例:カンマ区切りでデータを渡す
DoCmd.OpenForm “F_会員詳細”, OpenArgs:=”101,佐藤 太郎,東京本社”

これを受け取った「F_会員詳細」側では、`,`(カンマ)で分解してデータを取り出します。
一見うまく動きそうですが、もし「佐藤 太郎」の住所が「千代田区麹町1-2, メゾン麹町301」のように、データ自体にカンマが含まれていたらどうなるでしょうか?

分解する位置がズレてしまい、システムは一瞬でエラーを起こすか、全く違うデータを画面に表示してしまいます。また、「データの順番」に依存するため、後から「送る項目を1つ増やしたい」となったときに、送信側と受信側の両方のコードを大幅に書き直す必要が出てきます。

これを根本的に解決するのがJSON形式での受け渡しです。

2. JSON(JavaScript Object Notation)とは?

JSONは、データを「キー(名前)と値のペア」で表現する、世界中で使われているデータ形式です。

{
“ID”: 101,
“Name”: “佐藤 太郎”,
“Office”: “東京本社”
}

このように書いておけば、どれだけデータの中にカンマが含まれていようが、順番が入れ替わろうが、「”Name” というキーの値を取り出す」と指定するだけで、安全に正確なデータを取り出すことができます。

「でも、Access VBAでJSONを扱うのって難しいんじゃ……?」
そう思った方も安心してください。Windowsが標準で持っている仕組みを少しだけ借りることで、外部ライブラリをインストールすることなく、VBAだけで簡単にJSONを解析できます。

3. 【準備】VBAでJSONを解析する「魔法の関数」を作ろう

まずは、受け取ったJSON文字列をVBAで簡単に扱えるオブジェクトに変換する「共通関数」を標準モジュールに作成します。

Accessの「作成」タブ → 「標準モジュール」を開き、以下のコードをそのままコピペしてください。

Option Explicit

‘ ==========================================
‘ 関数名: ParseJSON
‘ 概要 : JSON形式の文字列を解析し、VBAで操作可能なオブジェクトに変換します。
‘ 参照設定: 不要(レイトバインディング)
‘ ==========================================
Public Function ParseJSON(ByVal jsonString As String) As Object
Dim html As Object

‘ Windowsが標準で持っているHTML/JavaScriptエンジン(htmlfile)を利用します
Set html = CreateObject(“htmlfile”)

‘ JavaScriptの「JSON.parse」を使って、文字列を安全にオブジェクト化します
‘ ※シングルクォーテーションをダブルクォーテーションに置換して、表記の揺れをカバーします
jsonString = Replace(jsonString, “‘”, “”””)

html.parentWindow.execScript “function parse(str) { return JSON.parse(str); }”, “JScript”

‘ 解析結果を返却します
Set ParseJSON = html.parentWindow.parse(jsonString)
End Function

【解説】このコードで何をしているの?

VBA自体には、最新のJSONを直接解析する機能がありません。そこでこの関数では、Windowsの裏で動いている「JavaScriptのエンジン(`htmlfile`)」を呼び出しています。
JavaScriptはJSONの本家本元ですので、`JSON.parse()` という非常に強力で安全な解析ロジックを持っています。これを利用することで、私たちは難しい解析コードを1行も書くことなく、安全にJSONをデコードできるのです。

4. 【実践】データを送る側(送信元フォーム)の実装

それでは、実際に画面間でデータを渡してみましょう。
まずは「一覧画面(F_会員一覧)」などにある、詳細画面を開くためのボタンのクリックイベントです。

Private Sub btnOpenDetail_Click()
Dim jsonArgs As String

‘ 1. 渡したいデータをJSON形式の文字列として組み立てます。
‘ ※VBAのコード内でダブルクォーテーションを何重にも書くと読みづらくなるため、
‘ ここではシングルクォーテーション「’」を使い、先ほどの関数内で自動置換させています。
jsonArgs = “{‘ID’: 101, ‘Name’: ‘佐藤, 太郎’, ‘Office’: ‘東京本社’, ‘Mode’: ‘Edit’}”

‘ 2. 組み立てたJSONを OpenArgs に乗せて、詳細画面を開きます。
DoCmd.OpenForm FormName:=”F_会員詳細”, _
View:=acNormal, _
OpenArgs:=jsonArgs
End Sub

ポイント

  • `”Name”: “佐藤, 太郎”` のように、データの中にカンマが含まれていても、JSONなので全く問題ありません。
  • シングルクォーテーションを使って `{‘ID’: 101…}` と書けるようにしたことで、VBAコードが非常にスッキリし、パッと見て何を送っているかが一目でわかるようになっています。

5. 【実践】データを受け取る側(受信先フォーム)の実装

次に、開かれる側のフォーム「F_会員詳細」の、読み込み時イベント(`Form_Open` または `Form_Load`)に以下のコードを記述します。

Private Sub Form_Open(Cancel As Integer)
‘ OpenArgsが空(何も渡されずに開かれた場合)は処理を抜けます
If IsNull(Me.OpenArgs) Then Exit Sub

On Error GoTo ErrorHandler

Dim jsonObj As Object
Dim memberID As Long
Dim memberName As String
Dim officeName As String
Dim editMode As String

‘ 1. 共通関数を使って、OpenArgs(JSON文字列)をオブジェクトに変換します
Set jsonObj = ParseJSON(Me.OpenArgs)

‘ 2. オブジェクトから、キー名(ID, Nameなど)を指定して値を取り出します
‘ ※JavaScriptのプロパティとして直接アクセスできます
memberID = jsonObj.ID
memberName = jsonObj.Name
officeName = jsonObj.Office
editMode = jsonObj.Mode

‘ 3. 取り出したデータを、画面のコントロールにセットしたり、処理の分岐に使います
Me!txtMemberID = memberID
Me!txtMemberName = memberName
Me!txtOffice = officeName

‘ 処理モードに応じた画面制御の例
If editMode = “Edit” Then
Me.Caption = “会員情報 – 編集モード”
Me!txtMemberID.Enabled = False ‘ IDは編集不可にする
Else
Me.Caption = “会員情報 – 新規登録”
End If

Exit Sub

ErrorHandler:
MsgBox “データの引き継ぎに失敗しました。詳細: ” & Err.Description, vbCritical, “システムエラー”
End Sub

【解説】ここがプロの設計!

`Set jsonObj = ParseJSON(Me.OpenArgs)` を実行した後は、なんと `jsonObj.ID` や `jsonObj.Name` のように、ドットで繋ぐだけで目的のデータに直接アクセスできます。
配列の添字(`Split(0)` など)を使う必要が一切ないため、コードが直感的になり、可読性(読みやすさ)が劇的に向上しているのがお分かりいただけると思います。

6. 初心者が陥りがちな落とし穴と対策

① JSONの書き間違い(シンタックスエラー)

JSONは、波カッコ `{ }` やコロン `:`、カンマ `,` の位置が1つでもずれると解析に失敗します。

  • NG例: `{‘ID’: 101, ‘Name’: ‘佐藤’ ` (最後の波カッコが閉じられていない)
  • 対策: 送信する文字列を `Debug.Print jsonArgs` でイミディエイトウィンドウに出力し、正しい形になっているか確認する癖をつけましょう。

② 値が「Null」のときの挙動

データベースから取得した値が `Null` の場合、そのままJSONに結合するとエラーになることがあります。
VBAからJSONを組み立てる際は、`Nz` 関数を使って、空文字や `0` に変換してから結合するようにしてください。

‘ Null対策を施した安全な組み立て方
jsonArgs = “{‘ID’: ” & Nz(Me!ID, 0) & “, ‘Name’: ‘” & Nz(Me!Name, “”) & “‘}”

7. まとめ

一歩進んだ `OpenArgs` の受け渡しテクニック、いかがでしたでしょうか?

これまでの「カンマで繋いで、分解して……」という泥臭い方法に比べ、JSONを使った設計は、
1. データの中にどんな文字が含まれていても壊れない(堅牢性)
2. 後からの項目追加・変更に極めて強い(拡張性)
3. コードを見ただけで、何のデータを渡しているかがすぐ解る(可読性)

という、プロの開発現場でも必須とされる3大メリットをすべて満たしています。

最初は少し難しく感じたかもしれませんが、一度この「魔法の関数(`ParseJSON`)」を自分のライブラリ(引き出し)に登録してしまえば、今後の画面遷移の実装が驚くほどラクで、スマートなものに変わります。

一つずつ、動くコードを書いて試してみてください。ここをクリアすれば、Access VBAの基本から応用へのステップアップはバッチリですよ!応援しています!

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