VBA

findメソッドの使い方(初級編)

このページでわかること

Findメソッドの基本的な使い方が分かります。

値や、書式(背景色、文字の色など)、大文字小文字など
様々なものを検索方法は応用編で

覚えること

  1. Findメソッドの使い方
  2. Findメソッドの引数の使い方

Findメソッドとは

エクセルで Ctrl + F を押すと
セル内の検索ができるようになります。

Ctrl+Fを押すと検索のダイアログがでます。 

これをVBA上で使用することができます。

細かい検索ができます。
値や数式、コメント
書式(背景色や文字色など)
大文字小文字
これら全てで検索できます。

特定の値を抜き取ったり、参照したりするには必須の関数です。

Findメソッド構文

構文:Rangeオブジェクト.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

引数はたくさんあります。
重要なものとそうでないものがあります。

重要

What<必須>
検索するデータ。
文字列などセル内のデータに該当する値を指定します。例:”リンゴ”、cells(1,1).valueなど
LookAtxlPart:検索テキストの一部を検索します。
xlWhole:検索テキスト全体を検索します。
SearchFormat検索の書式を指定します。
指定する場合はtrueとし、事前にApplication.serchformatプロパティで書式の指定をします。
省略するとFalseになります。

必要に応じて

After セルを1つを指定します。
このセルの次のセルから検索が開始されます。
引数Afterで指定するセルは、コードからではなく、通常の画面上で検索を行う場合のアクティブセルに該当します。
このセルの次から検索して最後このセルに戻ってきます。
この引数を省略すると、対象セル範囲の左上端のセルが検索の開始点になります。
LookIn 情報の種類を指定します。
xlFormulas:数式
xlValues:値
xlComments:コメント文
SearchOrderxlByColumns:列を下方向に検索してから、次の列に移動します。
xlByRows:行を横方向に検索してから、次の行に移動します。
SearchDirectionxlNext:一致する次の値を検索します。
xlPrevious:一致する前の値を検索します。
MatchCase大文字と小文字を区別するには、Trueを指定します。
既定値はFalseです。
MatchByte この引数は、2バイト(全角)文字の言語サポートが選択またはインストールされている場合にだけ使用できます。
2バイト文字が2バイト文字とだけ一致するようにする場合は、Trueを指定します。
2バイト文字が2バイト文字だけではなく、対応する1バイト文字とも一致するようにする場合はFalseを指定します。

Findメソッドは検索開始位置を決め、
開始位置の次のセルから最初に合致したセル範囲を返してくれる関数です。
注意が必要です(後で詳しく書きます)。

検索開始位置は指定しなければ、
rangeオブジェクトの最初のセルを開始位置とします。

特別な理由がない限りセルの開始位置は指定しないでいいと思います。

基本的な使い方

一番オーソドックスな使い方をご紹介します。
簡単なテーブルを作りました

ここからFindメソッドを使ってリンゴのセル位置を検索したいと思います。

Sub findmethod()

'テーブル
Dim table As ListObject
Set table = ActiveSheet.ListObjects(1)

Dim srcRng As Range '検索する範囲
Dim fndRng As Range 'findメソッドで検索したセル範囲
Set srcRng = table.ListColumns("果物").Range

'リンゴの位置をテーブルの”果物”列の上から検索して一番最初に見つけたセル
Set fndRng = srcRng.Find(what:="リンゴ", lookat:=xlWhole)
MsgBox ("リンゴのセル位置は:" & fndRng.Address)
End Sub

注意する点

表などから特定のセル位置を抜き取るのに強力な武器となりますが、
注意すべきところがあります。

セルの検索は開始位置の次のセルからです。

上記の表を増やしました。
単純に同じ表を一番下にくっつけただけです。
「リンゴ」がA2とA7にあります。

検索するセル範囲をRange(“A2:A11”)としてみましょう。
テーブルでいうところのDatabodyRange(見出しを除いたデータだけの範囲)です。

Sub findmethod()

Dim srcRng As Range '検索する範囲
Dim fndRng As Range 'findメソッドで検索するセル範囲
Set srcRng = ActiveSheet.Range("A2:A11")

'リンゴの位置をA2:A11の上から検索して一番最初に見つけたセル
Set fndRng = srcRng.Find(what:="リンゴ", lookat:=xlWhole)
MsgBox ("リンゴのセル位置は:" & fndRng.Address)
End Sub

検索したセルはA2ではなくA7でした。
検索開始はA2からなので、
A2の次のセルのA3から検索していることになります。

検索したい値が一つしかない場合は問題ないんですが、
複数ある場合はもしかしたら思い通りの動きをしないかもしれないです。

Findメソッドは表から値を取り出すだけなら
WorksheetsfunctionでVlookupを使った方が効率的なのですが、

検索の方向を変えたり、
書式で検索かけたり、
大文字小文字を認識したりできます。

そして別の関数を組み合わせれば、
検索対象が複数ある場合でもすべて拾い出すことができます。

これらについても応用編としてご紹介いたします。