Как повторно выполнить ту же функцию во время выполнения - PullRequest
1 голос
/ 19 ноября 2010

Мы создали несколько макросов Excel, которые мы используем в качестве скрипта для выполнения определенных действий с приложением.Каждый сценарий имеет несколько вызовов функций, и во время выполнения некоторые из этих вызовов функций не выполняются из-за проблем с производительностью, связанных с приложением (например, окно не загружается должным образом / окно занимает больше времени, чем ожидалось, для загрузки и т. Д.)связанные с этим проблемы часто происходят тихо, и наше выполнение все время терпит неудачу, мы планируем реализовать некоторый код в скрипте, используя который во время выполнения мы сможем снова выполнить сбойную функцию (функция из макроса).
МожетВы даете мне знать, как мне написать код для достижения моей цели повторного выполнения той же функции.

Например,

Если в макросе есть вызовы функций ниже:
Функция 1
Функция 2
Функция 3
В этом случае, если функция 2 завершается сбоем, я хотел бы повторно выполнить функцию 2. во время выполнения.

Примечание : Здесь мы не знаемвызов какой функции завершится неудачей, поэтому мне нужно реализовать возможность повторного выполнения любой функции, котораяls во время выполнения, поэтому это может быть функция 1 / функция 2 / функция 3.

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Сохранение всех функций в объекте словаря.

установить ссылку на Microsoft Scripting Runtime Library

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». Третья функция, которую я не вызываю, чтобы смоделировать, чтобы она не запускалась. Если вы пройдете по коду, то увидите, что единственный оставшийся элемент - это 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
0 голосов
/ 19 ноября 2010

Вы можете заставить все ваши функции возвращать логическое значение, указывающее на успех или неудачу, а затем проверить его, чтобы определить, следует ли выполнить его повторно.Вот пример, который также включает счетчик выполнения, чтобы избежать бесконечных циклов.

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
...