実践!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コードでした。
今回のサンプルファイルは以下のリンクからダウンロード可能です。