【いちからExcel VBA】Findを使って指定した文字列を含むセルを検索する方法

プログラミングの勉強

 
 Findメソッドを用いて指定した文字を含むセルを検索する方法を示します。以前にIf~ThenステートメントとFor~Nextステートメントを使って指定した文字と同じ文字が記入されているセルを検索する方法を示しましたが、Findでは完全一致か部分一致か、あるいは全角と半角の区別をどうするかなど、判定基準を多少設定することができます。今回も例題として家計簿から指定した項目を抜き出して、合計金額を計算してみます。

Findメソッド

 Findメソッドは、指定したセル範囲から指定したデータを検索します。そして、最初に見つかったセルを返し、見つからなかった場合にはNothingを返します。検索文字列以外は省略が可能です。

構 文

Rangeオブジェクト.Find(What:=検索文字列, LookIn:=***, LookAt:=***,
                              MatchByte:=***

引 数内  容省  略
What内 容省略できない
LookIn検索する文字列省略できる
省略時 xlFormulasまたは前回指定内容
LookAt数式を検索時  xlFormulas
直を検索時   xlValues
コメント検索時 xlComments
省略できる
省略時 xlPartまたは前回指定内容
MatchByte半角と全角を区別  True
半角と全角区別なし False
省略できる
省略時 Falseまたは前回指定内容

FindNextメソッド

 つぎのデータを検索するときに使用します。Findメソッドで見つかったセルを指定します。条件に合うセルが見つからなかった場合には、Nothingを返します。
 FindNextメソッドはセルを最後まで探した後に最初のセルに戻って検索を継続しますので、最初に見つかったセルに戻ってきた時点でセル検索を終了するように指定する必要があります

構 文

Rangeオブジェクト.FindNext(Findで見つかったセル

Addressプロパティ

 セル番地を返します。

構 文

Rangeオブジェクト.Address → 絶対参照  
Rangeオブジェクト.Address(False , False) → 相対参照

Findを用いたプロシージャ

 下記の関連記事に示した家計簿からIf~ThenステートメントとFor~Nextステートメントを使ったプロシージャをFindメソッドを用いて書き換えます。

 書き換えたプロシージャをつぎに示します。
 まず、”1月”~”12月”のそれぞれのシートを For i=0 To 11 で指定しています。
 Findメソッドでは検索して同じ項目のセルが見つかった後は、Do~Loop Untilアドレスが最初に見つけたセルと同じセルにくるまでFindNextで繰り返して検索します。それぞれ同じ項目のセルが見つかった場合の処理内容は同じ内容であるため、処理内容はサブルーチン化しました。また、Ifを使って最初のアドレスと新しく検索したアドレスが同一でない場合に、このサブルーチンを実行するようにしています。
 また、Findメソッドで同じ項目が検索できなかった場合(Nothingである場合)は検索が終了します。

Sub シート検索()
For i = 0 To 11
   Kakeibo.Activate                     '家計簿ファイルをアクティブにして
   Set Kwksht(i) = Worksheets(sht(i))           'ワークシートを設定
   Set Kensakuhani = Kwksht(i).Range("C5:S35")  '検索範囲を設定
'ーーーーーーFindでkoumokuと部分一致、全角半角の別なしで検索ーーーーーーーーー
   Set Onajisel = Kensakuhani.Find(What:=koumoku, LookIn:=xlFormulas, _
                                    LookAt:=xlPart, MatchByte:=False)
   Basho = Onajisel.Address           '---検索結果のアドレスをBashoに入力
   If Not Onajisel Is Nothing Then '---もし検索結果があったらシート書き込みへ
        Call シート書き込み
        Do      '---Bashoと同じアドレスが見つかるまでつぎの検索を実行
            Set Onajisel = Kensakuhani.FindNext(Onajisel)
            Basho2 = Onajisel.Address '---新しく見つかったアドレスをBaho2に入力
            If Basho2 <> Basho Then  '---Bashoと違うアドレスならシート書き込みへ
                Call シート書き込み
            End If
        Loop Until Onajisel.Address = Basho
    End If
    Set Onajisel = Nothing                    '---Onajiselを初期化
Next
Thisbook.Activate 'ーーーーーーーーーーここから下は前回と一緒ーーーーーーーーーー
wksht1.Cells(ii + 1, 2).HorizontalAlignment = xlCenter
wksht1.Cells(ii + 1, 2) = "合 計"
wksht1.Cells(ii + 1, 4).NumberFormat = "0,000"
wksht1.Cells(ii + 1, 4) = goukei
Set rng = Range(Cells(3, 2), Cells(ii + 1, 4))
rng.Borders.LineStyle = xlContinuous
End Sub

 処理内容のサブルーチンは下記内容ですが、検索した項目の日付と金額を抜き出すために、.Rowで行番号を、.Columnで列番号を抜き出して利用しています。それ以外は、関連記事の処理内容と同じ内容です。

Sub シート書き込み()
    BashoR = Onajisel.Row        'セルの行番号を取得
    BashoC = Onajisel.Column     'セルの列番号を取得
 'ーーーーーーここから下は前回の操作と同じものに検索文字の出力を追加ーーーーー
    hizuke = Kwksht(i).Cells(BashoR, 2)
    kingaku = Kwksht(i).Cells(BashoR, BashoC + 1)
    ii = ii + 1
    Thisbook.Activate
    wksht1.Cells(ii, 2).NumberFormat = "m月d日"
    wksht1.Cells(ii, 2) = hizuke
    wksht1.Cells(ii, 3).HorizontalAlignment = xlCenter
    wksht1.Cells(ii, 3) = Onajisel  'ーーーー検索した文字の出力を追加ーーーー
    wksht1.Cells(ii, 4).NumberFormat = "#,000"
    wksht1.Cells(ii, 4) = kingaku
    goukei = goukei + kingaku
    Kakeibo.Activate
End Sub

Findによる検索結果

 上記のプロシージャを実行した場合の結果(右側)を、関連記事の検索プロシージャ結果(左側)と比較して示します。If で検索した場合には、完全に一致するものだけを検索しますので、Findで検索した場合の”Pasmo”や”PASMO”は検索されません。Find を用いたプロシージャでは、半角と全角の区別無く検索する、また部分的に一致するものも検索するという条件で検索を掛けていますので、このような違いが出ています。
 入力値自体が多少曖昧でも検索したい場合には Find は効果的だと思います。その代わり、プロシージャは FindNextで検索を継続したり、最初に見つけたアドレスに戻ることで検索終了を判断するなど、少々複雑なプロシージャになりがちです
 このように、完全一致で良いのか、多少曖昧でも検索したいのかに応じて使い分けされるものと思われます。

 以上、参考になれば幸いです。

コメント

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