●概要●
データベースの検索をフォームから行う場合、通常は検索したいフィールドと同じ数の検索用テキストボックスやコンボボックスを配置します。
しかし、エンドユーザーがPCに慣れていない場合など、検索用テキストボックスを極力減らしたい場合もあります。
今回は、そのような場合に1つの検索用テキストボックスで複数のフィールドを検索する方法を説明します。
●準備●
- 以下の構成の[住所録]テーブルを作成します
----------------------------------------
フィールド名 データ型
ID オートナンバー(主キー)
氏名 テキスト型
電話番号 テキスト型
会社名 テキスト型
----------------------------------------
- 上記テーブルをレコードソースにした単票形式のフォームを作成します。
さらにフォームヘッダーの部分にテキストボックスとコマンドボタンを貼
り付け、それぞれ[検索] [検索開始]という名前を付けます。
- コマンドボタン[検索開始]のOnClick/クリック時イベントに、以下のプロ
シージャを記述します。
●サンプルコード●
Private Sub 検索開始_Click()
Dim SearchValue As String '検索値格納変数
Dim Rst As DAO.Recordset 'レコードセット
'初期設定
SearchValue = Me.検索
Set Rst = Me.RecordsetClone
Rst.MoveFirst
'検索値が数字なのか文字列なのかの判断
If IsNumeric(Left(SearchValue, 2)) Then
'入力されたものが電話番号の場合
Rst.FindFirst "[電話番号] = '" & SearchValue & "'"
'検索の成功チェック
If Rst.NoMatch Then
GoTo SearchFailer:
Else
GoTo SearchSuccess:
End If
Else
'入力されたものが氏名か会社名の場合
'まずは氏名を検索
Rst.FindFirst "[氏名] = '" & SearchValue & "'"
'検索の成功チェック
If Rst.NoMatch Then
'会社名を検索
Rst.FindFirst "[会社名] = '" & SearchValue & "'"
'検索の成功チェック
If Rst.NoMatch Then
GoTo SearchFailer:
Else
GoTo SearchSuccess:
End If
Else
GoTo SearchSuccess:
End If
End If
SearchSuccess:
Me.Bookmark = Rst.Bookmark
Me.氏名.SetFocus
GoTo Sub_Exit:
SearchFailer:
MsgBox "検索に失敗しました" & vbCrLf & _
"もう一度検索値を入力してください" _
, vbInformation + vbOKOnly, "検索失敗"
Me.検索 = Null
Me.検索.SetFocus
GoTo Sub_Exit:
Sub_Exit:
Rst.Close
Set Rst = Nothing
End Sub
●動作確認●
テーブルに適当なデータを入力した上で、フォームを開き検索テキストボックスに氏名・電話番号・会社名のいずれかを入力して、検索開始ボタンを押します。
その時、入力した値が氏名・電話番号・会社名のどれであっても検索していることを確認して下さい。
●詳細●
サンプルでは連結フォームを使用していますので、検索の元になるレコードセットをRecordsetCloneメソッドで取得しています。非連結フォームの場合はここでレコードセットを明示的に作成すればOKです。
最初に入力された検索値の左2文字を取得して、電話番号であるかそうでないかを判断しています。ここでは最初の2文字が数字だった場合電話番号であると判断しています。
次にFindFirstメソッドを使用して実際にレコードの検索を行います。
Find系のメソッドが成功したかどうかを調べるためには、レコードセットのNoMatchプロパティを使用します。これがTrueであれば検索成功、Falseであれば検索が失敗したという意味です。
検索が成功した場合は、レコードセットのBookMarkプロパティとMeで表現されるフォームのBookMarkプロパティを同調させ、レコードを移動させています。
Find系のメソッドを使用して検索する場合、レコードセットのどの位置にカーソルがあるかということが非常に重要です。
例えばFindFirstを使用して全件検索するならば、必ず「Rst.MoveFirst」などとして、カーソルの位置をレコードセットの先頭にもっていく必要があります。そうしないと、現在カーソルのある位置から後ろのレコードのみが検索対象となってしまうからです。
もちろん、それを利用して重複データを複数回検索させることも出来ます。
※ 詳細はHelpのFindNextメソッドの項を参照して下さい。
●備考●
Access2000の場合、デフォルトではDAOに参照設定されていません。
Visual Basic Editor(VBE)を開き、メニューの[ツール]−[参照設定]から、Microsoft DAO 3.6 Object Libraryにチェックを入れて下さい。
その際にMicrosoft ActiveX Data Object 2.1 Libraryよりも上に、DAOのチェックを持ってきて下さい。