1つの検索用テキストボックスで複数のフィールドを検索する
  データベースの検索をフォームから行う場合、通常は検索したいフィールド
と同じ数の検索用テキストボックスやコンボボックスを配置します。

  しかし、エンドユーザーがPCに慣れていない場合など、検索用テキストボッ
クスを極力減らしたい場合もあります。

  今回は、そのような場合に1つの検索用テキストボックスで複数のフィールド
を検索する方法を説明します。


● 準備 ●

(1) 以下の構成の[住所録]テーブルを作成します
    ----------------------------------------
    フィールド名        データ型
    ID                  オートナンバー(主キー)
    氏名                テキスト型
    電話番号            テキスト型
    会社名              テキスト型
    ----------------------------------------

(2) 上記テーブルをレコードソースにした単票形式のフォームを作成します。
    さらにフォームヘッダーの部分にテキストボックスとコマンドボタンを貼
    り付け、それぞれ[検索] [検索開始]という名前を付けます。

      

(3) コマンドボタン[検索開始]の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の
チェックを持ってきて下さい。

Access97/2000



戻る


Excel Word Access VBA! モーグ