●概要●
検索時や入力時に、ユーザーに既存のデータを選択してもらうことは非常に多く、その場合にコンボボックスを使用することも多いでしょう。
しかし、選択項目が多い場合はコンボボックスで1つのデータを探し、選択するのは思った以上に大変な作業です。
そこで今回は、複数のコンボボックスを使った絞込処理によってデータ選択を簡単にする方法を説明します。
●準備●
- 以下の構成で[商品マスタ]テーブルを作成します。
----------------------------------------
フィールド名 データ型
商品ID オートナンバー(主キー)
商品区分 テキスト型
取扱区分 テキスト型
割引有無 Yes/No型
商品名 テキスト型
販売価格 通貨型
----------------------------------------
- 新規に非連結のフォーム[絞込テスト]を作成する。
- 前記のフォーム上にコンボボックス[コンボ1]〜[コンボ4]を配置する。
- 前記のフォーム上にテキストボックス[テキスト1]〜[テキスト6]を配置する。
- コマンドボタン[コマンド1]を配置する。
- [コマンド1]のOnClick/クリック時イベントに、以下の(●サンプルコード●)
プロシージャを記述する。
●サンプルコード●
Private Sub コマンド1_Click
'初期処理
Dim i As Integer
Dim Rst As DAO.Recordset
Set Rst = CurrentDb.OpenRecordset("商品マスタ", dbOpenDynaset)
'検索
Rst.FindFirst "[商品ID] = " & Me.コンボ4.Column(0) & ""
Me.テキスト1 = Rst![商品ID]
Me.テキスト2 = Rst![商品区分]
Me.テキスト3 = Rst![取扱区分]
Me.テキスト4 = Rst![割引有無]
Me.テキスト5 = Rst![商品名]
Me.テキスト6 = Rst![販売価格]
'コンボボックスのクリア
For i = 1 To 4
Me.Controls("コンボ" & i) = ""
Next
'終了処理
Me.Refresh
Rst.Close
Set Rst = Nothing
End Sub
- 各コンボボックスのプロパティを以下のように設定する
-------------------------------------------------------------------------------
コンボ名 集合値ソース
コンボ1 SELECT DISTINCT 商品区分 FROM 商品マスタ ORDER BY 商品区分;
コンボ2 SELECT 商品区分, 取扱区分 FROM 商品マスタ GROUP BY 商品区分,
取扱区分 HAVING (商品区分 = Forms!絞込テスト!コンボ1);
コンボ3 SELECT 商品区分, 取扱区分, 割引有無 FROM 商品マスタ
GROUP BY 商品区分, 取扱区分, 割引有無
HAVING ((商品区分=Forms!絞込テスト!コンボ1)
And (取扱区分=Forms!絞込テスト!コンボ2)
);
コンボ4 SELECT 商品ID, 商品区分, 取扱区分, 割引有無, 商品名 FROM 商品マスタ
WHERE ((商品区分 = Forms!絞込テスト!コンボ1)
And (取扱区分 = Forms!絞込テスト!コンボ2)
And (割引有無 = Forms!絞込テスト!コンボ3)
);
-------------------------------------------------------------------------------
コンボ名 列数 列幅 連結列
コンボ1 1 2cm 1
コンボ2 2 0cm;2cm 2
コンボ3 3 0cm;0cm;2cm 3
コンボ4 5 0cm;0cm;0cm;0cm;2cm 5
-------------------------------------------------------------------------------
●動作確認●
フォームビューに変更し、コンボ1から順番に値を選択していってください。
コンボ4(商品名)を選択した後、コマンドボタン[コマンド1]をクリックします。テキストボックスにコンボボックスで選択したものと同じ値が入っていることを確認して下さい。
●詳細●
サンプルでは、コンボボックスのRowSource/値集合ソース内に直接SQL文を書き込むことでドロップダウンした際の値を設定しています。
複数のColumn(列)をどのように取得するのか、表示するものしないものをどのように設定するのか、どのColumn(列)を値連結させてフィールドのデータとするのか、といったことが処理のポイントです。
今回は非常に少ない数でのテストのため、それほど大きなメリットを感じることは無いと思いますが、選択するデータの数が多くなった時には、その効果はかなり大きなものになるはずです。