|
> Loop While Not c Is Nothing And c.Address <> firstAddress
この HELPの使用例がまずい 理由を 簡単な事例で説明させていただきます。
Sub 検索でヒットしたセルを書き換えないばあい()
Dim c As Range
Dim 範囲 As Range
Dim firstAddress As String
Set 範囲 = Range("A1:O10")
Set c = 範囲.Find(What:="担当者", _
LookIn:=xlFormulas, LookAt:=xlPart)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Interior.Color = vbYellow
Set c = 範囲.FindNext(c)
Loop Until c.Address = firstAddress
End If
End Sub
Sub 検索でヒットしたセルを書き換えるばあい()
Dim c As Range
Dim 範囲 As Range
Set 範囲 = Range("A1:O10")
Set c = 範囲.Find("担当者", , xlFormulas, xlPart)
If Not c Is Nothing Then
Do
c.Value = "発注者"
Set c = 範囲.FindNext(c)
Loop Until c Is Nothing
End If
End Sub
★ここでヘルプの使用例のように
FindNext Loopの終了条件を
> Loop While Not c Is Nothing And c.Address <> firstAddress
と書くとなぜまずいかをちょっと解説しときますと、
範囲内の 「担当者」を含むセルが、すべて「発注者」に置き換えられた
とき、
> Set c = 範囲.FindNext(c)
c は Nothing が戻ります。
このとき
> Loop While Not c Is Nothing And c.Address <> firstAddress
という文は 前半のLoop脱出条件 While Not c Is Nothing だけで
必要かつ十分であるにもかかわらず、Basic(VB6まで)は
2番目の条件 And c.Address <> firstAddress
をかならず評価します。
その結果、Nothing(どこにもない)もののアドレスを取得しようとして
致命的エラーとなります。
cなどでは
> Loop While Not c Is Nothing
で「False」と判定されたら、AND 以降はもう実行しないから
この手のエラーにはなりませんが。
さて、ヒットしたセルを書き換えるばあいでも、
> Loop Until c Is Nothing
でなく、
> Loop Until c.Address = firstAddress
をつかわなければならないケースもあります。
たとえば、検索文字列に 検索文字列を含んで文字連結したり(置換)するばあい
です。
Sub 検索でヒットしたセルを書き換えるばあい2()
Dim c As Range
Dim 範囲 As Range
Dim firstAddress As String
Set 範囲 = Range("A1:O10")
Set c = 範囲.Find("りんご", , xlFormulas, xlPart)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = Replace(c.Value, "りんご", "りんご(apple)")
Set c = 範囲.FindNext(c)
Loop Until c.Address = firstAddress
End If
End Sub
★上の例は 単にまえの2つのsampleとの比較のためのsampleで
実際は Replaceメソッドを使用して一括置換しちゃいますが。
|
|