VBA フォーム上でレコードを検索する [VBA]
フォーム上にデータ一覧を表示させ、指定された文字を含むレコードを検索し、そのレコードへ移動する方法です。
この方法を活用する場面があるかどうかは分かりませんが、フォームのRecordsetは(通常)DAOであって、DAOのメソッドが利用できる、と言うことを知っておくと、いろいろ応用が利くと思います。
解説用のフォームです。
連結フォームを帳票フォームで作成し、データの一覧を表示させています。
フォームの上部分の「検索」テキストボックスに文字を入力し、「先頭から検索」ボタンをクリックすると、都道府県名にその文字を含むレコードに移動するようにします。
「先頭から検索」ボタン、「次を検索」ボタンのクリックイベントに、以下のコードを記述します。
Private Sub cmdFind_Click() '先頭から検索 Me.Recordset.FindFirst "TDFKMEI LIKE '*" & Me.txtFind & "*'" If Me.Recordset.NoMatch = True Then MsgBox "見つかりません。", vbExclamation End If End Sub Private Sub cmdNext_Click() '次を検索 Me.Recordset.FindNext "TDFKMEI LIKE '*" & Me.txtFind & "*'" If Me.Recordset.NoMatch = True Then MsgBox "見つかりません。", vbExclamation End If End Sub
検索を行っているのは、
Me.Recordset.FindFirst "TDFKMEI LIKE '*" & Me.txtFind & "*'"
の箇所になります。
Meは現在のフォームを指しています。
フォームのRecordsetのFindFirstメソッドを使用しています。
FindFirst構文は以下のようになります。
FindFirst Criteria
Criteriaには、Where句に記述する条件式を指定します。(Whereは不要です)
ANDやORなどを使って、複数の条件を記述することもできます。
FindFirstは、レコードの先頭から、条件に当てはまるレコードを探します。
見つからなかった場合、NoMatchプロパティがTrueになります。
これを利用して、見つからなかった場合にメッセージを出力しています。
検索テキストボックスに「山」を入力して、「先頭から検索」ボタンをクリックすると、
「山形県」のレコードにレコードセレクタが移動します。
(このフォームは、都道府県CD・都道府県名テキストボックスをEnabled=Falseにしているので、テキストボックスにフォーカスが移動しません。)
FindFirstは先頭から検索するので、何度「先頭から検索」ボタンをクリックしても、「山形県」になります。
山形県の次を検索するには、FindNextを使用します。
構文などはFindFirstと同じです。
FindNextは、現在のレコード位置の、次のレコードから検索を行います。
「山形県」で「次を検索」をクリックすると、「富山県」に移動します。
以降、「次を検索」をクリックする度に、「山梨県」「和歌山県」「岡山県」「山口県」と移動し、さらにクリックすると「見つかりません」のメッセージが表示されます。
Findは、検索開始位置と、検索方向別に、以下の4つのメソッドがあります。
FindFirst・先頭から、末尾に向かって検索
FindLast・末尾から、先頭に向かって検索
FindNext・現在の次のレコードから、末尾に向かって検索
FindPrevious・現在の前のレコードから、先頭に向かって検索
「単票フォーム」でも同じように、レコードを検索して、そのレコードへ移動することができます。
FindFirstを使う注意点として、Recordsetがダイナセットまたはスナップショットでなければなりません。
また、RecordsetにADOを利用している場合は、当然DAOであるFindFirstなどは使えません。
ユーザに提供する機能としては、これはあまり適していないように思います。
場合によるとは思いますが、検索して該当レコードに移動するよりも、条件に当てはまるレコードのみに絞り込んで表示する方が、使い勝手が良いと思います。
どちらかと言えば、レコード一覧などで、特定のレコードに移動したい場合に便利です。
コメント 0