特定のセル範囲内を検索する


下図のような表があったとします。ここから「田中」を探して、右隣の数値を取得したいです。セルの検索には、何はともあれFindメソッドです。Findメソッドの使い方がわからないときは、マクロ記録してみましょう。

Sub Macro1()
'
' Macro1 Macro
'
'
    Cells.Find(What:="田中", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , MatchByte:=False, SearchFormat:=False).Activate
End Sub

解説を簡単にするため、Findメソッドの引数は省略します。この記録されたコードを参考に、見つかったセルを変数Targetに格納して、右隣の数値を取得しましょう。

Sub Sample1()
    Dim Target As Range
    Set Target = Cells.Find(What:="田中")
    MsgBox "田中:" & Target.Offset(0, 1)
End Sub

とりあえず検索はできましたが、それでは、グループ1とグループ2をそれぞれ検索するにはどうしたらいいでしょう。基本的なことですから「何を簡単な・・・」と感じる方もいるでしょう。確かに基本的なことです。ですが、この話をすると、意外と「へぇ」とか「知らなかった」と言われることが多いので、一応コンテンツとして書いておきます。

セルの検索をマクロ記録すると

Cells.Find

と記録されます。このCellsは、ワークシート上の全セルを意味します。ワークシート上の全セルから"田中"を検索したわけですね。つまり、Cellsが検索の対象範囲です。ということは、この検索の対象範囲に、任意のセル範囲を指定すればいいんです。なお、下記のコードは見つからなかったときの処理を端折っています。

Sub Sample2()
    Dim Target As Range, msg As String
    Set Target = Range("A2:A11").Find(What:="田中")
    msg = "田中:" & Target.Offset(0, 1) & vbCrLf
    Set Target = Range("C2:C11").Find(What:="田中")
    msg = msg & "田中:" & Target.Offset(0, 1)
    MsgBox msg
End Sub

いくらマクロ記録されるからといって、Findメソッドで検索するとき、何でもかんでもCellsを対象にするのは下品ですね。