Excel VBA:特定範囲を特定の値で検索した結果をRangeオブジェクトで返す関数 いまさら補足

ちょっと前にExcel VBAの便利な関数Find_Rangeを紹介した。

この関数、慣れれば本当に便利。

特定の値や特定の文字列をセル検索するならこの関数1つで事足りる。

今回は、もうちょっと詳細な説明を具体的な使用例を紹介したい。

※誤りとかあれば笑って指摘してもらえるとうれしい。

 

まず、引数の説明。

メソッド 引数 定数 内容
Find_Range Find_Item   検索するデータ(値、文字列)を指定
Search_Range   検索対象範囲を指定
LookIn xlFormulas 検索対象を数式とする
xlValues 値とする
xlComents コメント文とする
LookAt xlPart 一部が一致するセルを検索
xlWhole 全てが一致するセルを検索
MatchCase TRUE 大文字と小文字を区別する
FALSE 区別しない
MatchByte TRUE 半角と全角を区別する
FALSE 区別しない

いくつか補足しておく。

MatchCaseやMatchByteは省略可能だがソースの可読性向上のためにも必ず指定するようにしておくとよい。

検索対象のセル範囲を指定するSearch_Rangeは、Rangeオブジェクトなら何でも指定できる。

例えば以下のようなものを指定できる。

★Search_Rangeの例

 (例1)Worksheets("Sheet1").Cells

  シート全体を検索対象範囲に指定。"Cells"だけでもよいが思わぬシートが検索対象範囲になるので注意。

 (例2)Worksheets("Sheet1").Columns("C:E")

  C列、D列、E列を検索対象範囲に指定。"Columns("C:E")"だけでもよいが(ry。

 (例3)Worksheets("Sheet1").Rows("2:5")

  2行~5行を検索対象範囲に指定。"Rows("2:5")"だけでも(ry。

 (例4)Worksheets("Sheet1").Range("A1:D20")

  矩形範囲"A1:D20"を検索対象範囲に指定。"Range("A1:D20")"だけ(ry。

 (例5)Selection

  現在の選択範囲を検索対象範囲に指定。とりあえずselectしちゃう人はこれ。

 (例7)Selection.CurrentRegion

  現在の選択範囲を含む「アクティブセル領域」を検索対象範囲に指定。まあ、あんまり使わないかな。

 (例8)ActiveSheet.UsedRange

  現在のシートの使用されている範囲を検索対象範囲に指定。

そのほか、EntirerowやEntirecolumnを使ってやる場合もでてくるかも。

 

次に具体的な使用例。

前に述べたとおり、基本形は以下。

・特定の文字列"ABC"でシート全体を検索する場合

Set FR = Find_Range("ABC", Cells, xlValues, _
              xlPart, MatchCase:=False, MatchByte:=True)

・特定の値 999 でC列、D列、E列を検索する場合

Set FR = Find_Range(999, Columns("C:E"), xlValues, _
              xlPart, MatchCase:=False, MatchByte:=True)

上記コードにより、変数FRに検索結果がRangeオブジェクトで格納される。

さて、このFRを参照すれば検索結果に対していろいろなことができる。

(例1)特定の文字列(値)で検索した結果を選択する。

 If Not FR Is Nothing Then
   FR.Select
End If

※If文で包んでおかないと、検索結果が外れた場合にエラー終了してしまう。以下同様。

(例2)特定の文字列(値)で検索してヒットした数を調べる。

 If Not FR Is Nothing Then
   cnt = FR.Count
Else
   cnt = 0
End If

(例3)特定の文字列(値)で検索してヒットしたセルの値を削除する。

 If Not FR Is Nothing Then
   FR.Clearcontents
End If

(例4)特定の文字列(値)で検索してヒットしたセルのコメントを削除する。

 If Not FR Is Nothing Then
   FR.Clearcomments
End If

(例5)特定の文字列(値)で検索してヒットしたセルを含む行全体を削除する。

 If Not FR Is Nothing Then
   FR.EntireRow.Delete
End If

(例6)特定の文字列(値)で検索してヒットしたセルを含む行全体を別シートにコピーする。

 If Not FR Is Nothing Then
   FR.EntireRow.Copy Range("Sheet2!A1")
End If

(例7)特定の文字列(値)で検索してヒットしたセルの背景色を赤で塗りつぶす。

 If Not FR Is Nothing Then
   FR.Interior.ColorIndex = 3
End If

(例8)特定の文字列(値)で検索してヒットしたセルの文字色を赤にする。

 If Not FR Is Nothing Then
   FR.Font.ColorIndex = 3
End If

(例9)特定の文字列(値)で検索してヒットしたセルの文字に下線を施す。

 If Not FR Is Nothing Then
   FR.Font.Underline = xlUnderlineStyleSingle
End If

 

羅列してしまったが要はRangeのプロパティを使え!と言うことだ。

 

あとさらに補足。

例えば、特定の文字列"ABC"と"XYZ"のどちらかを含むセルを検索(OR検索)したい場合はUnionを使えばよい。

Set FR1 = Find_Range("ABC", Cells, xlValues, _
              xlPart, MatchCase:=False, MatchByte:=True)
Set FR2 = Find_Range("XYZ", Cells, xlValues, _
              xlPart, MatchCase:=False, MatchByte:=True)
Set FR1 = Union(FR1,FR2)

 

また、特定の文字列"ABC"と"XYZ"の両方を含むセルを検索(AND検索)したい場合はIntersectを使えばよい。

Set FR1 = Find_Range("ABC", Cells, xlValues, _
              xlPart, MatchCase:=False, MatchByte:=True)
Set FR2 = Find_Range("XYZ", Cells, xlValues, _
              xlPart, MatchCase:=False, MatchByte:=True)
Set FR1 = Intersect(FR1,FR2)

 

他にも使用例とかあれば追加していきたいと思う。

コメント

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