実践!Excelマクロ ~複数条件(AND条件)の検索方法

かなり久しぶりの投稿になり申し訳ありません。
事務所も変わり、気分も一新して改めてブログを更新していこうと思います。

以前アップしたExcelの検索フォームで複数検索条件のご要望がありましたので、今回はFindメソッドを使った応用編で複数条件(AND条件)の検索サンプルを説明します。

尚、細かな条件等は前回の記事をご参考下さい。

1.動作イメージ

動作イメージは以下の通りです。

140121_2

検索ボタンをクリックすると指定したキーワードが全て含まれているセルの値をフォーム内のリストボックスにピックアップするようにします。

2.検索用フォームを作成

サンプルではフォームのデザインは以下のようなコントロール名で作成しています。

140121_3

3.検索用VBAコード

検索ボタンをクリックした際の動作を設定します。
VBAコードは以下の通りです。

'*****************************************************
'検索処理
'*****************************************************
Private Sub cmdSerch_Click()
    Dim Obj As Object
    Dim wAddST As Variant
    Dim wAddress As Variant
    Dim wName As Variant
    Dim i As Integer
    Dim wlstCount As Integer

    With Worksheets("Sheet1")

        'リストボックスをクリア
        lstName.RowSource = ""
        lstName.Clear

        'キーワードが未入力の場合処理しない
        If txbName1.Value = "" Then Exit Sub

        'キーワード2を飛ばして3を入力させない
        If txbName2.Value = "" And txbName3.Value <> "" Then
            MsgBox "キーワード2を入力して下さい。", _
                                        vbOKOnly + vbInformation, "検索"
        End If

        'キーワード1の値で検索
        Set Obj = .Cells.Find( _
                            What:=txbName1.Value, _
                            LookIn:=xlValues, _
                            lookat:=xlPart, _
                            MatchByte:=False)

        '検索対象が存在する場合
        If Not Obj Is Nothing Then
            '検索にヒットした先頭のセルのアドレスをセット
            wAddST = Obj.Address

            '検索の繰り返し処理
            Do
                '検索にヒットしたセルのアドレスをセット
                wAddress = Obj.Address

                '検索にヒットしたセルの値を取得
                wName = .Range(wAddress).Value

                '検索条件:キーワード1のみの場合
                If txbName2.Value = "" And txbName3.Value = "" Then
                    'リストボックスに追加
                    lstName.AddItem wName
                End If

                '検索条件:キーワード1、2の場合
                If txbName2.Value <> "" And txbName3.Value = "" Then
                    '検索した値にキーワード2の値が含まれているか判定
                    If InStr(wName, txbName2.Value) <> 0 Then
                        'リストボックスに追加
                        lstName.AddItem wName
                    End If
                End If

                '検索条件:キーワード1、2、3の場合
                If txbName2.Value <> "" And txbName3.Value <> "" Then
                    '検索した値にキーワード2、3の値が含まれているか判定
                    If InStr(wName, txbName2.Value) <> 0 And _
                        InStr(wName, txbName3.Value) <> 0 Then
                            'リストボックスに追加
                            lstName.AddItem wName
                    End If
                End If

                '次の検索を行う
                Set Obj = .Cells.FindNext(Obj)

                '最初にヒットしたアドレスと同じ場合は処理を終了
                If Obj.Address = wAddST Then Exit Do
            Loop
        End If

    End With

End Sub

4.VBAコードの解説

Findメソッドでは複数の検索条件が設定出来ない為、InStr関数を使って検索した結果にキーワードが含まれているか調べます。

InStr関数とは(MSDN参照)
ある文字列の中から指定した文字列を検索し、最初に見つかった文字列の開始位置を示す整数型 (Integer) の値を返します。

上記の通り、InStr関数を使えばキーワードが含まれている場合は0以外の数値が帰ってきます。
また、キーワードが無い場合は0が帰ってきます。

今回はこの特性を応用して機能を実装します。(56行、65~66行)

'検索した値にキーワード2の値が含まれているか判定
If InStr(wName, txbName2.Value) <> 0 Then
    'リストボックスに追加
    lstName.AddItem wName
End If

検索関連エントリー

以上、今回は複数条件(AND条件)で検索する為のVBAコードでした。

今回のサンプルファイルは以下のリンクからダウンロード可能です。