Access VBAのフォームについてお探しですね。
広告
Access VBAで画面を自由に操ろう!フォームの開閉・データ受け渡し・色変更の基本ワザ
Microsoft Accessで業務システムを作るとき、データベースの機能だけじゃなくて、「使いやすい画面(フォーム)」を作ることがすごく大事です。
ボタンを押したら画面が切り替わったり、入力した内容によって背景の色が変わったり――こういった動きを加えることで、Accessは単なるデータの置き場所から、本格的な業務アプリに生まれ変わります。
この記事では、Access VBAを始めたばかりの人がまず覚えておきたい「フォーム操作」の基本ワザをまとめました。
フォームの開け閉めから、画面同士でのデータのやり取り、見た目を変える色の変更まで、実際の仕事でよく使うコードを解説します。
これらを組み合わせれば、誰でも使いやすいシステムが作れるようになりますよ。
まずはここから!フォームを開く・閉じる基本コード
Access VBAで一番よく使うのが、フォームを開いたり閉じたりする操作です。
マクロでもできますが、VBAを使えば「特定の条件に合うデータだけを表示する」とか「作業が終わるまで他の操作をさせない」といった細かい制御ができるようになります。
ここでは基本となる `DoCmd` というオブジェクトを使った操作を見ていきましょう。
フォームを開く(DoCmd.OpenForm)
フォームを開くには `DoCmd.OpenForm` というメソッドを使います。
基本の形はとってもシンプルですが、オプション(引数)を指定することでいろんな開き方ができます。
たとえば、メニュー画面からデータ入力画面を開いたり、一覧から特定の詳細画面を開いたりするときに使います。
一番シンプルな書き方はこちら。
「フォーム名」のところには、すでに作ってあるフォームの名前をダブルクォーテーションで囲んで書いてください。
“`vba
‘ シンプルに開く
DoCmd.OpenForm “F_入力画面”
“`
実際の仕事では、ただ開くだけじゃなくて「特定のデータだけを表示したい」ってことがよくあります。
そんなときは `WhereCondition` という引数を使います。
たとえば、顧客IDが1001のデータだけを表示してフォームを開きたいときは、こんな風に書きます。
“`vba
‘ 条件を指定して開く(顧客IDが1001のデータだけ表示)
DoCmd.OpenForm “F_顧客詳細”, , , “顧客ID = 1001”
“`
また、フォームを開いている間、ユーザーに他の操作をさせたくないときは「ダイアログモード」を使います。
これは、大事な確認画面や必ず入力してほしい画面で役立ちます。
`WindowMode` に `acDialog` を指定すると、そのフォームを閉じるまで次の処理に進まないようにできます。
“`vba
‘ ダイアログモードで開く(閉じるまで次の処理が待機される)
DoCmd.OpenForm “F_確認画面”, , , , , acDialog
MsgBox “確認画面が閉じられました”
“`
フォームを閉じる(DoCmd.Close)
開いたフォームを閉じるには `DoCmd.Close` メソッドを使います。
何も指定しないと「今開いているウィンドウ」を閉じようとしますが、間違いを防ぐために、閉じるものの種類と名前をはっきり書くのがおすすめです。
“`vba
‘ 特定のフォームを閉じる
DoCmd.Close acForm, “F_入力画面”
“`
データを変更した後にフォームを閉じようとすると、Accessが「変更を保存しますか?」って聞いてくることがあります。
VBAで自動的に保存して閉じたいときは、`Save` に `acSaveYes` を指定すれば、ユーザーに確認せずにスムーズに終了できます。
画面同士で値を受け渡すテクニック(連携)
業務システムを作っていると、「一覧画面で選んだ商品のIDを、詳細画面に渡したい」みたいな場面が必ず出てきます。
フォーム同士は別々に動いているので、何かしらの方法で情報を橋渡ししてあげる必要があります。
ここでは、スマートでプロっぽい方法と、わかりやすい方法の2つを紹介します。
OpenArgsを使って値を渡す
一番おすすめなのが、`OpenForm` メソッドの最後の引数である `OpenArgs` プロパティを使う方法です。
これは「フォームを開くときに、ついでに荷物(データ)を持たせる」みたいなイメージです。
渡す側と受け取る側の両方にコードを書く必要がありますが、フォーム同士のつながりが緩くて、エラーが起きにくいしっかりした作りになります。
まず、**渡す側(呼び出し元)** のコードです。
引数の最後(7番目)に渡したい値を指定します。
“`vba
‘ ID「1001」をOpenArgsとして渡してフォームを開く
DoCmd.OpenForm “F_顧客詳細”, , , , , , “1001”
“`
次に、**受け取る側(開かれるフォーム)** のコードです。
フォームが開くとき(読み込み時)に起きる `Load` イベントで `OpenArgs` の中身をチェックして、処理を行います。
“`vba
‘ F_顧客詳細のLoadイベント
Private Sub Form_Load()
‘ OpenArgsに値が入っているかチェック
If Not IsNull(Me.OpenArgs) Then
‘ 渡されたIDをテキストボックスなどにセットする
Me.txt顧客ID.Value = Me.OpenArgs
‘ 必要なら、そのIDでフィルタをかけるなどの処理を追加
End If
End Sub
“`
開いたフォームのコントロールを直接操作する
もう一つの方法は、フォームを開いた直後に、そのフォームの中にあるテキストボックスなどの「コントロール」に直接値を入れる方法です。
わかりやすくて直感的な反面、フォームが開くタイミングや読み込みの速さによってはエラーになることがあるので注意が必要です。
この方法を使うときは、フォームを開いた次の行に代入処理を書きます。
開いた先のフォームを指定するために `Forms!フォーム名!コントロール名` という書き方を使います。
“`vba
‘ フォームを開いてから、値を代入する
DoCmd.OpenForm “F_顧客詳細”
‘ 開いたフォームの「txt顧客ID」に値をセット
Forms!F_顧客詳細!txt顧客ID.Value = 1001
“`
この方法は `OpenArgs` を使う方法より短く書けますが、フォームが開いていない状態で参照しようとするとエラーになります。
必ず `OpenForm` で開いた後に書くようにしましょう。
見やすさアップ!フォームやコントロールの色を変える
画面の色を動的に変えることで、ユーザーに注意を促したり、状態の変化をパッと伝えたりできます。
たとえば「必須項目が未入力のときに背景を赤くする」とか「特定の条件を満たしたときに文字を青くする」といった処理です。
背景色(BackColor)と文字色(ForeColor)
VBAでは、コントロールの `BackColor`(背景色)と `ForeColor`(文字色)というプロパティを操作して色を変更します。
色は数値で指定しますが、`RGB` 関数を使うと「赤・緑・青」の配分で指定できるので、感覚的に色を作れます。
このコードは、コマンドボタンをクリックしたときに、特定のテキストボックスの背景色を薄い赤色に変える例です。
“`vba
‘ 背景色を薄い赤に変更する
Me.txt氏名.BackColor = RGB(255, 200, 200)
‘ 文字色を赤に変更する
Me.txt氏名.ForeColor = RGB(255, 0, 0)
“`
元の色に戻したいときは、普通の色(白など)のRGB値を指定するか、あらかじめ用意されている色コードを使います。
たとえば、白は `vbWhite`、黒は `vbBlack`、赤は `vbRed` といった定数が使えます。
条件によって色を変える実用例
実際の仕事では、ユーザーの操作(イベント)に合わせて色を変えるのが一般的です。
よくあるのが「カーソルが当たっている(フォーカスがある)入力欄だけ色を変えて、どこに入力しているかわかりやすくする」という処理です。
これには `Enter`(フォーカス取得時)イベントと `Exit`(フォーカス喪失時)イベントを使います。
* **Enterイベント**:入力欄に入ったとき、背景色を黄色にする
* **Exitイベント**:入力欄から出たとき、背景色を白に戻す
“`vba
‘ フォーカスが当たったとき(背景を黄色に)
Private Sub txt氏名_Enter()
Me.txt氏名.BackColor = RGB(255, 255, 200)
End Sub
‘ フォーカスが外れたとき(背景を白に戻す)
Private Sub txt氏名_Exit()
Me.txt氏名.BackColor = vbWhite
End Sub
“`
こんな風に細かく色を制御するだけで、システムの使いやすさがグッと上がります。
ただし、色を使いすぎると逆に見づらくなるので、警告色や強調色など、ルールを決めて使うことが大切です。
使いやすさを高める画面操作の応用ワザ
基本操作に加えて、もう少し踏み込んだ「画面制御」のテクニックを知っておくと、市販のアプリみたいな洗練された動きが実現できます。
ここでは、ウィンドウサイズの調整やフォーカスの移動など、仕上げに使えるコードを紹介します。
フォームの最大化・最小化・サイズ復元
メインメニューを開いたときに画面いっぱいに表示したいとか、逆に元のサイズに戻したいときは、`DoCmd.Maximize`(最大化)、`DoCmd.Minimize`(最小化)、`DoCmd.Restore`(元のサイズに戻す)を使います。
これらは基本的に `Form_Load` イベントや `Form_Open` イベントに書きます。
“`vba
Private Sub Form_Load()
‘ フォームが開いた瞬間に最大化する
DoCmd.Maximize
End Sub
“`
特定の場所にカーソルを移動させる(SetFocus)
画面を開いたときや、入力エラーが出たときに、特定の入力欄にカーソル(フォーカス)を飛ばしたいことがあります。
これには `SetFocus` メソッドを使います。
ユーザーがマウスでクリックする手間が省けるので、入力作業の効率化に直結します。
“`vba
‘ 「txt氏名」テキストボックスにカーソルを移動する
Me.txt氏名.SetFocus
“`
画面のちらつきを抑える(Echo)
VBAで連続してたくさんの処理をすると、画面がパタパタと切り替わったり、再描画のちらつきが見えたりすることがあります。
これを防ぐには `Application.Echo` メソッドを使って、処理中の画面更新を一時的にストップします。
“`vba
‘ 画面更新を停止(処理中の画面変化を見せない)
Application.Echo False
‘ ~ ここで重い処理や複数のフォーム操作を行う ~
‘ 処理が終わったら必ず画面更新を再開する
Application.Echo True
“`
注意点として、`Echo False` にしたまま処理がエラーで止まってしまうと、画面が更新されずにフリーズしたように見えてしまいます。
必ずエラー処理(`On Error GoTo …`)と組み合わせて、最終的には `Echo True` が実行されるように書いてください。
Access VBAによる画面操作は、ユーザーの使い心地(UX)を直接左右する大事な要素です。
まずは「開く・閉じる」から始めて、徐々に「値を渡す」「色を変える」といったテクニックを取り入れて、使い心地の良いシステムを目指してください。
広告
