VBAをつかった検索の方法をご紹介します。
セルの検索は日常の業務でもよくつかわれると思いますが、マクロをつかえばより効率的にデータを探し出せるかもしれません。
セルの検索方法|Findメソッドの使い方
セルを検索する|手動で確認
まずは手動でマクロ実行したい動作を確認しておきましょう。
こちらの例をつかいます。
はじめにVBAをつかわないで検索をしてみます。
いずれかの方法で検索をします。
- エクセル画面で「ctrl」と「F」の同時押し
- タブ「ホーム」の右側の「検索と選択」を選択
このような「検索」は日常的にされていると思います。
セルを検索する|Findメソッドの構文
今度はさきほどご紹介した内容をマクロをつかって検索する方法をおさえておきましょう。
検索には「Find」メソッドをつかいます。
オブジェクト.Find(What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])
こちらが構文です。
以下、それぞれの引数についてご紹介します。
What
検索する値を指定します。
After
検索範囲内のセルを指定します。
指定したセルの次のセルから検索が開始されて、指定したセルは最後に検索されます。
省略した場合は、検索範囲の左上のセルから検索が開始されます。
LookIn
検索対象を指定します。
値 | 内容 |
xlFormulas | 数式 |
xlValues | 値 |
xlComments | コメント |
LookAt
検索方法を指定します。
値 | 内容 |
xlWhole | 完全一致 |
xlPart | 部分一致 |
SearchOrder
検索の順序を指定します。
値 | 内容 |
xlByRows | 行の方向 |
xlByColumns | 列の方向 |
「行の方向」の場合の検索の動作としては、1行分の検索がおわったら次の行の検索をするといった順序で進みます。
また、「列の方向」の場合の検索の動作としては、1列分の検索がおわったら次の列の検索をするといった順序で進みます。
SearchDirection
検索の方向を指定します。
値 | 内容 |
xlNext | 「上から下」「左から右」 |
xlPrevious | 「下から上」「右から左」 |
MatchCase
検索文字の区分を指定します。
値 | 内容 |
True | 大文字と小文字を区分する |
False | 大文字と小文字を区分しない |
たとえば、「False」の場合、「A」と「a」はおなじ扱いがされます。
MatchByte
検索文字の区分を指定します。
値 | 内容 |
True | 半角と全角を区分する |
False | 半角と全角を区分しない |
たとえば、「False」の場合、「ア」と「ア」はおなじ扱いがされます。
SearchFormat
書式の検索を指定します。
値 | 内容 |
True | セルの書式を指定する |
False | セルの書式を指定しない |
セルを検索する|Findメソッドの使用例
それでは、さきほどご紹介した内容をマクロをつかって検索をしてみましょう。
先ほどの例を少し変更して検索用のセルを設置しました。
黄色マーキングをしている「セルA1」に値を入力して、それをマクロをつかって検索する方法をとります。
もっとも基本的な検索
ではさっそくコードを書いてみましょう。
まずは必要最低限のマクロで考えてみたいと思います。
Sub test1() Dim target_cell As Variant Set target_cell = Range("A4:B11").Find(what:=Range("A1").Value, LookAt:=xlWhole) target_cell.Select End Sub
実行結果はこちらです。
マクロをつかって「セルA1」に入力した値を選択しました。
「Set」はちょっと理解しにくい内容かと思いますので、とりあえず「セル検索をするとき変数につかうもの」としておきましょう。
すこし便利な検索
つぎに検索対象が見つからなかった場合にそなえてメッセージを表示する機能を追加します。
Sub test2() Dim target_cell As Variant Set target_cell = Range("A4:B11").Find(what:=Range("A1").Value, LookAt:=xlWhole) If Not target_cell Is Nothing Then target_cell.Select Else MsgBox ("検索対象は見つかりませんでした。") End If End Sub
こちらがマクロの実行結果です。
親切なことに見つからなかったときの検索結果をお知らせしてくれます。
セルの検索方法|FindNextメソッドの使い方
「Find」メソッドは特定のひとつのセルを検索するさいにつかいました。
「FindNext」メソッドをつかえば、複数のセルを検索することができます。
セルを検索する|FindNextメソッドの構文
「FindNext」メソッドは、「Find」メソッドとおなじ条件で検索をおこなって検索結果のセルを返します。
オブジェクト.FindNext([After])
引数はこちらです。
引数 | 内容 |
After | 検索範囲のセルを指定する。 指定したセルの「次のセル」から検索が開始されて、指定したセルは最後に検索される。 省略した場合は、検索範囲の左上のセルが指定される。 |
セルを検索する|FindNextメソッドの使用例
こちらの例をつかってご説明します。
「セルA1」に入力した値を「B列から検索」して、該当するセルの「A列の値」をメッセージで表示するマクロをつくります。
さきにコードをご確認ください。
Sub find_next() Dim 範囲 As Variant Dim 検索セル As Variant Dim 開始セル As String Dim 検索セルの番号 As Long 検索セル = Cells(1, 1).Value Set 範囲 = Range("B4:B13") Set 検索セル = 範囲.Find(検索セル, LookAt:=xlPart) '部分一致で検索 If Not 検索セル Is Nothing Then '検索セルがあった場合 開始セル = 検索セル.Address Do 検索セルの番号 = 検索セル.Offset(0, -1) MsgBox ("番号:" & 検索セルの番号 & " が見つかりました。") Set 検索セル = 範囲.FindNext(検索セル) Loop While 検索セル.Address <> 開始セル Else MsgBox ("該当セルが見つかりませんでした。") End If End Sub
実行結果はこちらです。
ここでのポイントは、「指定したセルは最後に検索される」ところです。
番号「1」がメッセージボックスの「4番目」に表示されていることが確認できます。
以下、それぞれのコードについて解説をします。
範囲の指定|2行目と9行目
変数「範囲」を「バリアント型」で定義しています。
検索範囲のセルを指定します。
検索セル|3行目と10行目
変数「検索セル」を「バリアント型」で定義しています。
先ほど指定した「範囲」から「Find」メソッドをつかって「検索セル」に値を代入します。
開始セル|4行目と13行目
変数「開始セル」を「文字列型」で定義しています。
のちほどつかう「Do ~ Loop」での無限ループを防止するために、「検索セル」の情報を記録しています。
この設定がないとプログラムが検索をしつづける状態となってしまい、こちらの例の場合、検索結果の番号が「4→5→9→1→4→5→9→1…」となります。
なお、「address」メソッドはこちらです。
オブジェクト.address([RowAbsolute],[ColumnAbsolute],[ReferenceStyle],[External],[RelativeTo])
指定した範囲のセル番号を取得します。
引数はこちらです(すべて省略可能)。
引数 | 内容 |
RowAbsolute | 「True」…行番号を絶対参照 「False」…行番号を相対参照 |
ColumnAbsolute | 「True」…列番号を絶対参照 「False」…列番号を相対参照 |
ReferenceStyle | セル範囲の参照方法を指定する。 「xlR1C1」…R1C1形式で取得 省略…A1形式で取得 |
External | 「True」…取得した値にブック名とシート名を含む。 「False」…既定値。取得した値にブック名とシート名を含まない。 |
RelativeTo | 相対参照を開始する位置を指定する。 (相対参照かつR1C1形式の場合) |
検索セルの番号|5行目と15行目
変数「検索セルの番号」を「整数型」で定義しています。
検索セルを基準に「Offset(0,-1)」をつかって、1つ左側の列を指定しています。
If ~ Then|12行目
「Find」メソッドで使用した方法とおなじです。
「If Not」…「Not演算子」をつかって「オン」と「オフ」を切り替えています。
「Is Nothing」…オブジェクトに「なにも入っていない状態」です。
Do ~ Loop|14行目から18行目
17行目の「FindNext」で「検索セル」の値を更新をしています。
「Do ~ Loop While」で「検索セル」と「開始セル」の値が一致しないかぎり、ループを継続させています。
「検索セル」と「開始セル」の値が一致した時点で、繰返処理が終了します。
なお、基本的な繰返処理「Do ~ Loop」の使い方についてはこちらをご確認ください。
まとめ
VBAをつかった検索の方法についてご紹介をしました。
こちらでご紹介した内容をそのままつかうだけでは「業務の効率化」にはすぐに結びつかないかと思います。
しかし、少しご紹介した条件分岐「If ~ Then」や繰返処理「Do ~ Loop」などと組み合わせてつかうことによって、検索の効率化がいっきに高まる可能性がありますので、まずはVBAをつかった基本的な検索方法のイメージをつかんでいただければと思います。