【2026年7月最新】VBA Find・FindNextで検索する完全ガイド|完全一致・部分一致・複数ヒット・落とし穴まで網羅
この記事の内容
ExcelのVBAでセルを検索するとき、多くの方がFindメソッドの使い方で詰まります。「完全一致で検索したいのに部分一致でもヒットする」「FindNextでループしたら無限ループになった」「なぜか同じコードが動いたり動かなかったりする」——こういった問題はすべて、FindメソッドのVBA特有の仕様を知らないことが原因です。
この記事では、VBAのFind・FindNext・FindPreviousを完全に理解するために必要な知識を一冊の参考書レベルで整理します。特に「引数の設定が前回の実行結果を引き継いでしまう」という、ほとんどの入門記事が触れていない重大な落とし穴も詳しく解説します。
01 BASICS Findメソッドとは(基本と仕組み) ForループとFindの違い、どちらを使うべき場面
VBAのFindメソッドは、指定したセル範囲の中から条件に一致するセルを検索して、最初に見つかったセルをRangeオブジェクトとして返すメソッドです。Excelの「Ctrl+F」(検索ダイアログ)をVBAからプログラムで操作するイメージです。
📚 用語解説
Findメソッド:RangeオブジェクトのメソッドでRange.Find(What, ...)という形で使う。指定した文字列・数値・日付などを検索範囲内で探し、最初に見つかったセルをRangeオブジェクトで返す。見つからない場合はNothingを返す。ExcelのCtrl+Fと同じ機能をVBAから呼び出せる。
| 方法 | メリット | デメリット | 推奨場面 |
|---|---|---|---|
| For Eachループ | コードが直感的・制御が自由 | セル数が多いと低速 | シンプルな処理・全セル走査 |
| Find / FindNext | 高速(内部エンジン使用)・指定行/列方向検索 | 引数の引き継ぎ問題・初心者には難しい | 大量データ・部分一致・特定方向検索 |
| Filterオートフィルタ | UIと連動・視覚的 | 検索後の処理が複雑 | 一時的なフィルタリング |
| Match関数(WorksheetFunction) | 一致位置を数値で返す | 一致セル全部は取れない | インデックス取得・VLOOKUP代替 |
FindメソッドはExcel内部の検索エンジンを直接呼び出すため、For Eachループで全セルを走査するより数十倍高速に動作します。特に数千行以上のデータを扱う場合は、FindNext(複数ヒット検索)との組み合わせが必須です。
Cells.Find(...) で全シート検索、Columns("A").Find(...) でA列のみ、Range("B:D").Find(...) でB〜D列のみ、というように検索範囲を柔軟に絞り込めます。大きなシートでは検索範囲を絞るほど高速になります。
02 ARGUMENTS Findメソッドの引数9個を完全解説 What以外の省略可能な引数の意味と使い分け
Findメソッドの基本構文は以下の通りです。Whatだけが必須引数で、残り8個はすべて省略できます。
' Findメソッドの完全構文
Range("検索範囲").Find(
What, ' 【必須】検索する値
After, ' 検索を開始するセル(このセルの「次」から開始)
LookIn, ' 検索対象(値/数式/コメント)
LookAt, ' 一致方法(完全一致/部分一致)
SearchOrder, ' 検索方向(行方向/列方向)
SearchDirection,' 検索の進行方向(前方/後方)
MatchCase, ' 大文字小文字を区別するか
MatchByte, ' 全角半角を区別するか
SearchFormat ' 書式条件で検索するか
)
| 引数名 | 定数・値の例 | 意味 | 省略時のデフォルト |
|---|---|---|---|
| What | "東京", 100, "2026*" | 検索する値(ワイルドカード使用可) | 省略不可(必須) |
| After | Range("A1") | このセルの「次」から検索開始 | 選択範囲の最初のセル |
| LookIn | xlValues, xlFormulas, xlComments | 検索対象(セルの値/数式/コメント) | 前回の設定(要注意!) |
| LookAt | xlWhole, xlPart | 完全一致 / 部分一致 | 前回の設定(要注意!) |
| SearchOrder | xlByRows, xlByColumns | 検索順序(行ごと / 列ごと) | 前回の設定(要注意!) |
| SearchDirection | xlNext, xlPrevious | 前方(下)へ / 後方(上)へ進む | xlNext(前方) |
| MatchCase | True, False | 大文字小文字区別(True=区別) | 前回の設定(要注意!) |
| MatchByte | True, False | 全角半角区別(True=区別) | 前回の設定(要注意!) |
| SearchFormat | True, False | 書式で検索するか | False |
LookIn・LookAt・SearchOrder・MatchCase・MatchByteの5引数は、省略すると前回のFindまたはCtrl+F検索ダイアログの設定値が使われます。これが「同じコードなのに結果が変わる」原因になります。詳しくはSection7で解説します。
📚 用語解説
LookIn:Findメソッドの引数で、何を対象に検索するかを指定する。xlValues(セルに表示されている値)、xlFormulas(数式そのもの。数式バーの内容)、xlComments(コメント・メモの内容)の3種類。計算結果の数値で検索したいならxlValues、数式文字列で検索したいならxlFormulas。
03 BASIC USE 完全一致・部分一致・Nothing判定の基本 最も頻繁に使う3パターンのコードと解説
3-1. 完全一致検索(LookAt:=xlWhole)
Sub FindExactMatch()
Dim rng As Range
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 完全一致で "東京都" を検索
' LookAt:=xlWhole で完全一致を明示する(省略すると前回設定が引き継がれる)
Set rng = ws.Range("A:A").Find(
What:="東京都",
LookAt:=xlWhole,
LookIn:=xlValues
)
' Nothing チェック(見つからない場合のハンドリング)
If rng Is Nothing Then
MsgBox "「東京都」は見つかりませんでした"
Else
MsgBox "「東京都」が見つかりました: " & rng.Address & " (行=" & rng.Row & ")"
rng.Select ' 見つかったセルを選択
End If
End Sub
📚 用語解説
xlWhole / xlPart:VBA定数。xlWhole(値=1)は完全一致で「セルの内容が検索文字列と完全に一致するセル」のみ返す。xlPart(値=2)は部分一致で「セルの内容に検索文字列が含まれるセル」を返す。例: 検索語「東京」でxlWholeは「東京」だけ、xlPartは「東京都」「東京駅」なども返す。
3-2. 部分一致検索(LookAt:=xlPart)
Sub FindPartialMatch()
Dim rng As Range
Set rng = ActiveSheet.Cells.Find(
What:="株式会社",
LookAt:=xlPart, ' 部分一致
LookIn:=xlValues
)
If Not rng Is Nothing Then
MsgBox "最初のヒット: " & rng.Value & " (行:" & rng.Row & ")"
End If
End Sub
' ワイルドカードも使える(LookAtの設定に注意)
Sub FindWithWildcard()
Dim rng As Range
' "*2026*" で2026を含む任意の文字列を検索
Set rng = ActiveSheet.Range("A:A").Find(
What:="*2026*",
LookAt:=xlWhole, ' ワイルドカード使用時はxlWholeが安全
LookIn:=xlValues
)
If Not rng Is Nothing Then
MsgBox "発見: " & rng.Value
End If
End Sub
What引数に「*」(任意の文字列)や「?」(任意の1文字)のワイルドカードが使えます。「*東京*」で「東京」を含む文字列、「??株式会社」で2文字+株式会社の検索が可能です。ワイルドカードを使う場合はLookAt:=xlWholeの方が結果が予測しやすいです。
検索範囲とFindを
呼び出す
見つからない場合
Nothingを返す
rng.Address・
rng.Value等で
セル情報取得
次を検索
複数ヒットが
必要な場合のみ
04 FINDNEXT FindNextで複数ヒットを検索する 無限ループ対策付きのDo Loopテンプレート
Findメソッドは最初の1件しか返しません。複数のセルをすべて取得したい場合は、FindNextメソッドを組み合わせてDo Loopで繰り返します。
FindNextは検索範囲の末尾まで来ると自動的に先頭に戻って検索を続けます。終了条件を設定しないと永遠に回り続けるため、「最初に見つかったセルのアドレスを保存して、再度同じアドレスに来たらループを抜ける」という終了条件が必須です。
Sub FindNextMultiple()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim rng As Range
Dim firstAddr As String ' 最初に見つかったアドレスを記録する
' 最初のFindで1件目を取得
Set rng = ws.Columns("A").Find(
What:="東京",
LookAt:=xlPart,
LookIn:=xlValues
)
' 1件も見つからない場合は終了
If rng Is Nothing Then
MsgBox "検索結果なし"
Exit Sub
End If
' 最初に見つかったアドレスを保存(ループ終了判定に使う)
firstAddr = rng.Address
Dim hitCount As Long
hitCount = 0
' 無限ループ対策付きのDo Loop
Do
hitCount = hitCount + 1
Debug.Print hitCount & "件目: " & rng.Address & " / " & rng.Value
' 任意の処理(例: 背景色を変える)
rng.Interior.ColorIndex = 6 ' 黄色
' 次のヒットを検索
Set rng = ws.Columns("A").FindNext(rng)
' 最初のセルに戻ってきたらループ終了
Loop While Not rng Is Nothing And rng.Address <> firstAddr
MsgBox hitCount & "件見つかりました"
End Sub
📚 用語解説
FindNextメソッド:RangeオブジェクトのメソッドでRange.FindNext(After)という形で使う。Findで最初の1件を見つけた後、同じ検索条件で次のヒットを順番に取得できる。FindNextはSearchDirection:=xlNextで前方(下)方向に進む。After引数には「前回見つかったセル」を渡す。
05 FINDPREVIOUS FindPreviousで逆順検索する 下から上へ検索する方法と使い所
Findメソッドにはデフォルトで上から下(前方方向)へ検索するほかに、FindPreviousで下から上(後方方向)へ検索する方法があります。また、Find自体にSearchDirection引数で方向を指定することもできます。
' ===== FindPreviousを使って逆順に検索 =====
Sub FindPreviousExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim rng As Range
Dim firstAddr As String
' まず最初の1件を取得(通常のFindで下から順に返す起点を決める)
Set rng = ws.Columns("A").Find(
What:="東京",
LookAt:=xlPart,
LookIn:=xlValues,
SearchDirection:=xlPrevious ' ← 後方(上方向)検索
)
If rng Is Nothing Then
MsgBox "見つかりませんでした"
Exit Sub
End If
firstAddr = rng.Address
Dim results() As String
Dim count As Long
count = 0
Do
count = count + 1
ReDim Preserve results(count - 1)
results(count - 1) = rng.Address & "(" & rng.Value & ")"
Set rng = ws.Columns("A").FindPrevious(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddr
MsgBox count & "件 (逆順): " & Join(results, ", ")
End Sub
A列の最後に入力されたデータ行を探す場合、「Find + SearchDirection:=xlPrevious」または「FindPrevious」を使うと、最後のデータがある行番号を素早く取得できます。Cells(Rows.Count,"A").End(xlUp).Row との使い分けは、「見つかったセルの値も必要かどうか」で判断しましょう。
06 MULTI COND 複数条件(OR検索・AND検索)の実装 2つ以上のキーワードでORまたはAND検索するコードパターン
6-1. OR検索(どちらかに一致するセルを探す)
「AまたはBを含むセル」を検索するOR検索は、キーワードごとに独立したFindNextループを実行し、結果をマージする方法が最も確実です。
Sub OrSearch()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim keywords() As String
keywords = Array("東京", "大阪") ' ← OR検索する複数キーワード
Dim hitAddrs As New Collection ' 重複しないようコレクションで管理
Dim kw As Variant
For Each kw In keywords
Dim rng As Range
Dim firstAddr As String
Set rng = ws.Columns("A").Find(
What:=kw,
LookAt:=xlPart,
LookIn:=xlValues
)
If Not rng Is Nothing Then
firstAddr = rng.Address
Do
' 重複チェックしてからコレクションに追加
Dim isDup As Boolean
isDup = False
Dim addr As Variant
For Each addr In hitAddrs
If addr = rng.Address Then isDup = True: Exit For
Next addr
If Not isDup Then hitAddrs.Add rng.Address
Set rng = ws.Columns("A").FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddr
End If
Next kw
MsgBox "OR検索ヒット数: " & hitAddrs.Count & "件"
End Sub
6-2. AND検索(両方の条件を満たすセルを探す)
「AとBの両方を含むセル」を探すAND検索は、Findで一方のキーワードのヒットを取得しつつ、InStr関数でもう一方のキーワードが含まれるかを追加チェックするパターンが最もシンプルです。
Sub AndSearch()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim keyword1 As String: keyword1 = "株式会社" ' 条件1
Dim keyword2 As String: keyword2 = "東京" ' 条件2
Dim rng As Range
Dim firstAddr As String
' まずkeyword1でFindNextループ
Set rng = ws.Columns("A").Find(
What:=keyword1,
LookAt:=xlPart,
LookIn:=xlValues
)
If rng Is Nothing Then
MsgBox "「" & keyword1 & "」が見つかりませんでした"
Exit Sub
End If
firstAddr = rng.Address
Dim hitCount As Long: hitCount = 0
Do
' InStr で keyword2 も含まれているか確認(AND条件)
If InStr(rng.Value, keyword2) > 0 Then
hitCount = hitCount + 1
rng.Interior.ColorIndex = 4 ' 緑でマーク
Debug.Print "AND一致: " & rng.Address & " = " & rng.Value
End If
Set rng = ws.Columns("A").FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddr
MsgBox "AND検索ヒット数: " & hitCount & "件"
End Sub
📚 用語解説
InStr関数:ある文字列の中に別の文字列が含まれているか調べるVBA組み込み関数。InStr("株式会社東京", "東京")は、"東京"が何文字目から始まるかの位置番号を返す(この例では5)。含まれない場合は0を返す。InStr(...) > 0 でTrue/False判定ができる。AND検索に多用される。
07 PITFALL 【重要】引数の設定が前回の値を引き継ぐ罠 ほとんどの入門記事が触れない、Find最大の落とし穴
VBAのFindメソッドで最も多くの人が嵌まる罠が、LookIn・LookAt・SearchOrder・MatchCase・MatchByteの5引数を省略すると、前回のFindまたはCtrl+F検索ダイアログの設定値がそのまま使われるという仕様です。
LookAt を省略したコードを書いたとします。ある日、手動でCtrl+Fを使って「セル内容が完全に一致するもの」を探したとします。その後にマクロを実行すると、LookAt が xlWhole(完全一致)になります。しかし別の日に Ctrl+F で「セルの内容の一部として検索」を使っていた場合は xlPart(部分一致)になります。全く同じコードなのに結果が変わるのはこのためです。
' ===== 問題のあるコード(LookAtを省略している) =====
Sub BadFind()
' LookAt を省略 → 前回の設定(Ctrl+FやFindの残存値)が使われる
Dim rng As Range
Set rng = Cells.Find(What:="東京都")
If Not rng Is Nothing Then
MsgBox "見つかった: " & rng.Value
End If
End Sub
' ===== 安全なコード(引数を全部明示する) =====
Sub SafeFind()
' 全引数を明示 → 環境に左右されない安定したコード
Dim rng As Range
Set rng = Cells.Find(
What:="東京都",
LookIn:=xlValues, ' ← 明示: セルの値を対象
LookAt:=xlWhole, ' ← 明示: 完全一致
SearchOrder:=xlByRows, ' ← 明示: 行ごとに検索
MatchCase:=False, ' ← 明示: 大文字小文字は区別しない
MatchByte:=False ' ← 明示: 全角半角は区別しない
)
If Not rng Is Nothing Then
MsgBox "見つかった: " & rng.Value
End If
End Sub
解決策は単純明快です。Findを使うときは省略せず全引数を明示的に指定するだけです。毎回5引数を書くのが面倒なら、ラッパー関数を作って引数のデフォルト値を明示的に固定する方法も有効です。
' ===== 引数明示の省力化: ラッパー関数を作る =====
' 毎回SafeFindを呼ぶだけでデフォルト引数が保証される
Function SafeFind(rng As Range, what As String, _
Optional lookAt As XlLookAt = xlWhole, _
Optional matchCase As Boolean = False) As Range
Set SafeFind = rng.Find(
What:=what,
LookIn:=xlValues,
LookAt:=lookAt,
SearchOrder:=xlByRows,
MatchCase:=matchCase,
MatchByte:=False
)
End Function
' 使い方(常に同じ引数設定が保証される)
Sub UseWrapper()
Dim result As Range
Set result = SafeFind(ActiveSheet.Columns("A"), "東京都")
If Not result Is Nothing Then
MsgBox "発見: " & result.Address
End If
End Sub
08 MULTI SHEET 複数シートをまたいだ検索の実装 全シート横断でキーワードを検索するテンプレートコード
Findメソッドは1つのRangeオブジェクト内しか検索できないため、ブック内の全シートを横断して検索したい場合は全シートをFor Eachで回しながらFindを呼ぶ設計が必要です。
Sub SearchAllSheets()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim searchWord As String
searchWord = "東京"
Dim ws As Worksheet
Dim rng As Range
Dim firstAddr As String
Dim totalHits As Long
totalHits = 0
' 全シートをループ
For Each ws In wb.Worksheets
Dim searchRange As Range
Set searchRange = ws.Cells ' シート全体を対象
Set rng = searchRange.Find(
What:=searchWord,
LookIn:=xlValues,
LookAt:=xlPart,
SearchOrder:=xlByRows,
MatchCase:=False,
MatchByte:=False
)
If Not rng Is Nothing Then
firstAddr = rng.Address
Do
totalHits = totalHits + 1
Debug.Print "【" & ws.Name & "】" & rng.Address & ": " & rng.Value
' 検索結果をハイライト
rng.Interior.ColorIndex = 6 ' 黄色
Set rng = searchRange.FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddr
End If
Next ws
MsgBox "全シート検索完了: 「" & searchWord & "」が " & totalHits & "件見つかりました"
End Sub
Worksheets
全シートを
1枚ずつ処理
そのシートで
最初の1件を検索
Nothingか
先頭に戻るまで
繰り返す
シート名・アドレス・
値をDebug.Print等
で出力
全シート終わるまで
継続
For Each ws In wb.Worksheets ループ内で If ws.Name = "Sheet1" Or ws.Name = "Sheet2" Then ... のように条件を追加するか、検索対象シートの配列を予め定義しておくとすっきりします。非表示シートを除外したい場合はIf ws.Visible = xlSheetVisible Thenを追加します。
09 USE CASES 実務ユースケース別テンプレートコード集 商品コード検索・名簿管理・重複チェックなど実務に役立つコード
9-1. 商品コード検索→隣のセルの値を取得
' 商品コードでA列を検索し、同じ行のB列(価格)を取得する
Function GetPriceByCode(productCode As String) As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("商品マスタ")
Dim rng As Range
Set rng = ws.Columns("A").Find(
What:=productCode,
LookAt:=xlWhole, ' 商品コードは完全一致
LookIn:=xlValues,
MatchCase:=False,
MatchByte:=False
)
If rng Is Nothing Then
GetPriceByCode = -1 ' 見つからない場合は-1を返す
Else
GetPriceByCode = rng.Offset(0, 1).Value ' B列(1つ右のセル)を取得
End If
End Function
' 使い方
Sub SampleUsage()
Dim price As Long
price = GetPriceByCode("A-001")
If price = -1 Then
MsgBox "商品コードが見つかりません"
Else
MsgBox "価格: ¥" & Format(price, "#,##0")
End If
End Sub
9-2. 重複データの検出・ハイライト
' A列で重複している値をすべて黄色でハイライトする
Sub HighlightDuplicates()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim i As Long
For i = 1 To lastRow
Dim cellVal As String
cellVal = ws.Cells(i, 1).Value
If cellVal = "" Then GoTo NextRow
' 同じ値が2件以上あるかFindNextで確認
Dim rng As Range
Dim firstAddr As String
Dim hitCount As Long
hitCount = 0
Set rng = ws.Columns("A").Find(
What:=cellVal,
LookAt:=xlWhole,
LookIn:=xlValues,
MatchCase:=False,
MatchByte:=False
)
If Not rng Is Nothing Then
firstAddr = rng.Address
Do
hitCount = hitCount + 1
Set rng = ws.Columns("A").FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddr
End If
' 2件以上あれば重複と判断して全件ハイライト
If hitCount >= 2 Then
Set rng = ws.Columns("A").Find(
What:=cellVal, LookAt:=xlWhole, LookIn:=xlValues,
MatchCase:=False, MatchByte:=False
)
firstAddr = rng.Address
Do
rng.Interior.ColorIndex = 6 ' 黄色
Set rng = ws.Columns("A").FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddr
End If
NextRow:
Next i
MsgBox "重複チェック完了"
End Sub
📚 用語解説
Offset(row, column):Rangeオブジェクトのプロパティで、指定したセルから相対的にずれた位置のセルを返す。rng.Offset(0, 1)は同じ行の1列右、rng.Offset(1, 0)は1行下のセル。Findで見つかったセルの隣の列の値を取得したい場合(商品コード→価格、名前→電話番号 等)によく使う。
10 AI ASSIST Claude CodeでFind検索マクロを自動生成する 要件を日本語で説明するだけで即座にVBAコードを得る方法
ここまでFindメソッドの詳細な仕様とコードパターンを解説してきましたが、正直なところ、引数を毎回書くのは面倒ですし、FindNextのループ構造も毎回イチから書くのは非効率です。
こういった定型コードの生成はClaude Codeに任せるのが最も効率的です。「A列で部分一致検索し、ヒットした行を全部リスト化したい」のように日本語で要件を説明するだけで、引き継ぎ問題を考慮した安全なコードが即座に返ってきます。
| ユースケース | Claude Codeへの指示例 |
|---|---|
| 基本的なFindコード作成 | 「VBAでA列から"東京都"を完全一致検索し、見つかった行番号とセル値をMsgBoxで表示するコードを書いて」 |
| FindNextループ | 「VBAでSheet1のA列から"株式会社"を部分一致で全件検索し、見つかったセルをすべて黄色にハイライトするコード。引数の引き継ぎ問題を考慮して全引数を明示したコードで」 |
| 複数シート横断 | 「Excelブック内の全シートから"2026"という文字を検索し、ヒットした行をSheet名・アドレス・値の形で別シートに一覧化するVBAコードを書いて」 |
| 既存コードの改善 | 「このVBAコードのFindメソッドで引数を省略している箇所をすべて明示的な引数に直して。特にLookIn・LookAt・MatchCaseを追加して。[コードを貼り付け]」 |
「A列で部分一致検索
して全件取得したい」
コード生成
安全な引数設定と
ループ構造を含む
コードが即時返却
Ctrl+Aで選択して
既存コードを
置き換え
F5で実行して
問題なければ
完成
11 CONCLUSION まとめ:VBA Findメソッド完全習得のポイント 引数の明示・FindNextループ・引き継ぎ対策の3点セット
VBA作業の自動化・業務効率化をAIで一気に進めたい方へ
FindメソッドやVBAマクロは「書けるようになること」より、「業務に組み込んで動かし続けること」の方が価値があります。
AI鬼管理では、ExcelVBA・Python・Google Sheetsを使った業務自動化の設計・実装支援を行っています。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. VBAのFindメソッドとForループはどちらが速いですか?
A. 大量データ(数千行以上)ではFindメソッドの方が圧倒的に高速です。ForループはすべてのセルをVBA側で1件ずつ評価しますが、FindメソッドはExcelの内部検索エンジンを直接呼び出すため、数十倍のスピード差が出ることがあります。ただし少量データ(数十〜数百行)では実用上の差はほぼありません。シンプルさを優先するならForループ、速度を優先するならFindという使い分けが目安です。
Q. LookIn:=xlFormulasを使うのはどんな場面ですか?
A. セルに入力された数式のテキスト自体を検索したい場合です。例えば「SUM」という関数を含む数式が入っているセルを探したい場合や、特定のシート名を参照している数式を探したい場合(「Sheet2!」を含む数式を検索等)に使います。通常の用途(表示値での検索)ではxlValuesを使い、数式を検査・分析する特殊なマクロではxlFormulasを使うのが一般的です。
Q. FindNextでループすると最後の1件が2回処理されることがありますが、どうすれば防げますか?
A. firstAddr(最初に見つかったセルのアドレス)との比較をループ条件に入れることで防げます。標準的な書き方は「Loop While Not rng Is Nothing And rng.Address <> firstAddr」です。FindNextはループの末尾で次を取得→先頭に戻ったセルと firstAddr が一致したらループを抜ける、という流れです。条件の場所をLoopの後(Do〜Loop While)に書くことで、1件目の処理と終了判定が正しく分離されます。
Q. Findで全角・半角の区別なく検索するにはどうすればいいですか?
A. MatchByte:=False を明示することで全角・半角を区別しない検索になります(False=区別しない)。省略すると前回の設定が引き継がれるため、必ず明示することを推奨します。大文字・小文字も区別しない場合はMatchCase:=False を同時に指定します。
Q. FindとLike演算子(正規表現)の違いは何ですか?
A. Findのワイルドカード(*、?)は簡単な文字列パターンマッチには使えますが、正規表現ほど柔軟ではありません。VBAで正規表現を使いたい場合は、Microsoft VBScript Regular Expressionsオブジェクト(RegExp)を参照設定して使います。Findは「含む/含まない」「特定の文字で始まる」程度のシンプルな検索に最適で、複雑なパターン(「3桁の数字に続くスペース」等)が必要な場合はRegExpの方が適切です。
Q. Claude CodeにVBAのFindコードを書いてもらうとき、どう指示すると良いですか?
A. 検索対象(どのシートのどの列/範囲か)・検索条件(完全一致か部分一致か)・検索した後にしたいこと(ハイライト/削除/別シートに転記/値を返す等)の3点を日本語で説明するのが最も効率的です。例:「Sheet1のA列で"2026"を含む部分一致で全件検索し、見つかった行のB列の値をSheet2のA列に順番に転記するVBAコードを書いて。引数の引き継ぎ問題が起きないよう全引数を明示したコードで」というように指示するとすぐに使えるコードが返ってきます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




