【入門編】DoCmd.OpenFormの「WindowMode」を駆使した、ダイアログ形式でのデータ入力設計と制御 – Access VBA解析バイブル

スポンサーリンク

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` を使ったフォーム間のデータ受け渡しに挑戦してみてください。世界がさらに広がります。

何か詰まったら、いつでも戻ってきてください。エンジニアとしての知見を、また共有しましょう。

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