Excelの自動化に欠かせないVBA。中でも「キーワードを探して、その行番号を取得したい」という場面はよくあります。例えば、リストの中から特定の値を見つけて処理をしたい、データの整合性をチェックしたいときなどに便利です。
本記事では、VBAのFind
メソッドを使って、指定したキーワードが含まれるセルを探し、その行番号を取得する方法をわかりやすく解説します。初心者の方にも理解しやすいよう、サンプルコード付きで丁寧に説明していきますので、ぜひ参考にしてください。
VBAのFindメソッドとは?
VBAでセルの中から特定の値を検索したい場合、最もよく使われるのがRange.Find
メソッドです。これは、指定した範囲内から検索キーワードを見つけて、最初にヒットしたセルを返してくれます。
構文は次のようになります。
RangeObject.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, SearchFormat)
多くの引数がありますが、必須なのはWhat
(検索するキーワード)だけです。他は必要に応じて使えば問題ありません。
基本的な使い方:キーワードの行番号を取得する
実際に、キーワードを検索してその行番号を取得するサンプルコードを見てみましょう。
Sub FindKeywordRow()
Dim ws As Worksheet
Dim keyword As String
Dim rng As Range
Dim foundCell As Range
Set ws = ThisWorkbook.Sheets("Sheet1") ' 対象のシートを指定
keyword = "売上高" ' 探したいキーワード
Set rng = ws.Range("A1:A100") ' 検索範囲を指定
Set foundCell = rng.Find(What:=keyword, LookIn:=xlValues, LookAt:=xlWhole)
If Not foundCell Is Nothing Then
MsgBox "キーワード '" & keyword & "' は " & foundCell.Row & " 行目にあります。"
Else
MsgBox "キーワード '" & keyword & "' は見つかりませんでした。"
End If
End Sub
このコードでは、シート「Sheet1」のA1からA100の範囲で「売上高」という文字列を探し、見つかった場合はその行番号を表示しています。
LookAt引数の違いに注意しよう
Find
メソッドでは、LookAt
引数にxlWhole
かxlPart
を指定することができます。
xlWhole
:完全一致(セル全体が一致する場合)xlPart
:部分一致(セルの一部にキーワードが含まれていれば一致)
例えば「売上高」というキーワードを検索する場合、セルに「売上高合計」と入っていたらxlWhole
ではヒットしませんが、xlPart
ならヒットします。
大文字・小文字を区別する方法
MatchCase:=True
と指定することで、大文字・小文字を区別した検索が可能になります。
Set foundCell = rng.Find(What:=keyword, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
これを指定しないと、たとえば「Keyword」と「keyword」は区別されません。
検索方向を指定する
検索の方向は、SearchDirection
引数で指定できます。
xlNext
:次のセル(下方向または右方向)xlPrevious
:前のセル(上方向または左方向)
Set foundCell = rng.Find(What:=keyword, SearchDirection:=xlNext)
通常はxlNext
で問題ありません。
検索結果を繰り返し処理したいときは?
同じキーワードが複数ある場合、ループ処理を使ってすべての行番号を取得できます。
Sub FindAllKeywordRows()
Dim ws As Worksheet
Dim keyword As String
Dim rng As Range
Dim firstAddress As String
Dim foundCell As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
keyword = "売上高"
Set rng = ws.Range("A1:A100")
Set foundCell = rng.Find(What:=keyword, LookIn:=xlValues, LookAt:=xlPart)
If Not foundCell Is Nothing Then
firstAddress = foundCell.Address
Do
MsgBox "見つかった行番号: " & foundCell.Row
Set foundCell = rng.FindNext(foundCell)
Loop While Not foundCell Is Nothing And foundCell.Address <> firstAddress
Else
MsgBox "キーワード '" & keyword & "' は見つかりませんでした。"
End If
End Sub
この方法を使えば、リスト中のすべての一致セルの行番号を1つずつ取得できます。
実用的な応用例:該当行を強調表示する
見つけた行を強調表示したい場合には、以下のように色を付けることも可能です。
foundCell.EntireRow.Interior.Color = RGB(255, 255, 0) ' 黄色に塗りつぶし
ループ処理と組み合わせて、複数行を一気にハイライトするのも簡単です。
まとめ
VBAのFind
メソッドは、キーワードを検索して行番号を取得するのに非常に便利な機能です。基本的な使い方に加え、完全一致・部分一致の使い分け、検索方向や大文字・小文字の区別、複数ヒットへの対応など、実用性の高いポイントが多数あります。
本記事で紹介したコードをベースに、ぜひご自身の業務に合わせて応用してみてください。VBAのスキルが上達すると、Excel業務の効率が格段にアップしますよ。