2010-11-18 20 views
1

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

0

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 
2

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ır

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 

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 
İlgili konular