Access VBAを掌握せよ:`DoCmd.OpenForm`で操る「入力の聖域」
こんにちは。システムアーキテクトとして、これまで数多のレガシーシステムを再構築してきた経験から、今日はAccess開発の登竜門であり、かつ奥義でもある「フォーム制御」について語ります。
皆さんがマクロからVBAへと一歩踏み出したとき、最初にぶつかる壁が「画面制御」です。ただフォームを開くだけではなく、「ユーザーにどう振る舞ってほしいか」をコードで定義する。これこそが、堅牢なデータベースを作る第一歩です。
—
なぜ「WindowMode」を制御するのか?
Accessにおけるフォーム表示には、単にウィンドウを出す以上の意味があります。それは「ユーザーの意識をどこに留めるか」という設計思想です。
例えば、マスタ管理画面を開いている最中に、誤って別のレコードを操作されたらどうでしょう? データの整合性は崩壊します。ここで登場するのが `DoCmd.OpenForm` の `WindowMode` 引数です。
覚えておくべき3つの魔法
`DoCmd.OpenForm` メソッドには、WindowModeを制御する定数が主に2つあります。
1. `acWindowNormal`: 通常表示。裏の画面も操作可能。
2. `acDialog`: 最強の制御。 このウィンドウを閉じるまで、呼び出し元の処理を一時停止し、他のウィンドウ操作を拒否します。
—
【実践】データ入力の「聖域」を作る
「新規顧客登録」など、入力ミスが許されない場面では `acDialog` を使いましょう。これにより、ユーザーは「入力を完了させるか、キャンセルするか」の二択を強制されます。
実装例:確実にデータを入力させる魔法のコード
‘ 呼び出し元のボタンクリックイベント等に記述
Private Sub btnOpenEntryForm_Click()
‘ フォームを開く際、WindowModeをacDialogに設定
‘ これにより、このフォームを閉じるまで以下のコードは実行されません
DoCmd.OpenForm FormName:=”frmCustomerEntry”, _
View:=acNormal, _
WindowMode:=acDialog
‘ — ここから先は、frmCustomerEntryが閉じられた後に実行されます —
‘ フォームが閉じられた後、リストボックスなどを最新の状態に更新
If CurrentProject.AllForms(“frmCustomerEntry”).IsLoaded = False Then
Me.lstCustomerList.Requery
MsgBox “入力が完了しました。リストを更新しました。”, vbInformation
End If
End Sub
このコードの「賢い」ポイント
- 処理の中断: `acDialog` を指定した瞬間、VBAは一時停止します。つまり、フォームが閉じるまで次の行へ進まないため、「入力が終わったタイミングでリストを更新する」という連動が非常にシンプルに書けます。
- 疎結合な設計: 呼び出し元のボタンは「フォームを開く」ことだけに集中し、フォーム側は「入力を受け付ける」ことだけに集中させる。この役割分担がメンテナンス性の高いコードの秘訣です。
—
陥りやすい「罠」と解決策
初心者がよくやる失敗が、`acDialog` を使っているのに `DoCmd.Close` で自分自身を閉じようとしてエラーになるケースです。
よくあるエラー:フォーム自身の制御
`acDialog` で開いたフォーム内で「保存して閉じる」ボタンを作る場合、必ず自分自身を指す `Me` を使いましょう。
‘ 入力フォーム内の「保存して閉じる」ボタン
Private Sub btnSaveAndClose_Click()
‘ データの整合性を確認
If IsNull(Me.txtCustomerName) Then
MsgBox “氏名は必須です!”, vbExclamation
Exit Sub
End If
‘ レコードを保存して閉じる
DoCmd.RunCommand acCmdSaveRecord
DoCmd.Close acForm, Me.Name
End Sub
—
まとめ:入力フローは「支配」せよ
Access VBAの醍醐味は、画面を単なる表示器ではなく、「ビジネスルールの番人」に仕立て上げることです。
- 入力の一貫性を守るなら `acDialog` でフローを強制する。
- ユーザーの並行作業を許すなら `acWindowNormal` を使い、イベントで連携する。
この使い分けを意識するだけで、あなたの作るAccessアプリは「動くもの」から「プロの道具」へと進化します。
「ここをクリアすれば、Access VBAの基本はバッチリですよ」。
次はぜひ、`OpenArgs` を使ったフォーム間のデータ受け渡しに挑戦してみてください。世界がさらに広がります。
何か詰まったら、いつでも戻ってきてください。エンジニアとしての知見を、また共有しましょう。
