HOME > 即効テクニック > Excel VBA > セル操作関連のテクニック > 文字列検索−Findメソッドの応用

文字列検索−Findメソッドの応用|Excel VBA

セル操作関連のテクニック

文字列検索−Findメソッドの応用

(Excel 2000/2002/2003/2007/2010/2013/2016)

特定の文字列をセル範囲から検索するにはFindメソッドを使用します。
Findメソッドが検索結果として返すセルを対象に、さまざまなことを行うことが出来ます。
たとえば、検索結果のセルの背景色を変えたり、セル内の検索文字列のフォントを操作したり、隣合うセルを結合するなど、セルの操作で可能なことをFindメソッドの検索結果に対して行うことが出来ます。

ここではFind/FindNextメソッドを組あわせた応用例をご紹介します。

■検索結果のセルに含まれる検索文字列のフォントを操作する

次のサンプルは、ダイアログボックスで指定した文字列を検索し、セル内にある検索文字列のみ赤・太字に設定します。

●サンプル1●

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" Then Exit Sub
    
    '検索対象範囲
    Set SearchArea = ActiveSheet.UsedRange
    
    '検索実行
    Set FoundCell = SearchArea.Find(What:=Target, LookIn:=xlValues, _
                    LookAt:=xlPart, MatchCase:=False, MatchByte:=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)
    With FoundCell.Characters(StartPos, Len(Target)).Font
        .Color = vbRed
        .Bold = True
    End With
End Sub

■検索結果のセルをすべて選択する

次のサンプルは、上のサンプルと同様にダイアログボックスで指定した文字列を検索します。
検索条件を満たしたセルのアドレスを配列に格納し、最後に対象セルを一括選択するマクロです。
条件を満たしたセルに対して一括処理をするときに使用すると良いでしょう。

●サンプル2●

Sub SelectTargets()
    Dim Target As String
    Dim FoundCell As Range, SearchArea As Range
    Dim Addr As String
    Dim FoundAddr() As String
    Dim i As Long
    
    Target = Application.InputBox("検索文字列入力", "検索", Type:=2)
    If Target = "False" Then Exit Sub
    
    Set SearchArea = ActiveSheet.UsedRange
    
    Set FoundCell = SearchArea.Find(what:=Target, LookIn:=xlValues, _
                    LookAt:=xlPart, MatchCase:=False, MatchByte:=False)
    If FoundCell Is Nothing Then Exit Sub
    Addr = FoundCell.Address
    
    Do
        ReDim Preserve FoundAddr(i) '配列の内容を維持したまま再宣言
        FoundAddr(i) = FoundCell.Address '検索結果のアドレスを配列に格納
        Set FoundCell = SearchArea.FindNext(After:=FoundCell)
        i = i + 1
        If FoundCell Is Nothing Then Exit Do
    Loop Until FoundCell.Address = Addr
    
    '配列に格納されたアドレスをカンマ区切りで結合し、セル範囲を一括選択
    Range(Join(FoundAddr, ",")).Select    '---(1)
End Sub

●補足1●

Rangeプロパティの引数に指定する文字列には文字数制限があるため、検索対象のセルが多いと(1)でエラーが発生します。その場合はUnionメソッドを使用して対象セルを選択すると良いでしょう。
Unionメソッドを使用する方法については、「条件に一致した複数のセルを選択する(RaneプロパティとUnionメソッド)」を参照してください。

●補足2●

サンプル2で使用しているJoin関数は、Excel 2000で追加された関数です。
それ以前のバージョンでは使用できません。