我有運行的子程序內發現環路時常規使用Application.Evaluate或ActiveSheet.Evaluate方法叫一些問題。例如,在下面的代碼中,我定義了一個子例程FindSub(),它在工作表中搜索字符串「xxx」。例程CallSub()使用標準的Call語句和Evaluate調用FindSub()例程。爲什麼從Evaluate調用VBA Find循環失敗?
當我運行Call FindSub時,一切都會按預期工作:每個匹配的地址都會打印到即時窗口,當代碼完成時,我們會收到最終消息「完成」。但是,當我做Application.Evaluate「FindSub()」中,只有第一個匹配的地址被打印出來了,我們永遠不會到達「完成了」的消息。換句話說,在循環嘗試評估它是否應該繼續時,在Cells.FindNext行之後遇到錯誤,程序執行停止而沒有打印任何運行時錯誤。
我期望既調用FindSub和Application.Evaluate「FindSub()」在這種情況下產生相同的結果。有人可以解釋他們爲什麼不這樣做,如果可能的話,解決這個問題的方法?謝謝。
注:在這個例子中,我顯然不需要使用Evaluate。這個版本被簡化爲專注於我在一個更復雜的情況下遇到的特定問題。
Sub CallSub()
Call FindSub
Application.Evaluate "FindSub()"
End Sub
Sub FindSub()
Dim rngFoundCell As Range
Dim rngFirstCell As Range
Set rngFoundCell = Cells.Find(What:="xxx", after:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not rngFoundCell Is Nothing Then
Set rngFirstCell = rngFoundCell
Do
Debug.Print rngFoundCell.Address
Set rngFoundCell = Cells.FindNext(after:=rngFoundCell)
Loop Until (rngFoundCell Is Nothing) Or (rngFoundCell.Address = rngFirstCell.Address)
End If
Debug.Print "Finished up"
End Sub
有關於.Evaluate下這個問題的侷限性了一些有趣的討論:http://stackoverflow.com/questions/2611929/stop-vba-evaluate-from-calling-target-function-twice – 2010-04-19 14:35:43
@Richard ,這也是這個問題的作者=) – 2010-04-19 15:03:45
@Joel,Ooops。這不是我很注意的。謝謝:)不過,對於其他人來說,回顧一下它是否是一個很好的問題。評估奇怪。 – 2010-04-19 15:38:27