|
こんばんは。
>>因みに何故指摘したかと言いますと、この条件の前にりんさんのソースで
>>以前検証して、Nothingを返されたからです。
>Set c = .FindNext(c) '検索を繰り返す
>で、 Nothingが返される
>実例がございまいたら、
>ここに提示してもらえませんか?
これは、「備えあれば憂いなし」という事を言っているのだと思いますよ!!
特に私のようにFindメソッド回りのロジックなど一度作成したら、
再利用可能なプロシジャーにしておいて、それを利用したい。
という考え方だと、
>Set c = .FindNext(c)
で、 Nothingが返されることをチェックするコードは入れなくては
なりませんねえ!!
例えば、
Book1.xlsのThisworkbookのモジュールに
'=======================================================
Option Explicit
Public WithEvents sht As Worksheet
'=========================================================
Private Sub sht_SelectionChange(ByVal Target As Range)
Target.Value = ""
End Sub
book2.xls(sheet1というシートが存在するブック)の標準のジュールに
'==========================================================
Option Explicit
'==========================================================
Sub main()
Worksheets("sheet1").Activate
mk_sample
With CreateObject("excel.application")
.Visible = True
With .Workbooks.Open(ThisWorkbook.Path & "\book1.xls")
Set .sht = ThisWorkbook.Worksheets("sheet1")
End With
End With
AppActivate Application.Caption
End Sub
'==========================================================
Sub mk_sample()
Cells.Delete
Range("a2:a4").Value = "aaa"
Range("a10").Value = "aaa"
Range("a1").Select
End Sub
'==========================================================
Sub Test()
Dim c, firstAddress
With Range("A2:a10")
Set c = .Find("aaa", after:=Range("a10"), LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
c.Select
firstAddress = c.Address
Do
c.Interior.ColorIndex = 5 'とりあえず青く塗ってみたり
Set c = .FindNext(c) '検索を繰り返す
Loop While c.Address <> firstAddress
End If
End With
End Sub
として、Book1.Xls Book2.Xlsは、同一フォルダ上に保存してください。
一度、全てを閉じた後、Book2.Xlsのみ起動してください。
まず、mainを実行してください。
次いで問題の Testを実行して見てください。
私が試した限りでは、無限ループに陥ります(Excel2002で確認)。
こんなコードにすることがよくない と思われるかもしれません。
が、Findメソッドを使って汎用的(再利用可能)なコードを作成しようと
考えた時には上記のような事象にも対応するコード、
つまり、
>Set c = .FindNext(c) '検索を繰り返す
で、 Nothingが返される
ことを想定したコードが必要かと思います。
よって、Nothingチェックが無駄だとは一概には言えないと思いますよ!!
|
|