VBA代码仅在调试模式下工作

VBA代码仅在调试模式下工作,vba,excel,internet-explorer,Vba,Excel,Internet Explorer,我有一个函数,它从网页返回一个值。问题是,当我一步运行它时,它工作得很好,但当我正常运行它时,它会返回另一个值,并跳过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.siicexcaaar

我有一个函数,它从网页返回一个值。问题是,当我一步运行它时,它工作得很好,但当我正常运行它时,它会返回另一个值,并跳过
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%”并在sub中传递参数,而当我使用任何给定参数正常运行它时,它只返回“%”。知道为什么会这样吗?任何帮助都将不胜感激

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

Private Sub Cargar()

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

End Sub

在尝试从网页上抓取对象之前,应确保网页已完全加载。您包含
应用程序的行。等待
不会为您执行此操作

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

Sub ieBusy(ByVal ieObj As InternetExplorer)
    Do While ieObj.Busy Or ieObj.readyState < 4
        DoEvents
    Loop
End Sub
子ieBusy(ByVal ieObj作为InternetExplorer)
在ieObj.Busy或ieObj.readyState<4时执行
多芬特
环
端接头

然后将包含
应用程序的行替换为:
ieBusy objIE

,这样在将代码弄乱数小时后,很遗憾,解决方案并不是简单到修复
Cargar
加载IE sub(因为页面不是像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

我很不确定这是为什么要修复它,并且在使用msgbox检查代码的哪些部分没有正确运行时想到了这一点,循环中的msgbox也修复了它。我非常感谢您对这项工作的解释。

可能是因为您正在使用application.wait,而不是实际等待网页加载。这可能需要3秒以上的时间。您需要将其替换为一个检查以确保网页已完全加载的循环。to@K.Davis point show us
Cargar
sub@ScottHoltzman很好的一点,我甚至没有注意到sub.OP-请用Scott指出的
Cargar
sub。你把它倒过来了。直到它不等于完全加载。您希望您的Cargar sub在未完全加载时说Do,因此我提供了sub作为答案。我确实有该sub,注释中解释说,
Cargar
按您所说的做<代码>应用程序。等待
以确保页面实际已完全加载。等待更长的时间也不起作用,所以我认为加载时间不是问题。谢谢你的回答!