ExcelマクロVBA入門
第98回.Findメソッド(Find,FindNext,FindPrevious)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-07-09

第98回.Findメソッド(Find,FindNext,FindPrevious)


Findメソッドは、マクロVBAでセル範囲内の条件に当てはまるセルを検索するものです。
Findメソッドは、Rangeオブジェクトのメソッドで、
ワークシート操作の「検索と置換」「検索」の機能をマクロVBAで使うものです。


マクロ VBA Find

上の画像では「検索する文字列」だけしか指定できませんが、
「オプション」をクリックすると、

マクロ VBA Find

このように、いろいろな指定ができるようになります。
以下では、これらの検索を行う時のマクロVBAについて解説します。

Findメソッド

セル範囲内で特定の情報を検索します。
Range.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

引数の説明


What 検索するデータです。
文字列などセル内のデータに該当する値を指定します。
After セル範囲内のセルの1つを指定します。
このセルの次のセルから検索が開始されます。
引数Afterで指定するセルは、コードからではなく、通常の画面上で検索を行う場合のアクティブセルに該当します。
このセルの次から検索が開始されるため、範囲内の他のセルがすべて検索され、このセルに戻るまで、このセル自体は検索されません。
この引数を省略すると、対象セル範囲の左上端のセルが検索の開始点になります。
LookIn 情報の種類を指定します。
xlFormulas:数式
xlValues:値
xlComents:コメント文
LookAt

xlPart:検索テキストの一部を検索します。
xlWhole:検索テキスト全体を検索します。

SearchOrder xlByColumns:列を下方向に検索してから、次の列に移動します。
xlByRows:行を横方向に検索してから、次の行に移動します。
SearchDirection

xlNext:一致する次の値を検索します。
xlPrevious:一致する前の値を検索します。

MatchCase 大文字と小文字を区別するには、Trueを指定します。
既定値はFalseです。
MatchByte この引数は、2バイト(全角)文字の言語サポートが選択またはインストールされている場合にだけ使用できます。
2バイト文字が2バイト文字とだけ一致するようにする場合は、Trueを指定します。
2バイト文字が2バイト文字だけではなく、対応する1バイト文字とも一致するようにする場合はFalseを指定します。
SearchFormat 検索の書式を指定します。

戻り値
検索範囲の先頭のセルを表すRangeオブジェクトが戻されます。
一致するデータが見つからなかった場合、このメソッドはNothingを返します。

Findメソッドでは、複雑なパターンと一致するセルを検索することはできません。
複雑な検索を行う場合は、
For...Nextステートメントを使い、順次IfステートメントとLike演算子で判定するようにします。

引数が保存される注意点
引数LookIn、LookAt、SearchOrder、およびMatchByteの設定は、
このメソッドを使用するたびに保存されます。
次にこのメソッドを使用するときにこれらの引数の指定を省略すると、保存された設定が使用されます。
これらの引数の設定を変更すると、[検索と置換]ダイアログボックスに表示される設定が変わります。
また、[検索と置換]ダイアログボックスで設定を変更すると、保存されている値、つまり引数を省略した場合に使用される値が変わります。
このような設定の変更によって生じる問題を避けるには、
メソッドを使用するたびに、これらの引数を明示的に指定します。

使用例.
Set rngFind = Range("A1:B100").Find(What:="A", _
              LookIn:=xlValues, _
              LookAt:=xlPart, _
              SearchOrder:=xlByColumns, _
              SearchDirection:=xlNext, _
              MatchCase:=False, _
              MatchByte:=False)
If Not rngFind Is Nothing Then
  MsgBox "見つかった" & vbLf & rngFind.Address
End If

A1セル~A100セルの範囲内から、"A"を探して、
見つかったら、そのアドレスを表示しています。

注意1.
A1セルに"A"があったとしても、これで検索されるのは、それ以降に出現する最初のセルになります。
これは、ワークシートの操作でも同じです。
引数、Afterの説明にもあるように、このセルの次のセルから検索が開始されるからです。

注意2.
引数 LookIn、LookAt、SearchOrder、MatchByte の設定は、このメソッドを使用するたびに保存されます。
つまり、[検索と置換]ダイアログボックスに表示される設定が変わります。
次にこのメソッドを使用するときにこれらの引数の指定を省略すると、保存された設定が使用されます。
このような設定の変更によって生じる問題を避けるには、メソッドを使用するたびに、引数を明示的に指定します。

FindNext メソッド

Find メソッドによって開始された検索を継続します。
前回の検索条件に一致するセルを、下方向 (行のときは左から右、列のときは上から下) に検索し、
見つかったセル (Range オブジェクト) を返します。
これは、ワークシートの操作「検索と置換」で、「次を検索」に相当します。

Range.FindNext(After)

引数の説明
After 指定したセルの下方 (行のときは右、列のときは下) のセルから検索を開始します。
ワークシート上で検索を行う場合のアクティブ セルに相当します。
引数Afterには、対象セル範囲内の単一セルを指定する必要があります。
検索は指定したセルの次のセルから始まるので、指定したセル自体は、範囲全体が一度検索されるまで検索されません。
この引数を省略すると、セル範囲の左上隅のセルが指定されたものと見なされます。

Findメソッドとの組み合わせで使用されます。
検索は指定された範囲の最後に達すると、範囲の最初に戻って検索を繰り返します
同じ範囲を繰り返して検索しないようにするには、
最初に検索内容が見つかったセルの位置を保存しておき、次のセルが見つかるたびに、そのセルの位置と保存しておいたセルの位置を比較するようにします。

FindPrevioust メソッド

Find メソッドによって開始された検索を継続します。
前回の検索条件に一致するセルを、上方向 (行のときは右から左、列のときは下から上) に検索し、見つかったセル (Range オブジェクト) を返します。

Range.FindPrevious(After)

引数の説明


After 指定したセルの上方 (行のときは左、列のときは上) のセルから検索を開始します。
ワークシート上で検索を行う場合のアクティブ セルに相当します。引数 After には、対象セル範囲内の単一セルを指定する必要があります。
検索は指定したセルの前のセルから始まるので、指定したセル自体は、範囲全体が一度検索されるまで検索されません。
この引数を省略すると、セル範囲の左上隅のセルが指定されたものと見なされます。

このFindPreviousは、実際に使う機会は少ないと思います。

Application.FindFormatメソッド

[検索と置換] ダイアログの右上の「書式」をクリックすると、

マクロ VBA Find[

このように、「書式の検索」ダイアログが表示されます。
ここで書式を指定すると、元の[検索と置換] ダイアログのプレビューに表示され、
この書式のセルを検索することができます。

手動では行う事があるかと思いますが、さすがにマクロVBAで使う機会はかなり稀だと思います。
必要となった時には、「マクロの記録」でVBAコードを確認するのが簡単だと思います。
以下は、塗りつぶし黄色で検索した場合の、自動記録のマクロVBAコードにになります。

Sub Macro1()
  With Application.FindFormat.Interior
    .PatternColorIndex = xlAutomatic
    .Color = 65535
    .TintAndShade = 0
    .PatternTintAndShade = 0
  End With
  Cells.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=True).Activate
  Range("K14").Select
End Sub

Fontで検索する場合は、
FindFormat.InteriorこれをFindFormat.Fontとして、検索するFontの情報を設定すれば良い事になります。

実践例.

With Worksheets(1).Range("a1:a500")

  Dim c As Range
  Dim firstAddress As String
  Set c = .Find(2, lookin:=xlValues)
  If Not c Is Nothing Then
    firstAddress = c.Address
    Do
      c.Value = 5
      Set c = .FindNext(c)
    Loop While Not c Is Nothing And c.Address <> firstAddress
  End If
End With


次の使用例は、シート 1 のセル範囲 A1:A500 で、値に 2 が含まれているセルを検索し、その値を 5 に変更します。
これは、Excel2010までのヘルプの使用例です。
これは、実行してみれば解りますが、全てを置換後にエラーになってしまいます。
Set c = .FindNext(c)
これで、検索値が存在しない場合は、cはNothingとなりますが、
Not c Is Nothing And c.Address <> firstAddress
この判定では、cがNothingのときでも、c.Address <> firstAddressを評価する為、エラーとなります。
以下のようにすれば良いでしょう。

With Worksheets(1).Range("a1:a500")
  Dim c As Range
  Dim firstAddress As String
  Set c = .Find(2, LookIn:=xlValues)
  If Not c Is Nothing Then
    firstAddress = c.Address
    Do
      c.Value = 5
      Set c = .FindNext(c)
      If c Is Nothing Then
        Exit Do
      End If
      If c.Address = firstAddress Then
        Exit Do
      End If
    Loop
  End If
End With


If c Is Nothing Then
  Exit Do
End If
If c.Address = firstAddress Then
  Exit Do
End If

この部分は、理解しやすいように、だいぶ野暮ったく書きました。
このヘルプの使用例は、ANDの判定で初心者が、間違えやすい代表になっています。
もしかしたら、わざと、そうしたのでしょうか・・・


以下も是非お読みください。
Findメソッドを私があまり使わない理由を説明しています。
VBAのFindメソッドの使い方には注意が必要です

vbafindでの検索が極めて多く、Findメソッドは検索からの流入ではトップクラスです、アクセス解析で分かった事ですが正直少し戸惑っています。なぜなら私はFindメソッドをほとんど使いません、Match関数や配列を使って処理したほうが高速かつ確実に動作するからです。



同じテーマ「マクロVBA入門」の記事

第95回.ハイパーリンク(Hyperlink)
第96回.グラフ(Chart)
第97回.図形オートシェイプ(Shape)
第98回.Findメソッド(Find,FindNext,FindPrevious)
第99回.Replaceメソッド(置換)
第100回.InputBoxメソッド(インプットボックス)
第101回.Midステートメント
第102回.Intersectメソッド
第103回.Unionメソッド
第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
第105回.Callステートメント


新着記事NEW ・・・新着記事一覧を見る

VBAコードの全プロシージャー・プロパィ一覧を取得|VBAサンプル集(10月12日)
VBAでエラー行番号を取得できるErl関数|VBA技術解説(10月12日)
手動計算時の注意点と再計算方法|ExcelマクロVBA技術解説(10月9日)
引数の数を可変にできるパラメーター配列(ParamArray)|VBA入門(10月7日)
VBEの使い方:デバッグ|ExcelマクロVBA入門(10月6日)
VBAにおける配列やコレクションの起点について|VBA技術解説(10月5日)
VBEの使い方:オブジェクト ブラウザー|VBA入門(10月5日)
VBEの使い方:ウォッチ ウィンドウ|VBA入門(10月4日)
VBEの使い方:ローカル ウィンドウ|VBA入門(10月3日)
VBEの使い方:イミディエイト ウィンドウ|VBA入門(10月2日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • Findメソッド(Find,FindNext,FindPrevious)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ