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

Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
最終更新日:2018-02-05

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


Findメソッドは、セル範囲内で条件に当てはまるセルを検索するものです。


Findメソッドは、Rangeオブジェクトのメソッドで、

ワークシート操作の「検索と置換」「検索」の機能をマクロVBAで使うものです。


Excel解説


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 には、対象セル範囲内の単一セルを指定する必要があります。
検索は指定したセルの前のセルから始まるので、指定したセル自体は、範囲全体が一度検索されるまで検索されません。
この引数を省略すると、セル範囲の左上隅のセルが指定されたものと見なされます。

これは、あまり使う事はないでしょう。



実践例.

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の判定で初心者が、間違えやすい代表になっています。

もしかしたら、わざと、そうしたのでしょうか(笑)



以下も是非お読みください。

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

Findメソッドを私があまり使わない理由を説明しています。




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

ハイパーリンク(Hyperlink)
グラフ(Chart)
図形(Shape)
Findメソッド(Find,FindNext,FindPrevious)
Replaceメソッド(置換)
InputBoxメソッド(インプットボックス)
Midステートメント
Intersectメソッド
Unionメソッド
GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
Callステートメント

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

Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)
Shift_JISのテキストファイルをUTF-8に一括変換|VBAサンプル集(5月31日)
「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)
VBA+SeleniumBasicで検索順位チェッカー作成|VBA技術解説(5月18日)
テーブル操作のVBAコード(ListObject)|VBA入門(5月12日)
テーブル操作の概要(ListObject)|VBA入門(5月12日)
VBAのスクレイピングを簡単楽にしてくれるSelenium|VBA技術解説(5月6日)
Excelワークシート関数一覧(2010以降)|VBAリファレンス(4月22日)

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

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



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

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


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






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

    本文下部へ