<p>前回の方法では Loop 条件式で Not c Is Nothing と判断している。<br /> これは、Do ～ Loop 内で検索対象セルが1件も存在しない状況になったときに有効だが、現在の VBA の仕様では完全論理比較を行うので、正常に処理ができない。<br /> また、1件も存在しない場合には、ループに入る前に If 文で判定するのでこの条件式は不要だった。<br /> 今回はこの問題に対応している。</p>
<table>
<tbody>
<tr><th>　</th><th>番号</th><th>名前</th></tr>
<tr><th>　</th><th>1</th><th>2</th></tr>
<tr><th>A</th>
<td>0001</td>
<td>佐藤</td>
</tr>
<tr><th>B</th>
<td>0002</td>
<td>鈴木</td>
</tr>
<tr><th>C</th>
<td>0003</td>
<td>田中</td>
</tr>
<tr><th>D</th>
<td>0004</td>
<td>小林</td>
</tr>
</tbody>
</table>
<p><strong>※1 番号は書式指定で "0000" とし、 1 を 0001 としている</strong><br /> <br /> たとえば、番号 "0003" の田中さんを取得したい場合には以下のように処理をする。</p>
<pre class="brush: vb;">Function CellAddress(c As Range) As String
    CellAddress = ""
    If Not c Is Nothing Then CellAddress = c.Address
End Function

Sub 番号3番の田中さんを見つける()
    Const NameCol = 1
    Dim SearchArea As Range             ' 検索範囲
    Dim c As Range                      ' 検索結果
    Dim firstAddress As String          ' 最初に見つかったセルのアドレス
    
    ' 検索範囲
    With ThisWorkbook.Sheets("Sheet1").Range("A1").CurrentRegion
        Set c = .Columns(1).Find(3)     ' 検索範囲の最初のカラムから番号を検索
        firstAddress = c.Address    ' 最初のアドレスを覚えておく ※2
        Do
            MsgBox .Cells(c.Row, NameCol), vbOKOnly, "発見"
            Set c = .FindNext
        Loop While (CellAddress(c) &lt;&gt; firstAddress)
    End With
End Sub</pre>
<p><strong>※2 同じ番号が複数回出現するなどでループにて処理を行う場合、最後のセルの次を検索すると最初のセルが見つかる。<br /> このため、最初に見つかったセルのアドレスを覚えておく必要がある。</strong> この方法で、検索を行うと if 文を利用して検索するよりも断然早く処理を完了させることができる。<br /> また、見つかったデータを削除するようなケースでは、以下のように処理を行う。</p>
<pre class="brush: vb;">Sub 見つけた番号3番の田中さんを全て削除する()
    Const NameCol = 1
    Dim SearchArea As Range             ' 検索範囲
    Dim c As Range                      ' 検索結果
    Dim firstAddress As String          ' 最初に見つかったセルのアドレス
    
    ' 検索範囲
    With ThisWorkbook.Sheets("Sheet1").Range("A1").CurrentRegion
        Set c = .Columns(1).Find(3)     ' 検索範囲の最初のカラムから番号を検索
        Do
            Rows(foundRow).Delete 
            Set c = .FindNext
        Loop While Not c Is Not Nothing
    End With
End Sub</pre>
<p>削除処理の場合は、見つかったデータ全てを削除していくので、最初に見つかったセルのアドレスを覚える必要がない。</p>