【问题标题】:VBA error on "Loop Until" statement“循环直到”语句上的 VBA 错误
【发布时间】:2016-01-29 07:04:25
【问题描述】:

对不起,伙计们,这更像是上一个问题的更新问题...我设法弄清楚了我在单击 IE 中的“下一个结果”按钮并将其循环回来以拉出相同的数据,然后单击“下一个结果”按钮并提取相同的数据......依此类推,直到......这就是我遇到问题的地方。我在“循环直到”语句中不断收到“需要对象”错误...我尝试了许多不同的解决方法,切换到变量等,但仍然遇到错误。基本上,我只想在“下一个结果”按钮不再可用时停止循环(当没有更多数据要提取时,这显然会发生)。

这是导致问题的 VBA 部分...

Dim TDelements As IHTMLElementCollection
Dim TDelement As HTMLTableCell
Dim r As Long

Set TDelements = IE.document.getElementsByTagName("tr")

r = 0

Do
Application.Wait Now + TimeValue("00:00:03")

For Each TDelement In TDelements

    If TDelement.className = "searchActivityResultsContent" Then
        Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
        r = r + 1
    ElseIf TDelement.className = "searchActivityResultsContent" Then
        Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
        r = r + 1
    End If
Next

Application.Wait Now + TimeValue("00:00:02")

Set elems = IE.document.getElementsByTagName("input")
For Each e In elems

If e.Value = "Next Results" Then
    e.Click
    Exit For
End If

Next e

Loop Until e.Value <> "Next Results"

Do Until Not IE.Busy And IE.readyState = 4
DoEvents
Loop

IE.Quit 

这是我所指的按钮的 HTML 代码...

<table class="contentTable" align="center">
    <tr class="contentTableTR">
<form name="scrollResultListForm" method="post"   action="/scrollTransactionsList.do" onsubmit="return isBusy();">




<input type="submit" name="action" value="Next Results" onmouseover="showComment(event,'Display next results')" onmouseout="hideComment()" class="formButton">


<input type="submit" name="action" value="Last Page" onmouseover="showComment(event,'Goto last result page')" onmouseout="hideComment()" class="formButton">

</form>
</tr>
</table>

【问题讨论】:

  • until语句从循环末尾移动到循环开头的do语句,以创建Do Until循环。
  • @SilentRevolution 在第一个Do e 将是nothing,如何进入循环?谁支持这个?抱歉,那是错误的:/
  • 你不使用option explicit 吗? e 未定义
  • 添加一个On Error Resume Next 将强制循环开始。 @DirkReichel,要有创意。
  • 不幸的是,将Until语句移到开头的Do语句以相同的结果结束。

标签: vba excel


【解决方案1】:

第一个问题:“最后”页有IE.document.getElementsByTagName("input")吗? (我假设这一点。但我想确定)

试着稍微修改一下你的代码:

....
Set elems = IE.document.getElementsByTagName("input")
Dim Next_Loop As Boolean
Next_Loop = True
For Each e In elems

  If e.Value = "Next Results" Then
    e.Click
    Next_Loop = False
    Exit For
  End If

Next e

Loop Until Next_Loop
....

如果For Each 循环结束,变量将为空,这会导致错误。或者,您可以将 Loop Until e.Value &lt;&gt; "Next Results" 行更改为:

Loop Until e Is Nothing

但这只有在 e 被声明为对象时才有效;)

编辑

请试试这个:

Dim TDelements As IHTMLElementCollection
Dim TDelement As HTMLTableCell
Dim r As Long, i As Long
Dim e As Object

Set TDelements = IE.document.getElementsByTagName("tr")
r = 0

For i = 1 To 1
Application.Wait Now + TimeValue("00:00:05")

  For Each TDelement In TDelements
    If TDelement.className = "searchActivityResultsContent" Then
      Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
      r = r + 1
    ElseIf TDelement.className = "searchActivityResultsContent" Then
      Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
      r = r + 1
    End If
  Next

  Application.Wait Now + TimeValue("00:00:05")
  Set elems = IE.document.getElementsByTagName("input")

  For Each e In elems
    If e.Value = "Next Results" Then
      e.Click
      i = 0
      Exit For
    End If
  Next e

Next i

Do Until Not IE.Busy And IE.readyState = 4
  DoEvents
Loop
IE.Quit

【讨论】:

  • 感谢您的回复,不幸的是,添加上述代码(“Next_Loop”)似乎只能解决有关错误的问题,它确实点击了第二张数据但没有拉取数据,并且不会继续在所有页面中单击“下一个结果”按钮。我希望能够循环整个代码块,以便从每个工作表中提取所需的数据,直到没有更多工作表为止。
  • 再次感谢,您的编辑确实有助于循环返回,但现在当它尝试提取数据时,我在第一个“如果 TDelement ...”上收到错误消息“权限被拒绝”...对我来说没有多大意义,因为我发布的第一个版本的代码实际上会从第二张表中提取数据并在循环中给我“需要对象”错误......我开始觉得我在在无限的错误循环中。任何其他建议将不胜感激。
  • 也许THIS 可以帮助你一点......感觉页面没有完成加载,而某些操作完成了:/
【解决方案2】:

当所有e 用尽时,您的for each 就会结束。因此,当您到达 Loop 时,e 必须是 Nothing

【讨论】:

  • 对不起,我没有在我的原始帖子中提到这一点,但我是 VBA 的初学者。你能详细说明你的答案吗?我如何将这个建议的修复应用到我的代码中?谢谢
猜你喜欢
  • 2019-01-07
  • 2021-08-27
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多