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 usCargar
sub@ScottHoltzman很好的一点,我甚至没有注意到sub.OP-请用Scott指出的Cargar
sub。你把它倒过来了。直到它不等于完全加载。您希望您的Cargar sub在未完全加载时说Do,因此我提供了sub作为答案。我确实有该sub,注释中解释说,Cargar
按您所说的做<代码>应用程序。等待
以确保页面实际已完全加载。等待更长的时间也不起作用,所以我认为加载时间不是问题。谢谢你的回答!