文字列検索−Findメソッドの応用|Excel VBA |
特定の文字列をセル範囲から検索するにはFindメソッドを使用します。
Findメソッドが検索結果として返すセルを対象に、さまざまなことを行うことが出来ます。
たとえば、検索結果のセルの背景色を変えたり、セル内の検索文字列のフォントを操作したり、隣合うセルを結合するなど、セルの操作で可能なことをFindメソッドの検索結果に対して行うことが出来ます。
ここではFind/FindNextメソッドを組あわせた応用例をご紹介します。
次のサンプルは、ダイアログボックスで指定した文字列を検索し、セル内にある検索文字列のみ赤・太字に設定します。
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
次のサンプルは、上のサンプルと同様にダイアログボックスで指定した文字列を検索します。
検索条件を満たしたセルのアドレスを配列に格納し、最後に対象セルを一括選択するマクロです。
条件を満たしたセルに対して一括処理をするときに使用すると良いでしょう。
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
Rangeプロパティの引数に指定する文字列には文字数制限があるため、検索対象のセルが多いと(1)でエラーが発生します。その場合はUnionメソッドを使用して対象セルを選択すると良いでしょう。
Unionメソッドを使用する方法については、「条件に一致した複数のセルを選択する(RaneプロパティとUnionメソッド)」を参照してください。
サンプル2で使用しているJoin関数は、Excel 2000で追加された関数です。
それ以前のバージョンでは使用できません。