小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

ExcelVBAのFindメソッドの留意点

ExcelVBAのシートオブジェクトには、任意のセルに格納されている値(検索文字列)を検索できるFindメソッドがあります。
以下のサンプルのようにRangeプロパティで検索するセルの範囲を指定して、Findメソッドで『検索文字列を指定』し検索して、マッチすればそのセルオブジェクト(一つのみ)を返し、マッチしなければ Nothing を返します。


・サンプル

Dim objCell As Variant
Dim objCell_first As Variant

    Set objCell = Range("A5:A20").Find(What:="Chaichan")
    If objCell Is Nothing Then
       MsgBox "ノーマッチ!!"
    Else
        objCell_first = objCell.Address
        Do
            MsgBox objCell.Row & "行目にマッチ!"
            Set objCell = Range("A5:A20").FindNext(objCell)
        Loop While Not objCell Is Nothing And objCell.Address <> objCell_first
    End If
    Set objCell = Nothing
    Set objCell_first = Nothing

で、留意点なのですが、検索するセルがセル結合していて、かつその結合範囲の一部が検索範囲をはみ出していると、マッチしないのです。
というか、セル結合は何かと引っ掛かります。
いつも、セル結合には泣かされますね。
なので、セル結合には気をつけろ!
という、留意点でした・・・。


尚、複数マッチしたいケースでは、FindNextメソッドを使用します。
FindNextメソッドは、検索範囲内をループ的(下まで行ったらまた上から)に検索します。

・追記:Findメソッドの引数

引数 定数 内容 省略 デフォルト
What   検索対象のデータをバリアント型 (Variant) 型で指定します。 不可  
After   ここで指定したセルの次のセルから検索が開始されます。  
LookIn   数式または表示された値を検索するかどうかを指定します。  
  xlFormulas 数式を検索対象に指定します。    
xlValues 値を検索対象に指定します。    
LookAt   検索方法  
  xlPart 一部が一致するセルを検索します。  
xlWhole 全てが一致するセルを検索します。    
SearchOrder   検索を行う順番  
  xlByRows 列方向に検索します。  
xlByColumns 行方向に検索します。    
SearchDirection   検索を行う方向  
  xlNext 順方向に検索します。  
xlPrevious 逆方向に検索します。    
MatchCase   大文字と小文字の区別  
  True 大文字と小文字を区別します。    
False 大文字と小文字を区別しません。  
MatchByte   半角と全角の区別  
  True  半角と全角を区別します。    
False 半角と全角を区別しません。