2010-11-18 17 views
1

アプリケーションに対して特定のアクションを実行するためのスクリプトとして使用するExcelマクロはほとんど作成していません。各スクリプトには複数の関数呼び出しがあり、実行中にこれらの関数呼び出しの一部がアプリケーション関連のパフォーマンス上の問題(Windowsが正しく読み込まれなかった/ウィンドウの読み込みに予想以上に時間がかかったなど)によって失敗します。

頻繁に静かになり、私たちの実行は常に失敗しています。実行中に失敗した関数(マクロからの関数)を再実行できるスクリプトをいくつか実装する予定です。
同じ機能を再度実行する目的を達成するために、どのようにコードするべきか教えてください。マクロで関数を下回るがある場合、例えば



コール:この場合
機能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

すべての関数を辞書オブジェクトに格納します。

が辞書から関数名を消去し、Microsoftスクリプトランタイムライブラリ関数は、関数の最後で...実行され

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 

への参照を設定します。すなわち、

public Function Function1() 

dict.remove "Function1" 

End Function 

最後のステップは、辞書にループを追加して、まだアイテムが残っているかどうかを確認することです。辞書に項目がない場合、関数は正常に実行されます。項目がある場合は、application.run "Function1"を使用して関数を再度呼び出し、関数名に "Function1"を置き換えます。下記の完全な例、モジュールにコピー&ペーストして "MasterFunction"を実行してください。私が呼び出さない3番目の関数は、実行されなかったことをシミュレートします。コードをステップ実行すると、残りの唯一の項目が呼び出されていない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 
関連する問題