Application.Evaluate 또는 ActiveSheet.Evaluate 메서드를 사용하여 루틴을 호출 할 때 서브 루틴 내부에서 찾기 루프를 실행하는 데 문제가 있습니다. 예를 들어, 아래 코드에서 시트의 "xxx"문자열을 검색하는 서브 루틴 FindSub()을 정의합니다. 루틴 인 CallSub()은 표준 Call 문과 Evaluate를 사용하여 FindSub() 루틴을 호출합니다.평가에서 호출 할 때 VBA 찾기 루프가 실패하는 이유는 무엇입니까?
Call FindSub를 실행하면 모든 것이 예상대로 작동합니다. 일치하는 각 주소가 직접 창에 출력되고 코드 완료시 최종 메시지 "Finished up"이 표시됩니다. 그러나 Application.Evaluate "FindSub()"을 수행하면 첫 번째 일치 주소 만 인쇄되고 "Finished up"메시지에는 도달하지 않습니다. 즉, 루프가 계속되어야하는지 평가하려고 시도하고 런타임 오류가 인쇄되지 않고 프로그램 실행이 중지 될 때 Cells.FindNext 행 다음에 오류가 발생합니다.
이 경우 동일한 결과를 산출하기 위해 FindSub 및 Application.Evaluate "FindSub()"를 모두 호출해야합니다. 누군가가 왜 그런지 설명 할 수 없으며 가능한 경우이를 고칠 수있는 방법이 있습니까? 감사.
참고 :이 예에서는 분명히 평가를 사용할 필요가 없습니다. 이 버전은보다 복잡한 상황에서 내가 겪고있는 특정 문제에 초점을 맞추기 위해 단순화되었습니다.
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
: http://stackoverflow.com/questions/2611929/stop-vba-evaluate-from-calling-target-function-twice –
@ 리차드 ,이 질문의 저자가 =) –
@Joel, Ooops. 그것은 나에게별로 관여하지 않았다. 고마워 :) 그래도, 다른 사람들이 어떤 사람들을 만나면 복습하는 것이 좋은 질문입니다. 홀수 함을 평가하십시오. –