Findメソッドを使って完全一致で文字列を探す
VBAには文字列を探す方法がいくつかあります。本記事ではFindメソッドの使い方を紹介します。
3つのポイントをもとに解説を進めます。
- Findメソッドとは
- どんなパラメータがあるのか
- 完全一致で文字列を探す方法
Findメソッドは検索対象の文字列がどこのセルに居るのかを返す関数です。
文字列検索ができますがあくまで戻り値はセル(Rangeオブジェクト)です。
Rangeオブジェクトが戻り値だという事はオブジェクト変数が必要になります。
オブジェクト変数への説明も含めて説明していきます。
関連記事
FindメソッドとLike演算子を比較している記事です。Findメソッドの問題点を挙げて説明しています。
おすすめはLike演算子VBAのFindメソッドは変数が難しい|文字列検索はLike演算子!
関連書籍
Findメソッドについてはこちらの書籍で勉強しました。
環境次第ですが電子書籍(Kindle)もおすすめです。
PC内でVBEと電子書籍を並べて表示させながら作業をするとコーディングがはかどります。
Findメソッド
VBAに用意された関数の1つです。詳細は以降内容をご覧ください。
Findメソッドとは
Microsoftのドキュメントから引用します。
セル範囲内で特定の情報を検索します。
Microsoft:Findメソッド
かんたんに申し上げますと「Findメソッドは検索対象の文字列がどこのセルに居るのかを返す関数」です。
構文とパラメーター
構文とパラメーターはこちらです。
expression.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
expression は Range オブジェクトを表す変数です。
Microsoft:Findメソッド
名前 必須 / オプション データ型 説明 What 必須 バリアント型 検索するデータです。 指定できるのは、文字列、または任意の Microsoft Excel のデータ型です。 After 省略可能 バリアント型 このセルの後から検索を開始します。
これは、ユーザー インターフェイスから検索が実行されたときにアクティブなセルの場所に対応しています。
After は範囲内の 1 つのセルにする必要があることに注意してください。
この引数を指定しない場合は、範囲の左上端のセルの後から検索が開始されます。LookIn 省略可能 Variant 使用できるのは、XlFindLookIn定数: xlFormulas、xlValues、xlComments あるいは xlCommentsThreaded のいずれかです。 LookAt 省略可能 Variant 次のXlLookAt定数:xlWholeあるいはxlPartのいずれかになります 。 SearchOrder 省略可能 Variant 次のXlSearchOrder定数:xlByRowsあるいはxlByColumnsのいずれかになります 。 SearchDirection 省略可能 Variant 次の XlSearchDirection 定数: xlNext あるいは xlPrevious のいずれかになります。 MatchCase 省略可能 Variant 大文字と小文字を区別するには、True を指定します。 既定値は False です。 MatchByte 省略可能 バリアント型 2 バイトの言語サポートが選択またはインストールされている場合にのみ使用されます。
2 バイト文字が 2 バイト文字とだけ一致するようにする場合は、True を指定します。
2 バイト文字が同等の 1 バイト文字とも一致するようにする場合は、False を指定します。SearchFormat 省略可能 バリアント型 (Variant) 検索の書式を指定します。
戻り値
Rangeオブジェクトです。
値を受けとるために変数を用意することになりますがオブジェクト変数を用意しないとエラーになります。
オブジェクト変数
オブジェクト変数の説明についてはこちらの記事をご覧ください。
オブジェクト変数について説明していますVBAで転記|ブック間で文字列をコピペするマクロの作り方を教えます
完全一致で文字列を探す方法
完全一致による検索はパラメーター「Lookat」で「xlWhole」を指定するだけです。
セル内の文字列と検索対象の文字列が完全に一致している時だけ処理を行うという様なコードを組むことができます。
事例
Findメソッドの使い方を紹介する為に事例を用意しました。画像をご覧ください。
A列に検索対象の文字列、B列にはA列の文字列の説明を記載しておきました。
以降紹介するコードによってA列の文字列がどう変化するのかを確認してください。
コード
具体的に説明する為にコードを用意しました。Microsoftのドキュメントにあったコードを一部加工しています。
このコードを使うとセルA1からセルA500にある半角数値の2が記入されたセルは全て半角数値の5に変わります。
Sub FindValue()
Dim c As Range
Dim firstAddress As String
With Worksheets(1).Range("A1:A500")
Set c = .Find(2, Lookat:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing
End If
End With
End Sub
画像はコード実行後のセルの状態です。半角の「2」が完全一致となるセルA4の文字だけ5になりました。
コードの解説
Findメソッドは定義のところで説明しましたので省略します。
コード全体を読み解くための解説をしていきます。ポイントは2つです。
- FindNextメソッド
- Do~Loopステートメント
1_FindNextメソッド
Withステートメントで指定した範囲は複数のセルを抱えています。
検索対象の文字列は指定した範囲の中に1つもしくはゼロとは限りません。複数存在する可能性もあります。
そんな時にFindメソッドを使います。
構文、パラメーター、戻り値はMicrosoftのドキュメントをご覧ください。
コード内ではパラメーターに変数cを設定しています。変数cの1つ下のセルから再び検索をするという事になります。
2_Do~Loopステートメント
Loopの後に条件が書いてあります。「変数cがNothingではない間はループしますよ」という意味です。
つまり「変数cに値が入っているうちはループする」という意味です。
ループしながら変数cに格納されているRangeオブジェクトの値を5に変えるための枠組みを作っています。
FindNextメソッドとDo~Loopステートメントはセットで使う
FindNextメソッドとDo~Loopステートメントは一緒に使うと効果を発揮します。
FindeNextメソッドで次のセル以降を検索しDo~Loopステートメントで変数cの値を変える為の枠組みを作っています。
実際に変数cの値を変えるのはオブジェクト変数cのValueプロパティへの代入ですが2つの要素が揃わないと成立しません。
参考Do~Loopステートメントを実際に使っている記事がありますので用意しておきます。
Do~Loopステートメントを実際に使ってみるVBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する
まとめ
Findメソッドを使って完全一致で文字列を検索する方法を解説しました。
文字列検索は手作業だと簡単な作業ですがVBAになると少し難しくなります。
Findメソッドだけの理解ではうまく運用できないので周辺環境を整える為の要素と一緒に使う必要があります。
私は文字列検索自体は初心者向けの作業だと思っています。しかし扱う要素は中級者向けだと考えています。
初心者のうちは少し難しく感じるかもしれませんがあきらめずにチャレンジしてみてください。
特典:Findメソッドより簡単に文字列を検索する方法
実は私はFindメソッドをあまり使いません。理由は「Findメソッド<Like演算子」だと思っているからです。
FindメソッドよりLike演算子を使った方が文字列をかんたんに検索できます。