Uygulamaya karşı belirli eylemleri gerçekleştirmek için komut dosyası olarak kullandığımız birkaç excel makro oluşturduk. Her betiğin birden fazla işlev çağrısı vardır ve yürütme sırasında bu işlev çağrılarının bazıları uygulamala ilgili performans sorunları nedeniyle başarısız olur (pencere düzgün yüklenmemiş/pencere yüklemesi beklenenden daha uzun sürdü).
Bu uygulamadan önce ilgili sorunlar oluşur Sık sık sessiz ve bizim yürütme her zaman başarısız oluyor, biz komut dosyası bazı kod uygulamak planlıyoruz yürütme sırasında biz tekrar başarısız fonksiyonu tekrar mümkün olabilir (makro fonksiyonu).
Yine aynı işlevi yürütme hedefime ulaşmak için nasıl kod yazmam gerektiğini söyler misiniz? Makro işlev aşağıda varsa Örneğin
,
çağırır: Bu durumda
Fonksiyon 1
Fonksiyon 2
İşlev 3
fonksiyonu 2 Sonra sırasında işlevini 2 yeniden yürütmek istiyoruz başarısız olursa çalışma zamanı.
Not: Burada olması gerektiği yüzden yürütülürken başarısız herhangi bir işlev yeniden yürütmek için bir yeteneği uygulanması gerekir başarısız olur hangi işlev çağrısı bilmiyorum Fonksiyon 1/Fonksiyon 2/İşlev 3.Çalışma zamanında aynı işlevi yeniden yürütme
cevap
sonra yeniden karar vermek için bu test başarılı veya başarısız olduğunu belirten bir Boole döndürür. İşte sonsuz döngülerden kaçınmak için bir çalışma sayacı da içeren bir örnek.
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
Tüm işlevleri bir sözlük nesnesinde saklayın.
sözlükten fonksiyonları adını silmek, Microsoft Scripting çalışma zamanı Kütüphane bir işlev işlevi sonunda ... çalıştırılırpublic 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
bir başvuru ayarlayın. Örneğin, herhangi bir öğenin hala devam edip etmediğini görmek için sözlükte bir döngü eklemektir. Sözlükte bir öğe yoksa, işlevleriniz başarıyla yürütüldü. Öğeler varsa, işlev isminiz için "Function1" yerine, application.run "Function1" işlevini tekrar arayın. Aşağıdaki Tam Örnek, Bir modüle kopyalayıp yapıştırın ve "MasterFunction" komutunu çalıştırın. Üçüncü işlev, çalışmadığını simüle etmek için aramıyorum. Eğer koddan geçerseniz, kalan tek öğenin, çağrılmayan Function3 olduğunu göreceksiniz. Eğer fonksiyonların hepsi yapılabilir
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