こんにちは! Access VBAの海原へようこそ。
これまでマクロの記録や、単一のフォームをポツポツと作ることから一歩進んで、「複数の画面を連携させて、本格的な業務システムを作りたい!」そう思ったことはありませんか?
実務でAccessアプリが大きくなってくると、こんな壁にぶつかります。
- 「次の画面に渡したいパラメータが3つも4つもある……変数どうしよう?」
- 「グローバル変数で値を保持しているけど、どこで書き換わったか分からなくなってバグの温床に……」
ここをスマートにクリアできれば、あなたのAccess VBAスキルは一気に中級者、そしてプロのアーキテクトの領域へとジャンプアップします。
今回は、フォームを開くときに使える魔法の引数「OpenArgs」と、複数のデータを美しく束ねる「JSON文字列」を組み合わせた、実践的で最高にクールなパラメータ制御術を伝授します。
ここをクリアすれば、画面間のデータやり取りはもう怖くありません。一緒にマスターしていきましょう!
—
1. そもそも `OpenArgs` ってなに?(基本のおさらい)
Accessで別のフォームを開くとき、お馴染みの `DoCmd.OpenForm` メソッドを使いますよね。このメソッドの最後の引数に、実はこっそり隠れているのが `OpenArgs`(オープン・アーグツ) です。
‘ フォームを開くときに、おまけのデータを1つだけ持たせることができる!
DoCmd.OpenForm “Frm_Detail”, , , , , , “CustomerID=123”
この `OpenArgs` の素晴らしいところは、「開き元のフォームから、開き先のフォームへ、テキストデータを1つだけこっそり持って行ける」という点です。
「1つだけ」の壁をどう突破するか?
「テキストが1つだけなら、顧客IDしか送れないじゃん!」と思いますよね。
ここで業務システムの現実を思い出してください。画面を開くときには、こんなにたくさんの条件を同時に渡したくなります。
- 顧客ID(`CustomerID`)
- モード(新規作成なのか、編集なのか:`Mode`)
- 戻り先フォームの名前(`ReturnForm`)
変数をグローバル領域にバラ撒くのは、バグの元(アンチパターン)です。
「じゃあ、複数のデータを1つの文字列にまとめて送っちゃえばいいのでは?」
……ピンときましたね? そう、そこで登場するのが JSON形式 です。
—
2. なぜ「JSON」なのか?
JSON(JavaScript Object Notation)は、現代のWeb開発やAPI連携の主役ですが、実はAccess VBAのフォーム間制御でも非常に強力な武器になります。
例えば、次のような文字列を作って `OpenArgs` に乗せます。
{
“CustomerID”: “C001”,
“Action”: “Edit”,
“LoginUser”: “Admin”
}
これなら、いくつ値が増えても `OpenArgs` という「1つのカバン」にすんなり収まりますよね。受け取る側も、「あ、これは顧客IDだな、こっちはモードだな」と綺麗に中身を取り出すことができます。
—
3. 【実践】JSONでOpenArgsを完全制御するコード
前置きはこれくらいにして、実際に現場でそのままコピペして使えるコードを見ていきましょう。
今回は、「一覧画面」から「詳細画面」へ複数のパラメータをJSONで送り、詳細画面側でそれをスマートに解釈して初期化する シナリオです。
ステップ①:一覧画面からJSONを組み立ててフォームを開く
まずは、一覧画面(親)側のボタンクリックイベントなどのコードです。
‘ ===================================================================
‘ 一覧画面(Frm_List)側のコード
‘ ===================================================================
Private Sub cmdOpenDetail_Click()
Dim jsonStr As String
Dim targetID As String
‘ 選択されている顧客IDを取得(例として固定値)
targetID = “C001”
‘ 複数のパラメータをJSON形式の文字列に手動で組み立てる
‘ (※VBAでJSONを扱うお約束として、ダブルクォーテーションは Chr(34) を使うと安全です)
jsonStr = “{” & _
Chr(34) & “CustomerID” & Chr(34) & “:” & Chr(34) & targetID & Chr(34) & “,” & _
Chr(34) & “EditMode” & Chr(34) & “:” & Chr(34) & “UPDATE” & Chr(34) & “,” & _
Chr(34) & “RequestDate” & Chr(34) & “:” & Chr(34) & Format(Date, “YYYY/MM/DD”) & Chr(34) & _
“}”
‘ OpenArgsにJSON文字列を乗せてフォームを開く
DoCmd.OpenForm formName:=”Frm_Detail”, _
View:=acNormal, _
WindowMode:=acDialog, _
OpenArgs:=jsonStr
‘ フォームが閉じられた後の処理をここに書けるのも acDialog の強み
MsgBox “詳細画面が閉じられました。”, vbInformation
End Sub
ステップ②:詳細画面側でJSONをパース(分解)して初期化する
次に、開かれる側(子フォーム:`Frm_Detail`)の `Form_Load` イベントです。
ここで `Me.OpenArgs` を受け取り、中身を解釈(パース)します。外部のライブラリ(JSON parserなど)をわざわざ入れなくても、VBAの標準機能(`InStr` や `Mid` など)で十分シンプルに抽出できます。
‘ ===================================================================
‘ 詳細画面(Frm_Detail)側のコード
‘ ===================================================================
Private Sub Form_Load()
Dim rawArgs As String
Dim customerID As String
Dim editMode As String
Dim reqDate As String
‘ OpenArgsが空っぽで直接開かれた場合のガード処理
If IsNull(Me.OpenArgs) Then
MsgBox “不正な呼び出しです。一覧画面から開いてください。”, vbCritical
DoCmd.Close acForm, Me.Name
Exit Sub
End If
rawArgs = Me.OpenArgs
‘ — 超簡易版:JSONから値を取り出す自前パーサー —
‘ 実務では専用関数を作っておくと便利ですが、今回は直感的に分かりやすく書きます
customerID = ExtractJsonValue(rawArgs, “CustomerID”)
editMode = ExtractJsonValue(rawArgs, “EditMode”)
reqDate = ExtractJsonValue(rawArgs, “RequestDate”)
‘ 受け取ったパラメータに応じてフォームの振る舞いを変える
Select Case editMode
Case “UPDATE”
Me.Caption = “顧客情報 編集画面(ID: ” & customerID & “)”
Me.txtCustomerID.Value = customerID
Me.txtRequestDate.Value = reqDate
‘ 編集不可にするコントロールの制御など…
Case “INSERT”
Me.Caption = “顧客情報 新規登録画面”
Case Else
Me.Caption = “参照モード”
End Select
MsgBox “パラメータの受取に成功しました!” & vbCrLf & _
“顧客ID: ” & customerID & vbCrLf & _
“モード: ” & editMode, vbInformation
End Sub
‘ — 補助関数:JSON文字列から指定したキーの値を取り出す汎用ロジック —
Private Function ExtractJsonValue(json As String, key As String) As String
Dim searchKey As String
Dim startPos As Long
Dim endPos As Long
‘ 探したいキーの形を作る (例: “CustomerID”:)
searchKey = Chr(34) & key & Chr(34) & “:”
startPos = InStr(1, json, searchKey)
If startPos = 0 Then
ExtractJsonValue = “”
Exit Function
End If
‘ 値の開始位置を特定(キーの文字分+コロンの分を進める)
startPos = startPos + Len(searchKey)
‘ 値がダブルクォーテーションで囲まれていると仮定して、次の「”」を探す
‘ (※エスケープ文字等を考慮しない簡易版ですが、実用上これで大体いけます)
startPos = InStr(startPos, json, Chr(34)) + 1
endPos = InStr(startPos, json, Chr(34))
If startPos > 0 And endPos > startPos Then
ExtractJsonValue = Mid(json, startPos, endPos – startPos)
Else
ExtractJsonValue = “”
End If
End Function
—
4. 現場で陥りやすい罠とアーキテクトからのアドバイス
このテクニックを実装する際、初学者がハマりがちなポイントと、それを回避するための知見をシェアしておきます。
罠1:ダブルクォーテーションのミスで構文エラーになる
VBAの中でJSONを書くとき、`”{“CustomerID”:”C001″}”` のように書くと、VBA自体がどこで文字列が終了しているか分からなくなってコンパイルエラーになります。
- 対策: 先ほどのコード例の通り、ダブルクォーテーションは `Chr(34)` に置き換えるか、あるいはVBAのリテラル内であれば `””`(二重引用符)でエスケープする癖をつけましょう。
罠2:OpenArgsがNullのままフォーム単体でテスト実行してしまう
開発中に `Frm_Detail` を単体でダブルクリックして開こうとすると、`Me.OpenArgs` が `Null` になり、コード内でエラーが起きます。
- 対策: 先ほどのコードの通り、`If IsNull(Me.OpenArgs) Then` によるガード節(異常系を先に弾く処理)を必ず先頭に書くこと。これがプログラミングの美学です。
—
まとめ:ここをクリアすれば、もう怖くない!
今回は、Access VBAのフォーム間制御を劇的にスマートにする「OpenArgs × JSON文字列」のテクニックを解説しました。
- `OpenArgs` という「1つのカバン」の存在を知った
- 複数の値をJSON形式で束ねることで、無限のパラメータを渡せるようになった
- 受け取り側で独自のパース関数を使い、安全に初期化処理を行えるようになった
ここをクリアできれば、もう場当たり的にグローバル変数を作りまくる必要はありません。画面設計が美しくなり、保守性の高い、まるでプロが作ったようなAccessアプリに生まれ変わります。
ぜひ、あなたの開発現場でも試してみてください。
それでは、次のアーキテクチャでお会いしましょう!バッチリ使いこなしてくださいね!
