2017-06-19 5 views
1

Ich habe ein Thema, wenn diese SchleifeVBA: Zugriff Absturz ohne Fehler beim Aufruf der Funktion

Public IE As InternetExplorer 
Private Declare Sub Sleep Lib "kernel32" (ByVal lngMilliSeconds As Long) 
Dim el As Object 

Public Function IEClick(Idstr As String) 
Do 
    Set el = Nothing 
    On Error Resume Next 
    Set el = IE.Document.getElementById(Idstr) 
    On Error GoTo 0 
    DoEvents 
    Sleep (100) 
Loop While el Is Nothing 
Sleep (1000) 
IE.Document.getElementById(Idstr).Click 
End Function 

Sein Aufruf wahr, bis er die richtige elementID findet. Ich stürze mit keiner Fehlermeldung in dieser Zeile IEClick Str(Item), wenn die Funktion so aufgerufen wird.

For Each Item In coll 
    IEClick Str(Item) 
    p = p + 1 
Next 

Dies ist der vollständige Code.

Public Sub AutoExtract() 
Dim ProgressBar_Extract As Object 
Dim coll As Collection 
Set coll = New Collection 

'/////////////////controls in order/////////////// 
With coll 
    .Add "ctl00_cmdCustom" 
    .Add "chkAll" 
    .Add "ctl00_cmdContinue" 
End With 
Me.ProgressBar_Extract.Max = coll.Count 
'////////////////////start ie////////////////// 
Set IE = New InternetExplorerMedium 
With IE 
    '.AddressBar = False 
    '.MenuBar = False 
    .Navigate ("*****") 
    .Visible = True 
End With 
'//////////////////////Start Automation/////////////////// 
For Each Item In coll 
    IEClick Str(Item) 
    p = p + 1 
Next 
MsgBox "Extract Complete" 
End Sub 

Ich verengte es auf IEClick Str(Item) .Wenn das Debuggen, wenn ich einen Anschlag auf sie und Schritt zur nächsten Zeile setzen stürzt.

+0

Was genau bedeutet "Absturz ohne Fehlermeldung" *? Es schließt ab? Oder es schließt sich (läuft dann der Access-Prozess noch?)? – Andre

+0

@Andre schließt den Prozess wird nicht ausgeführt. – Quint

+0

Als ersten Schritt empfehle ich eine vollständige [Decompile] (http://stackoverflow.com/a/3268188/3820271). – Andre

Antwort

0

1) Item als Variablennamen nicht verwenden, tun, ist es ein reserviertes Wort in VBA (Collection.Item)

2) Option Explicit an der Spitze jedes Moduls Setzen.
Erzwingt die Deklaration von Variablen und meldet nicht deklarierte oder falsch geschriebene Variablen/Konstanten zur Kompilierzeit. Um dies automatisch in neuen Modulen zu haben, setzen Sie die Option im VBA-Editor.

3) Ich konnte einen Absturz nicht reproduzieren, aber ich bekomme einen Laufzeitfehler beim Aufruf Str() mit einem String-Parameter.

Try this:

Option Explicit 

Public Sub TestCrash() 

    Dim coll As Collection 
    Dim vItem As Variant 

    Set coll = New Collection 

    With coll 
     .Add "ctl00_cmdCustom" 
     .Add "chkAll" 
     .Add "ctl00_cmdContinue" 
    End With 

    For Each vItem In coll 
     ' Gives Runtime error 13 "Type mismatch" 
     ' Debug.Print Str(vItem) 

     ' This works 
     Debug.Print vItem 
    Next 

End Sub 

und wenn es funktioniert, Ihren Code anzupassen.

+0

Vielen Dank für Ihre Hilfe Andre. Ich werde es versuchen und Sie wissen lassen. – Quint

+0

Wenn die Antwort Ihr Problem gelöst hat, können Sie [akzeptieren] (http://stackoverflow.com/help/someone-answers), dies markiert auch die Frage als gelöst. @Quint – Andre

Verwandte Themen