2017-02-21 11 views
1

Я, кажется, застрял в странной проблеме. У меня есть код Excel VBA ниже, чтобы посетить веб-сайт и ввести идентификатор пользователя (из столбца UserID A на листе 1) и получить имя пользователя, которое появляется после нажатия кнопки отправки, а затем продолжается с остальными идентификаторами пользователя.Excel VBA multiple Для цикла не работает

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 

Проблема заключается в том, что код работает только один раз. Он вводит первый идентификатор пользователя в текстовое поле и отображает «Отправить». Когда он зацикливается и пытается ввести следующий идентификатор пользователя, код зацикливается в цикле.

Если я удаляю весь второй цикл For-Next, он работает (хотя он не отправляется, он вводит каждый из идентификаторов пользователя в текстовое поле).

Кроме того, если я использую F8, отлаживая код шаг за шагом, все работает нормально. Только получая проблемы при полностью выполнение кода. :(

+0

Поместите 'Debug.Print CurRow' перед' Loop' и проверьте значение его дает в ближайшем окне. – Vityata

+0

Он застрял в петле. CurRow всегда больше нуля. Каждый раз, когда он проходит, он запускает «Для каждого GetElem In Doc.getElementsByTagName (« ввод »)« снова и снова », поэтому он всегда будет отвечать первому экземпляру - каждый цикл. избавиться от цикла Do While CurRow> 0. Попробуйте сначала поместить все имена .query в массив, а затем использовать для i = lbound (myArray) для ubound (myArray) –

+0

Я не понимаю :(Я вижу, что-то, и вы, возможно, видели проблему, но я почесываю голову здесь. Почему вы сказали, что CurRow всегда больше нуля? Я имею в виду, что CurRow начинается как лист 1.usedrange.rows.count, который равен 78, тогда он уменьшается на 1 каждый раз, когда он петли в цикле Do-While – jay

ответ

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