2017-02-21 4 views
1

Ich scheine in einem seltsamen Problem stecken. Ich habe den Excel VBA-Code unten, um eine Website zu besuchen und eine Benutzer-ID (aus der Benutzer-ID-Spalte A in Blatt 1) ​​einzugeben und den Namen des Benutzers abzurufen, der nach dem Klicken auf die Schaltfläche "Senden" angezeigt wird. Anschließend werden die restlichen Benutzer-IDs fortgesetzt.Excel VBA mehrere For-Schleife funktioniert nicht

Public Sub TEST() 
TestPage = "http://test.com/" 

Dim IE As New InternetExplorer 
Dim Doc As HTMLDocument 
Dim GetElem As Object 
Dim GetElem2 As Object 

IE.Visible = True 
IE.navigate TestPage 
Do 
    DoEvents 
Loop Until IE.readyState = READYSTATE_COMPLETE 
Application.Wait (Now + TimeValue("0:00:04")) 

Set Doc = IE.document 
CurRow = Sheet1.UsedRange.Rows.Count 

Do While CurRow > 0 
    Application.Wait (Now + TimeValue("0:00:4")) 

    'Find/Get the userID textbox and enter the current userID 
    For Each GetElem In Doc.getElementsByTagName("input") 
     If GetElem.ID = "query" Then 'I could just do getElementByID later 
      GetElem.Value = Sheet1.Range("A" & CurRow).Value 
     End If 
    Next 

    'Find and click the submit button   
    For Each GetElem2 In Doc.getElementsByTagName("button") 
     If GetElem2.Type = "submit" Then 
      GetElem2.Click 
      Application.Wait (Now + TimeValue("0:00:03")) 
     End If 
    Next 
    CurRow = CurRow - 1 
Loop 
End Sub 

Das Problem ist der Code funktioniert nur einmal. Es gibt die erste Benutzer-ID in das Textfeld ein und drückt auf Senden. Wenn es jedoch eine Schleife ausführt und versucht, die nächste Benutzer-ID einzugeben, bleibt der Code in einer Schleife stecken.

Wenn ich die gesamte 2. For-Next-Schleife entfernt, funktioniert es (obwohl es nicht einreicht, gibt es jede der Benutzer-IDs in das Textfeld ein).

Obendrein, wenn ich den F8 Debugging des Codes Schritt für Schritt, alles funktioniert gut. Nur Probleme bekommen, wenn sie vollständig den Code ausgeführt wird. :(

+0

Setzen Sie ein 'debug.print CurRow' vor dem' Loop' und prüfen Sie den Wert, den es in unmittelbaren Fenstern geben. – Vityata

+0

Es wird in einer Schleife stecken. CurRow ist immer größer als 0. Jedes Mal, wenn es durchläuft, startet es das "For Each GetElem In Doc.getElementsByTagName (" input ")" - also wird es immer an die erste Instanz - jede Schleife - übergeben loswerden der Schleife Do While CurRow> 0. versuche, zuerst alle .query-Namen in ein Array zu schreiben und dann für i = lbound (myArray) zu ubound (myArray) –

+0

Ich verstehe nicht :(Ich kann dich sehen ' Du hast das Problem vielleicht schon gesehen, aber ich kratze mir hier den Kopf. Warum hast du gesagt, CurRow ist immer größer als Null? Ich meine CurRow beginnt als Blatt 1.usedrange.rows.count was 78 ist, wird es jedes Mal um 1 reduziert, wenn es in der Do-While-Schleife eine Schleife bildet – jay

Antwort

0
Public Sub TEST() 
TestPage = "http://test.com/" 

Dim IE As New InternetExplorer 
Dim Doc As HTMLDocument 
Dim GetElem As Object 
Dim GetElem2 As Object 

IE.Visible = True 
IE.navigate TestPage 
Do 
    DoEvents 
Loop Until IE.readyState = READYSTATE_COMPLETE 
Application.Wait (Now + TimeValue("0:00:04")) 

Set Doc = IE.document 
CurRow = Sheet1.UsedRange.Rows.Count 

    For Each GetElem In Doc.getElementsByTagName("input") 
     If GetElem.ID = "query" Then 'I could just do getElementByID later 
      GetElem.Value = Sheet1.Range("A" & CurRow).Value 
      For Each GetElem2 In Doc.getElementsByTagName("button") 
       If GetElem2.Type = "submit" Then 
        GetElem2.Click 
        Application.Wait (Now + TimeValue("0:00:03")) 
       End If 
      Next GetElem2 
     End If 
     CurRow = CurRow + 1 
    Next GetElem 

End Sub 
Verwandte Themen