Access VBAでフォームを開く方法をお探しですね。

広告

Access VBAでフォームを開く・閉じる!DoCmd.OpenFormの活用テクニック

Accessで業務用のデータベースを作っていると、「メニュー画面から入力フォームを開きたい」「一覧で選んだ顧客だけを詳細フォームに表示したい」「処理が終わったら今のフォームを閉じたい」といった場面が必ず出てきます。

こうした画面の切り替えで中心になるのが、Access VBAの`DoCmd.OpenForm`と`DoCmd.Close`です。

この記事では、基本的な使い方から条件付き表示、ダイアログ表示、フォーム間での値の受け渡し、閉じるときの注意点まで、実務で使いやすい形で解説していきます。

DoCmd.OpenFormの基本構文とフォームを開くシンプルな書き方

Access VBAで別のフォームを開くときに使うのが`DoCmd.OpenForm`です。

たとえば、メニュー画面に配置したボタンをクリックしたときに「F_顧客入力」というフォームを開きたい場合、ボタンのクリック時イベントに`DoCmd.OpenForm “F_顧客入力”`と書くだけでOKです。

フォーム名を文字列で指定するだけなので、初心者でも覚えやすい処理ですね。

マクロでもフォームを開く操作はできますが、VBAで書いておくと、あとから条件分岐やエラー処理、引数の受け渡しなどを追加しやすくなります。

`DoCmd.OpenForm`の正式な構文は、フォーム名だけでなく複数の引数を指定できるようになっています。

“`
DoCmd.OpenForm FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs
“`

すべてを毎回指定する必要はなく、使わない引数はカンマで飛ばして省略できます。

最初はフォーム名だけを指定する書き方から始めて、必要に応じて「表示方法」「抽出条件」「編集モード」「ウィンドウの開き方」「渡す値」を追加していく、という考え方で十分です。

“`vba
Private Sub cmd顧客入力_Click()
DoCmd.OpenForm “F_顧客入力”
End Sub
“`

表示形式を変えたい場合は、第2引数の`View`を使います。

普通のフォームビューで開くなら省略できますが、デザインビューで開く場合は`acDesign`、データシートビューで開く場合は`acFormDS`、印刷プレビューとして開く場合は`acPreview`を指定します。

実務ではユーザーにデザインビューを開かせることは少ないので、通常は省略か`acNormal`で十分ですが、開発中の確認や管理者用機能では使う場面もあります。

まずは「フォーム名を指定すれば開ける」「引数で動きを細かく変えられる」という2点を押さえておくと、このあとの応用が理解しやすくなりますよ。

条件を指定してフォームを開く実務向けテクニック

`DoCmd.OpenForm`を実務で使うときに特に重要なのが、第4引数の`WhereCondition`です。

これは、開くフォームに表示するレコードを条件で絞り込むための指定です。

たとえば顧客一覧フォームで選択した顧客IDの詳細フォームだけを開きたい場合、一覧側のボタンやダブルクリックイベントに条件式を書きます。

これにより、詳細フォームを開いたあとにユーザーが目的のレコードを探す必要がなくなり、一覧から詳細へスムーズに移動できる画面設計になります。

“`vba
Private Sub 顧客ID_DblClick(Cancel As Integer)
DoCmd.OpenForm “F_顧客詳細”, , , “顧客ID = ” & Me!顧客ID
End Sub
“`

ここで注意したいのは、条件式の書き方がフィールドのデータ型によって変わる点です。

数値型のIDであれば`”顧客ID = ” & Me!顧客ID`のように値をそのまま連結できますが、文字列型の場合は値をシングルクォーテーションで囲む必要があります。

日付型の場合はAccess SQLのルールに従い、日付を`#`で囲みます。

条件式の引用符がずれると「パラメーターの入力」画面が出たり、該当データが表示されなかったりするので、初心者がつまずきやすいポイントです。

“`vba
‘数値型
DoCmd.OpenForm “F_顧客詳細”, , , “顧客ID = ” & Me!顧客ID

‘文字列型
DoCmd.OpenForm “F_顧客詳細”, , , “顧客コード = ‘” & Me!顧客コード & “‘”

‘日付型
DoCmd.OpenForm “F_売上一覧”, , , “売上日 = #” & Format(Me!売上日, “yyyy/mm/dd”) & “#”
“`

新規登録用にフォームを開きたい場合は、第5引数の`DataMode`に`acFormAdd`を指定します。

たとえば一覧フォームで空白行をダブルクリックしたときは新規登録、既存レコードをダブルクリックしたときは詳細表示、という処理にできます。

参照だけさせたい場合は`acFormReadOnly`、通常の編集を許可したい場合は`acFormEdit`を使います。

業務システムでは「誰が編集できるか」「どの画面では追加だけ許可するか」を明確にすることが大切なので、OpenFormのデータモード指定は単なる表示操作ではなく、操作ミスを防ぐ設計にもつながります。

acDialog・OpenArgsでフォーム間の操作を便利にする

フォームをただ開くだけでなく、ユーザーに必ず入力させたい画面や、確認が終わるまで次の処理へ進めたくない画面では、第6引数の`WindowMode`に`acDialog`を指定します。

`acDialog`で開いたフォームはダイアログのように前面へ表示され、そのフォームを閉じるか非表示にするまで、呼び出し元の後続処理が待機します。

ログイン画面、検索条件入力画面、削除前の確認画面など、ユーザーの操作順序を制御したい場面で便利です。

フォーム自体のプロパティで「ポップアップ」や「自動中央寄せ」を設定しておくと、さらに見やすい画面になりますよ。

“`vba
Private Sub cmd検索_Click()
DoCmd.OpenForm “F_検索条件”, , , , , acDialog
End Sub
“`

別フォームへ値を渡したい場合は、第7引数の`OpenArgs`を使います。

`OpenArgs`は文字列型の引数で、開かれたフォーム側では`Me.OpenArgs`として参照できます。

たとえば呼び出し元のフォーム名、ログインユーザーID、初期表示したい区分などを渡すと、開いた先のフォームで表示内容や処理を切り替えられます。

複数の値を渡したい場合は、カンマや縦棒などの区切り文字で連結し、受け取り側で`Split`関数を使って分解する方法がよく使われます。

“`vba
‘呼び出し元
DoCmd.OpenForm “F_商品入力”, , , , , , “商品,新規,admin”

‘開かれたフォーム側
Private Sub Form_Open(Cancel As Integer)
Dim v As Variant

If Not IsNull(Me.OpenArgs) Then
v = Split(Me.OpenArgs, “,”)
Me!txt分類 = v(0)
Me!txtモード = v(1)
Me!txt担当者 = v(2)
End If
End Sub
“`

`OpenArgs`を使うとフォーム間の連携が柔軟になりますが、何でも詰め込みすぎるとあとから読みにくいコードになってしまいます。

渡す値が主キーだけで済むなら`WhereCondition`で絞り込み、画面の動作モードや補助情報を渡したい場合に`OpenArgs`を使う、という使い分けが実務では分かりやすいです。

また、区切り文字を使う場合は、値そのものにカンマが含まれる可能性にも注意が必要です。

商品名や備考のように自由入力の文字列を渡す場合は、区切り文字を工夫するか、必要な情報を一時テーブルに保存してIDだけ渡す設計のほうが安全です。

フォームを閉じるDoCmd.Closeと画面切り替え時の注意点

フォームを閉じるときは`DoCmd.Close`を使います。

最も短い書き方は`DoCmd.Close`ですが、この場合は現在アクティブなウィンドウが閉じられます。

自分自身のフォームを閉じるだけなら動作することも多いですが、複数フォームを開くAccessアプリでは、意図しない画面が閉じるリスクがあります。

そのため、実務では`DoCmd.Close acForm, “フォーム名”, acSaveNo`のように、閉じる対象を明示する書き方をおすすめします。

対象を明示しておくと、あとでフォームが増えた場合でも処理の意味が分かりやすくなります。

“`vba
Private Sub cmd閉じる_Click()
DoCmd.Close acForm, “F_顧客入力”, acSaveNo
End Sub
“`

第3引数の`acSaveNo`は、入力中のレコードを保存しないという意味ではなく、フォームのデザイン変更を保存しないという意味です。

ここを誤解すると、データ保存の制御ができていると思い込んでしまうことがあります。

Accessの連結フォームでは、レコード移動やフォームを閉じるタイミングでデータが自動的に保存される場合があります。

入力データを保存するか確認したい場合は、`BeforeUpdate`イベントで確認メッセージを出す、保存ボタンを用意して明示的に処理するなど、別の設計が必要です。

`DoCmd.Close`の保存指定はあくまでオブジェクト設計の保存に関する指定だと理解しておきましょう。

画面を切り替えるときは、`DoCmd.OpenForm`と`DoCmd.Close`を組み合わせます。

たとえばメニュー画面から顧客入力画面へ移動するときは、先に新しいフォームを開いてから、元のフォームを閉じる順番が安全です。

先に自分自身を閉じると、そのフォーム上のイベント処理が途中で終わったように見えたり、後続コードの動作が分かりにくくなったりします。

特に初心者のうちは「開いてから閉じる」を基本ルールにしておくと、画面遷移のトラブルを減らせます。

“`vba
Private Sub cmd顧客管理_Click()
DoCmd.OpenForm “F_顧客一覧”
DoCmd.Close acForm, “F_メニュー”, acSaveNo
End Sub
“`

安定したAccessアプリにするには、フォームがすでに開いているか、必要な値がNullではないか、条件式に問題がないかも確認しておくと安心です。

たとえば一覧フォームでIDが空の行を操作した場合は新規追加モードで開く、IDがある場合は該当レコードを開く、といった分岐を入れると自然な操作感になります。

また、閉じる前に別フォームを再表示・再検索したい場合は、開いているフォームに対して`Forms!フォーム名.Requery`を実行する方法もあります。

`DoCmd.OpenForm`と`DoCmd.Close`は単独の命令として覚えるだけでなく、一覧・詳細・入力・確認といった画面の流れを作る部品として理解すると、Access VBAで作れるシステムの幅が大きく広がります。

ぜひこの記事を参考に、使いやすいAccessアプリを作ってみてくださいね。

広告