ExcelマクロVBA入門 | 第98回.Findメソッド(Find,FindNext,FindPrevious) | Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説



最終更新日:2016-08-25

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


Findメソッドはセル範囲内で特定の情報を検索する、Rangeオブジェクトメソッドで、

ワークシート操作の「検索と置換」「検索」の機能をマクロ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 を返します。


使用例.

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メソッドとの組み合わせで使用されます。


実践例.

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 に変更します。

これは、ヘルプの使用例です。

これは、実行してみれば解りますが、全てを置換後にエラーになってしまいます。

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

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


FindPrevioust メソッド

Find メソッドによって開始された検索を継続します。

前回の検索条件に一致するセルを、上方向 (行のときは右から左、列のときは下から上) に検索し、見つかったセル (Range オブジェクト) を返します。
選択範囲やアクティブ セルには影響はありません。

Range.FindPrevious(After)

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


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

Findメソッドを私が使わない理由




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

第99回.Replaceメソッド(置換)
第100回.InputBoxメソッド(インプットボックス)
第101回.Midステートメント
第102回.Intersectメソッド
第103回.Unionメソッド
第104回.GetPhoneticメソッド(フリガナ)
第105回.Callステートメント

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

空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)
CSVの読み込み方法(改の改)|ExcelマクロVBAサンプル集(3月17日)
変数とプロシージャーの命名について|ExcelマクロVBA技術解説(2月12日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.ひらがな⇔カタカナの変換|エクセル基本操作
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
6.変数とデータ型(Dim)|ExcelマクロVBA入門
7.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
8.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.定数と型宣言文字(Const)|ExcelマクロVBA入門



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

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


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




    ↑ PAGE TOP