【検索】Findメソッドを使って完全一致で文字列を探す方法|VBA

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

Findメソッドを使って完全一致で文字列を探す

VBAには文字列を探す方法がいくつかあります。本記事ではFindメソッドの使い方を紹介します。

3つのポイントをもとに解説を進めます。

  1. Findメソッドとは
  2. どんなパラメータがあるのか
  3. 完全一致で文字列を探す方法
EnjoyExcel
EnjoyExcel

Findメソッドは検索対象の文字列がどこのセルに居るのかを返す関数です。

文字列検索ができますがあくまで戻り値はセル(Rangeオブジェクト)です。

Rangeオブジェクトが戻り値だという事はオブジェクト変数が必要になります。

オブジェクト変数への説明も含めて説明していきます。

関連記事

FindメソッドとLike演算子を比較している記事です。Findメソッドの問題点を挙げて説明しています。

おすすめはLike演算子VBAのFindメソッドは変数が難しい|文字列検索はLike演算子!

関連書籍

Findメソッドについてはこちらの書籍で勉強しました。

仕事をマクロに置き換える事ができる

環境次第ですが電子書籍(Kindle)もおすすめです。

PC内でVBEと電子書籍を並べて表示させながら作業をするとコーディングがはかどります。

Findメソッド

VBAに用意された関数の1つです。詳細は以降内容をご覧ください。

Findメソッドとは

Microsoftのドキュメントから引用します。

セル範囲内で特定の情報を検索します。

Microsoft:Findメソッド

かんたんに申し上げますと「Findメソッドは検索対象の文字列がどこのセルに居るのかを返す関数」です。

構文とパラメーター

構文とパラメーターはこちらです。

expression.Find (WhatAfterLookInLookAtSearchOrderSearchDirectionMatchCaseMatchByteSearchFormat)

expression は Range オブジェクトを表す変数です。

名前必須 / オプションデータ型説明
What必須バリアント型検索するデータです。 指定できるのは、文字列、または任意の Microsoft Excel のデータ型です。
After省略可能バリアント型このセルの後から検索を開始します。
これは、ユーザー インターフェイスから検索が実行されたときにアクティブなセルの場所に対応しています。
After は範囲内の 1 つのセルにする必要があることに注意してください。
この引数を指定しない場合は、範囲の左上端のセルの後から検索が開始されます。
LookIn省略可能Variant使用できるのは、XlFindLookIn定数: xlFormulasxlValuesxlComments あるいは 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)検索の書式を指定します。
Microsoft:Findメソッド

戻り値

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つです。

  1. FindNextメソッド
  2. 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演算子を使った方が文字列をかんたんに検索できます。

おすすめ機能VBAで文字列を比較Like演算子とワイルドカードで完全/部分一致を確認【一覧で表示】

EnjoyExcel

タイトルとURLをコピーしました