テキストボックスに1文字ずつ入力していったとき、サブフォームに表示されるレコードをそれらの文字を含むものだけに絞り込んでいく例です。最初に1文字入力したらその1文字を含むものだけ、2文字目を入力したらその2文字を含むだけというように、順次絞り込んでいきます。
ここでは、検索用の文字を入力するためのテキストボックスとサブフォームというシンプルなデザインのフォームを例に説明します。
- メインフォームとなる新しいフォームを作成します。ここではフォーム名を「検索サンプル」とします。
- 検索対象となるデータを表示するサブフォームを作成し(この時点では全件表示するもの)、メインフォームに配置します。ここでは”リンクフィールド”の設定は行いません。
- メインフォームに検索用の文字を入力するためのテキストボックスを1つ配置します。コントロールソースを持たない”非連結”で、名前は「検索キーワード」とします。
- 次に、サブフォームの「レコードソース」プロパティでクエリを設定します。クエリの内容は次のようなものとします。
デザインビュー:
SQL文:
SELECT * FROM mtbl従業員マスタ
WHERE 氏名 Like "*" & [Forms]![検索サンプル]![検索キーワード].[Text] & "*" OR
フリガナ Like "*" & [Forms]![検索サンプル]![検索キーワード].[Text] & "*" OR
住所 Like "*" & [Forms]![検索サンプル]![検索キーワード].[Text] & "*"
このクエリは、基本構造としては「mtbl従業員マスタ」テーブルから「氏名が〇〇を含む」または「フリガナが〇〇を含む」または「住所が〇〇を含む」レコードを抽出するものですが、特徴として次のような点があります。
■フォーム上のコントロールの参照
- 抽出条件としてメインフォーム上のコントロールを参照してします。『[Forms]![検索サンプル]![検索キーワード]』の部分がその式です。これによって、フォーム「検索サンプル」の中にある「検索キーワード」コントロールに入力されている値を条件として絞り込みできるようになります。
■「Text」プロパティの参照
- テキストボックスでは、データを入力して、Enterキーを押したり他のコントロールにフォーカスを移動させたりといったタイミングでテキストボックスへの入力値が確定します。「テキストボックス名」のみ、あるいは明示的に「テキストボックス名.Value」とう記述で「Value」プロパティを参照することで、その入力値を取得することができます。
- 一方、今回の操作である”1文字入力するたび”というのは、まだテキストボックス全体の入力値が確定していない状態です。「Value」プロパティではその途中状態の値は取得できません。そのような場合には「Text」プロパティを参照する必要があります。
- そこで、抽出条件を最終的に『[Forms]![検索サンプル]![検索キーワード].[Text]』というようにします。
- この時点では、”リンクフィールド”とは違い、検索用のテキストボックスとサブフォームが自動的に連動するわけではありません。そこでVBAのプログラムでその動きを加えてやります。
それには「検索キーワード」のテキストボックスに次のような「Change/変更時」イベントプロシージャを記述します。
Private Sub 検索キーワード_Change()
'[検索キーワード]テキストボックスの変更時
'サブフォームを再クエリ
Me!検索サンプル_sub.Requery
End Sub
「Change/変更時」イベントは1文字単位での編集が行われるたびに発生しますので、それによって”1文字入力するたび”という操作を検出し、サブフォームの表示内容をその時点の「Text」プロパティを使ったものに更新します。
実行例:
- 初期状態
- 「ヨ」と1文字目を入力したとき
- 「コ」と2文字目を入力したとき
- 「東京都」に書き換えたとき
- 「港」の1文字を追加したとき
- さらに「区白」を追加したとき
|