【问题标题】:VBA code only works when in debug modeVBA 代码仅在调试模式下有效
【发布时间】:2018-01-13 00:50:55
【问题描述】:

所以我有这个从网页返回值的函数。问题在于,当我单步运行它时它可以完美运行,但是当我正常运行它时,它会返回另一个值并跳过objIE.Quit。这是代码:

Private Function Mexico(partida As String) As String

partida = Left(partida, 8)

Set objIE = New InternetExplorer
objIE.Visible = True
objIE.navigate "http://www.siicexcaaarem.org.mx/Bases/TIGIE2007.nsf/4caa80bd19d9258006256b050078593c/$searchForm?SearchView"

Cargar

objIE.document.getElementsByName("Query")(0).Value = partida

For Each boton In objIE.document.getElementsByTagName("input")
    If boton.Value = "Search" Then
        boton.Click
        Exit For
    End If
Next

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

Dim temp As String
Dim i As Integer
For Each t In objIE.document.getElementsByTagName("tr")
    If t.className = "domino-viewentry" Then
        temp = t.Children(8).innerText
    End If
Next

If InStr(temp, "*") > 0 Then
    temp = Left(temp, Len(temp) - 1)
End If

If InStr(temp, "%") = 0 Then
    temp = temp & "%"
End If

Mexico = temp

objIE.Quit

End Function

我正在用这个子测试这个:

Sub Mex()
MsgBox Mexico("33030001")
End Sub

当我单步运行它时,它会返回“15%”并在子程序中传递参数,而当我使用任何给定参数正常运行它时它只返回“%”。知道为什么会这样吗?任何帮助将不胜感激。

注意: objIE 被定义为公共变量,但这并没有给我带来任何不便,因为我还有其他功能可以在不同的网站上正常工作。此外,Cargar 是通常的“等待页面加载完毕”指令。

Private Sub Cargar()

Do Until objIE.Busy = False And objIE.readyState = 4
    DoEvents
Loop

End Sub

【问题讨论】:

  • 可能是因为您使用的是 application.wait 而不是实际等待网页加载。它可能需要超过 3 秒。您需要将其替换为一个循环来检查以确保网页已完全加载。
  • 到@K.Davis 点告诉我们Cargar sub
  • @ScottHoltzman 好点,甚至没有注意到那个子。 OP - 请 edit your postCargar 子作为斯科特指出的那样。
  • 你倒退了。您有执行直到它不等于完全加载。你想让你的 Cargar 潜艇说 Do While It's Not Completed Loaded ,因此我提供的潜艇作为答案。

标签: vba excel internet-explorer


【解决方案1】:

在尝试从网页上抓取对象之前,您应该确保您的网页已完全加载。您包含 Application.Wait 的行不会为您执行此操作。

将此子添加到您的模块中:

Sub ieBusy(ByVal ieObj As InternetExplorer)
    Do While ieObj.Busy Or ieObj.readyState < 4
        DoEvents
    Loop
End Sub

然后将Application.Wait 的行替换为:ieBusy objIE

【讨论】:

  • 我确实有那个子,注释中解释说Cargar 照你说的做。 Application.Wait 用于确保页面实际上已完全加载。等待更长的时间也不起作用,所以我认为加载时间不是问题。谢谢你的回答!
【解决方案2】:

因此,在将代码弄乱了几个小时并意识到,遗憾的是,解决方案并不像修复 Cargar 加载 IE 子程序那么简单(因为页面不会“加载”,因为它是 JavaScript 驱动的),我发现这是解决方案:

For Each t In objIE.document.getElementsByTagName("tr")
    DoEvents 'Holy fix
    If t.className = "domino-viewentry" Then
        temp = t.Children(8).innerText
    End If
Next

我很不确定为什么要修复它,并在使用 msgboxes 检查代码的哪些部分运行不正确时想出了这个问题,并且循环内的 msgbox 也修复了它。我很感谢您的 cmets 了解为什么会这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多