【VBAリファレンス|実務向け】文字列検索-Findメソッドの応用|Excel VBA

スポンサーリンク

導入:なぜFindメソッドを使いこなすべきか

Excel VBAで特定のデータを抽出・加工する際、単純なループ処理(For Eachなど)で全セルを走査していませんか?データ量が多い場合、全セル走査は処理速度を著しく低下させます。そこで活用したいのが Findメソッド です。これはExcelの「検索」機能をコードから実行するもので、非常に高速です。単に検索するだけでなく、検索結果に対して柔軟な処理を行うことで、業務自動化のレベルが一段と向上します。

基礎知識:Findメソッドの仕組み

Findメソッドは、指定した範囲内から特定の文字列を検索し、最初に見つかったセルを Rangeオブジェクト として返します。重要なのは、次のセルを探す FindNextメソッド との組み合わせです。
検索を開始した位置まで戻ってきたらループを終了させる、という「一周したかの判定」が実装の肝となります。

実装のポイント:検索対象を絞り込む

Findメソッドを使用する際は、引数の指定が非常に重要です。特に LookAt(完全一致か部分一致か) や LookIn(値か数式か) を適切に設定しないと、意図しない場所まで検索してしまう可能性があります。実務では、検索漏れを防ぐために MatchByte(全角半角の区別) をFalseにするなど、柔軟な設定を心がけましょう。

サンプルプログラム:検索結果を操作する

以下は、シート内の指定文字列を検索し、対象セル内の文字列のみを「赤字・太字」にする実用的なコードです。

Sub PaintTargetCharacter()
Dim Target As String
Dim FoundCell As Range, SearchArea As Range
Dim Addr As String

‘ 検索したい文字列を入力
Target = Application.InputBox(“検索文字列を入力してください”, Type:=2)
If Target = “False” Or Target = “” Then Exit Sub

Set SearchArea = ActiveSheet.UsedRange

‘ 検索実行:LookAtをxlPartにすることで部分一致検索を実現
Set FoundCell = SearchArea.Find(What:=Target, LookIn:=xlValues, _
LookAt:=xlPart, MatchCase:=False)

‘ 検索結果がない場合は終了
If FoundCell Is Nothing Then Exit Sub

‘ 最初の検索結果のアドレスを記録(ループ終了判定用)
Addr = FoundCell.Address

Do
‘ セル内の指定文字のみ装飾する処理を呼び出し
Call PaintCh(FoundCell, Target)

‘ 次のセルを検索
Set FoundCell = SearchArea.FindNext(After:=FoundCell)

‘ 検索結果が最初のアドレスに戻ったら終了
If FoundCell Is Nothing Then Exit Do
Loop Until FoundCell.Address = Addr
End Sub

‘ セル内の特定文字のみ赤・太字にするプロシージャ
Sub PaintCh(FoundCell As Range, Target As String)
Dim StartPos As Long
‘ 文字列の位置を探す
StartPos = InStr(1, FoundCell.Value, Target, vbTextCompare)
‘ Charactersオブジェクトを使って部分装飾
With FoundCell.Characters(StartPos, Len(Target)).Font
.Color = vbRed
.Bold = True
End With
End Sub

応用・注意点:現場で陥りやすい罠

1. Unionメソッドの活用
サンプルコード内でも触れましたが、検索結果のセルを「まとめて操作」したい場合、配列にアドレスを格納して最後にRangeでまとめて指定する方法は、文字列の長さ制限によりエラーになることがあります。対象セルが多数ある場合は、Unionメソッド を使ってRangeオブジェクトを結合していくのが最も安全でスマートな手法です。
2. 検索設定の引き継ぎ
Findメソッドの引数は、一度実行するとExcelの検索設定として記憶されます。次回実行時に予期せぬ動作を防ぐため、可能な限り全ての引数(LookInやLookAtなど)を明示的に指定する癖をつけましょう。これにより、コードの安定性が格段に上がります。

タイトルとURLをコピーしました