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

かなり久しぶりの投稿になり申し訳ありません。
事務所も変わり、気分も一新して改めてブログを更新していこうと思います。
以前アップしたExcelの検索フォームで複数検索条件のご要望がありましたので、今回はFindメソッドを使った応用編で複数条件(AND条件)の検索サンプルを説明します。
尚、細かな条件等は前回の記事をご参考下さい。
1.動作イメージ
動作イメージは以下の通りです。
検索ボタンをクリックすると指定したキーワードが全て含まれているセルの値をフォーム内のリストボックスにピックアップするようにします。
2.検索用フォームを作成
サンプルではフォームのデザインは以下のようなコントロール名で作成しています。
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関数を使えばキーワードが含まれている場合は0以外の数値が帰ってきます。
また、キーワードが無い場合は0が帰ってきます。
今回はこの特性を応用して機能を実装します。(56行、65~66行)
'検索した値にキーワード2の値が含まれているか判定
If InStr(wName, txbName2.Value) <> 0 Then
'リストボックスに追加
lstName.AddItem wName
End If
検索関連エントリー
以上、今回は複数条件(AND条件)で検索する為のVBAコードでした。
今回のサンプルファイルは以下のリンクからダウンロード可能です。




