同一検索キー項目で複数の検索キーで検索します。
例えば、書名で検索する場合「日本 世界」として検索すると、2つのキーが含まれる書名が検索されます。
検索キー数は、同一項目内で書名で3つ、著者で2つ、出版社では1つまでとします。
(1) 検索キーワードの区切り文字であるスペースを全角から半角スペースに統一する。
ここではReplace関数を使用します。
【書式】 Replace関数は文字列内の特定の単語や語句を、指定された単語や語句に置換します。
Replace(対象文字列,置換前文字列,置換文字列)
例 str = Replace(検索ワード, " ", " ")
(2) 半角スペースで区切られた複数の検索キーを3つの検索キー変数に分ける。
Split関数で配列に振り分けます。そして、わかりやすい名前がついた3つの変数に代入します。
「配列」とは、同じ型の変数を同じような目的で利用する場合に便利です。
配列は変数を1つ1つ定義するのではなく、まとめて定義することができます。
詳しくは下のURLを参照してください。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_array.html
【書式】 Split関数は、ある区切り文字で区切られた文字列をその区切り文字で区切り、区切られた各文字列を一次元配列として返します。
Split(元の文字列 , 区切り文字)
例 ArrayStr = Split(str, " ")
配列を定義するには、Dim ArrayStr As Stringと書きます。ただし、今回は、要素数を固定することはできず、動的配列にします。Redimより、動的に配列のメモリを割り当てることができます。
データを残して、再割り当てを行う場合は、ReDim Preserveを使用します。
ReDim Preserve ArrayStr(2)とすると3つの器が作られますので以下の代入文でも問題なく実行されます。
しかし、この文がないと例えば分割後1つ又は2つしかデータがないときにはArrayStr(2)は存在しないのでエラーになります。
- 検索キー1 = ArrayStr(0)
- 検索キー2 = ArrayStr(1)
- 検索キー3 = ArrayStr(2)
(3) 3つにわかれた検索キーを使って検索するには実用編(前半)の「あいまいな検索条件を設定( Like 演算子を使用 )」を使わずもっと簡単な検索であるInStr関数を今回は使います。
【書式】 Instr関数は文字列内で特定の文字列を検索し、最初に検出された文字の位置を返します。
InStr(検索開始位置,"検索対象文字列","検索文字列",比較モード)
【引数の説明】
検索開始位置は省略可能です。検索を開始する位置を指定します。
検索対象文字列 には、検索の対象となる文字列を指定します。
検索文字列 には、検索対象文字列の中から検索する文字列を指定します。
比較モード は省略可能です。文字列を比較するモードを指定します。
例 InStr(Ws図書.Cells(ii, "B"), 検索キーワード1)
見つかったら1以上の値を返すが見つからなかった場合は0を返す。また、検索文字列(検索キー)になにもデータが入っていない場合でも1の値を返す。これでif文の条件がand演算子のみでまとめることができます。検索キーが3つすべてはいってなくても判定できるのでInStr関数を使用します。
- If InStr(Ws図書.Cells(行, "B"), 検索キーワード1) > 0 And _
- InStr(Ws図書.Cells(行, "B"), 検索キーワード2) > 0 And _
- InStr(Ws図書.Cells(行, "B"), 検索キーワード3) > 0 Then
- Debug.Print ii, Ws図書.Cells(行, "B")
- 検索件数 = 検索件数 + 1
- End If
もちろん、検索書名欄に何も入っていないときは検索する必要はありません。
なお、サンプルデータbooks-search.xlsm「図書検索.xlsm」の標準モジュール「T05図書検索_キーワード複数」に参考コードを掲載しておきます。
【ワンポイント】
マクロの実行をF5 キーで行う場合、メイン処理のSubプロシジャー内、または先頭部分にカーソルがある必要があります。