ちょっと前に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)
他にも使用例とかあれば追加していきたいと思う。
—
コメント