2010-11-18 3 views
1

우리는 응용 프로그램에 대해 특정 작업을 수행하기위한 스크립트로 사용하는 Excel 매크로를 거의 만들지 않았습니다. 각 스크립트는 여러 함수 호출을 가지고 있으며 실행 중에 이러한 함수 호출 중 일부는 응용 프로그램 관련 성능 문제로 인해 실패합니다 (예 : 창이 제대로로드되지 않았거나 창에로드하는 데 예상보다 많은 시간이 걸렸음)

이러한 응용 프로그램 성능 관련 문제가 발생하기 때문에 조용하게 자주 실행되고 우리의 실행은 항상 실패하고 있습니다. 실행 중에 매크로가 실패한 함수를 다시 실행할 수있는 코드를 스크립트에 구현할 계획입니다.
동일한 기능을 다시 실행하는 목적을 달성하기 위해 어떻게 코딩해야하는지 알려주십시오. 매크로 함수 아래에있을 경우, 예를 들어

,

호출이 경우
기능 1
기능 2
기능 3
함수 2 그때 동안 기능 2를 다시 실행하고자 실패하면 실행 시간.

: 여기 우리는 수 있도록 내가 실행 중에 실패 어떤 기능을 다시 실행하는 기능을 구현해야하므로 실패하는 함수를 호출 모르는 기능 1/기능 2/기능 3.런타임 동안 동일한 함수를 다시 실행하는 방법

답변

0

모든 함수가 성공 또는 실패를 나타내는 부울을 반환하도록 만든 다음 다시 테스트할지 여부를 테스트 할 수 있습니다. 무한 루프를 피하기위한 실행 카운터도 포함 된 예제가 있습니다.

Sub Master() 

    Dim lRunCount As Long 

    Const lRUNMAX As Long = 5 

    lRunCount = 0 
    Do 
     lRunCount = lRunCount + 1 
    Loop Until Function1 And lRunCount <= lRUNMAX 

    lRunCount = 0 
    Do 
     lRunCount = lRunCount + 1 
    Loop Until Function2 And lRunCount <= lRUNMAX 

    lRunCount = 0 
    Do 
     lRunCount = lRunCount + 1 
    Loop Until Function3 And lRunCount <= lRUNMAX 


End Sub 

Function Function1() As Boolean 

    Dim bReturn As Boolean 

    On Error GoTo ErrHandler 
    bReturn = True 

    Debug.Print "function 1 did stuff" 


ErrExit: 
    Function1 = bReturn 
    Exit Function 

ErrHandler: 
    bReturn = False 
    Resume ErrExit 

End Function 

Function Function2() As Boolean 

    Dim bReturn As Boolean 

    On Error GoTo ErrHandler 
    bReturn = True 

    'simulate error 
    If Rnd < 0.5 Then Err.Raise 9999 

    Debug.Print "function 2 did stuff" 


ErrExit: 
    Function2 = bReturn 
    Exit Function 

ErrHandler: 
    bReturn = False 
    Resume ErrExit 

End Function 

Function Function3() As Boolean 

    Dim bReturn As Boolean 

    On Error GoTo ErrHandler 
    bReturn = True 

    Debug.Print "function 3 did stuff" 


ErrExit: 
    Function3 = bReturn 
    Exit Function 

ErrHandler: 
    bReturn = False 
    Resume ErrExit 

End Function 
2

모든 기능을 사전 객체에 저장하십시오.

는 사전에서 함수 이름을 삭제, 마이크로 소프트 스크립팅 런타임 라이브러리 함수는 함수의 끝에서 ... 실행

public Sub MasterFunction() 

Public Dict as Dictionary 
Set dict = New Dictionary 

Dict.add "Function1" 
Dict.add "Function2" 
Dict.add "Function3" 

call Function1 
call Function2 
call Function3 

에 대한 참조를 설정합니다. 즉,

마지막 단계는 사전을 통해 루프를 추가하여 항목이 아직 남아 있는지 확인하는 것입니다. 사전에 항목이 없으면 함수가 성공적으로 실행됩니다. 항목이있는 경우 application.run "Function1"을 사용하여 함수를 다시 호출하고 함수 이름으로 "Function1"을 대체하십시오. 아래의 전체 예를 복사하여 모듈에 붙여 넣은 다음 "MasterFunction"을 실행하십시오. 내가 호출하지 않은 세 번째 함수는 실행되지 않았다는 것을 시뮬레이션합니다. 코드를 단계별로 실행하면 남아있는 유일한 항목이 호출되지 않은 Function3임을 알 수 있습니다.

Public dict As Dictionary 
Public Function MasterFunction() 

Set dict = New Dictionary 
dict.Add "Function1", "Function1" 
dict.Add "Function2", "Function2" 
dict.Add "Function3", "Function2" 

Call Function1 
Call Function2 

Dim DictItem 

For Each DictItem In dict 
Application.Run DictItem 
MsgBox DictItem & " has run again because it didn't execute last time" 
Next 

Set DictItem = Nothing 
Set dict = Nothing 
End Function 

Function Function1() 
    dict.Remove "Function1" 
End Function 

Function Function2() 
    dict.Remove "Function2" 
End Function 

Function Function3() 
    dict.Remove "Function3" 
End Function 
관련 문제