この記事は、Access VBAプログラミングの解説シリーズの一記事です。
今回は、コンボボックスを使ったデータ検索機能について詳しく解説します。
Accessテーブル内のデータから特定の条件を設定し、検索する方法は、Access開発者にとって必ず習得しておきたい重要なスキルです。
特に、Accessフォームに検索機能を実装しておけば、開発者だけでなくユーザーも簡単に検索できるようになります。
ユーザーのスキルに関わらずかんたんに検索できるので、結果としてAccessを使っている組織の生産性向上につながります。
本記事では、コンボボックスを使ってデータを検索するVBA プログラミングの方法を解説します。
また、ここでは主にSQL文を使った検索方法に重点を置いて紹介します。
SQL文の書き方は他のデータベースにも応用可能です。
Access独自の方法で検索することも可能ですが、SQL文を書ける方がつぶしが効くので、かんばって習得しましょう。
さらに、サンプルデータベースもダウンロードできるようにしているので、Zipファイルを解凍してご使用ください。
≫ サンプルデータベース(Filter_Example_Combo.accdb)
完成品の動作
サンプルデータベースを開くと、ナビゲーションウインドウにフォームが6つ設置されているのが確認できます。
フォーム名が「F01部品マスタM~」となっている下半分の3つがメインフォームで、こちらに検索用の機能を実装しています。
上半分の「F01部品マスタDS~」はデータシートフォームで、部品マスタのデータを表示させるためのサブフォームです。
本記事で学習するフォームは「F01部品マスタM_01_Single」です。
他のフォームについては次回詳しく解説します。
では、対象のフォーム「F01部品マスタM_01_Single」を開きましょう。
1つのコンボボックス、検索と検索クリアのボタンが設置されています。
大分類マスタのコンボボックスを選ぶと、大分類マスタに登録されているデータの選択が可能です。
大分類の「機械部品」を選択後、検索を実行します。
検索条件に合致した商品のみが表示されました。
レコードセレクタを確認すると、検索前は119件だったのですが、検索後は25件だけに絞られています。
また、「検索クリア」をクリックすることで、検索前の状態に戻すことができます。
プログラムの中身を確認
VBEを起動させ、「F01部品マスタM_01_Single」のコードを表示させます。
対象のオブジェクトを直接ダブルクリックしてもいいですし、右クリック後に「コードを表示」を選択してもよいです。
フォームの中には4つのイベントプロシージャが入っています。
- Form_Load() ⇒ フォームを開く
- 検索_Click() ⇒ 検索ボタンをクリック
- 検索クリア_Click() ⇒ 検索クリアボタンをクリック
- 戻る_Click() ⇒ 戻るボタンをクリック
検索に関係する上3つのプロシージャの中身を見ていきましょう。
イベントプロシージャの解説
フォームを開いた時
フォームを開いた時に自動的に作動するプログラム『Form_Load()』のコードです。
Private Sub Form_Load()
Me.RecordSelectors = False ' レコードセレクタを非表示にする
Me.NavigationButtons = False ' 移動ボタンを非表示にする
'分類選択の設定
Me.大分類選択.RowSourceType = "Table/Query"
Me.大分類選択.RowSource = "SELECT 大分類名 FROM T00大分類マスタ;"
Me.大分類選択.Value = ""
'データシートフォームの範囲設定
Me.F01部品マスタDS_01_Single.Form.RecordSource = "SELECT * FROM Q01部品マスタ表示用;"
End Sub
上の動作をプロパティウインドウでも設定できますが、今後のメンテナンスのことを考えるとVBEに書き残した方がおすすめです。
では、一つずつ分解して解説します。
ここでは、メインフォームのレコードセレクタなどを無効にします。
このコードを入れることで、フォームの見た目をスッキリさせることができます。
Me.RecordSelectors = False ' レコードセレクタを非表示にする
Me.NavigationButtons = False ' 移動ボタンを非表示にする
コンボボックスのリストを再設定するコードです。
'分類選択の設定
Me.大分類選択.RowSourceType = "Table/Query"
Me.大分類選択.RowSource = "SELECT 大分類名 FROM T00大分類マスタ;"
Me.大分類選択.Value = ""
サンプルデータベースでは、RowSourceTypeをTable/Query(テーブル・クエリ)で設定しています。
そんな時は必ずSQL文でRowSourceを設定しましょう。
さらに、コンボボックスの値は空欄にしておきます。
他にはRowSourceTypeにValue(値)を使う方法もあります。
Valueを設定した場合は、AddItemメソッドでRowSourceを一つずつ追加します。
以下はサブフォームのレコードソースを設定するコードです。
'データシートフォームの範囲設定
Me.F01部品マスタDS_01_Single.Form.RecordSource = "SELECT * FROM Q01部品マスタ表示用;"
RowRourceと同じく、SQL文を積極的に使用しましょう。
検索ボタンを押した時
検索ボタンを押した時に作動するコードです。
Private Sub 検索_Click()
If Me.大分類選択.Value <> "" Then
Me.F01部品マスタDS_01_Single.Form.RecordSource = "SELECT * FROM Q01部品マスタ表示用 WHERE 大分類名 ='" & Me.大分類選択.Value & "';"
Else
Me.F01部品マスタDS_01_Single.Form.RecordSource = "SELECT * FROM Q01部品マスタ表示用;"
End If
End Sub
コンボボックスの値をSQL文のWhere句に設定します。
もしコンボボックスが空欄の場合、全てのデータがを表示するようになっています。
検索クリアボタンを押した時
検索クリアボタンをクリックしたときに作動するコードです。
Private Sub 検索クリア_Click()
Me.F01部品マスタDS_01_Single.Form.RecordSource = "SELECT * FROM Q01部品マスタ表示用;"
Me.大分類選択.Value = ""
End Sub
コンボボックスとサブフォームを初期状態に戻します。
複数のコンボボックスを使う方法
本記事では、シンプルに一つのコンボボックスで検索をかける方法を解説していますが、実務では複数のコンボボックスを使う機会が多いです。
3つのコンボボックスを使って検索する方法についてはこちらの記事で解説しています。
まとめ
今回は、Accessフォームのコンボボックスを使ってデータを検索するVBAプログラミングについて解説しました。
コンボボックスを使ったデータ検索はAccessではよく使う機能で、開発者でない一般ユーザーでも直観で操作できるので、利用者の生産性向上に貢献できます。
また、本記事でも解説しましたが、SQL文を使ってコンボボックスやサブフォームの範囲を設定できるようになっておくことがとても大事です。
基礎をしっかりと身につければ、コンボボックスの数が増えても容易に対応できます。
本記事の内容を現場で有効にいかしていただければうれしいです。