IE中的vba代码丢失连接

时间:2018-05-11 16:03:29

标签: excel vba excel-vba

我从网站www.soccer24.com制作了一个报废信息宏。我希望在主页上获得每场比赛的所有细节。

我已经制作了代码并且它可以工作但是当宏运行时,突然,IE连接丢失了。我的意思是,宏必须进入同一页面内的150个不同的网站,如下所示:

https://www.soccer24.com/match/Qo8j57nO/#odds-comparison;1x2-odds;1st-half

每个链接中唯一更改的是加粗

的ID

宏转到网站,提取一些信息,转到另一个,提取信息,等等。

当宏是关于页面40时,IE连接刚刚断开,它不再工作,我不能去任何网站。当我关闭程序并再次打开它时,我恢复了互联网连接,但是当它进行40或50次迭代时,它总是相同的,IE连接中断并且不打开任何网站。

它像IE VBA有“工作时间限制”o“网站访问限制”我不知道发生了什么。

我正在使用的代码就是这个:

Piece of code 1

Piece of code 2

所以它完美无缺,但最终在150或50的迭代中。当它试图去网站时:

IE.Navigate“https://www.soccer24.com/match/”&范围(“A”& i).Value& “/#赔率比较; 1×2-赔率;第一半”

互联网资源管理器显示“没有连接”,它不再起作用。这就像IE VBA有“工作时间限制”o“网站访问限制”

2 个答案:

答案 0 :(得分:1)

在webscraping中,这应该是你最好的朋友:

Option Explicit

Public Sub SaveResponse(response As String) 'don't save as txt, but as html to easily see the structure

Dim fso As Object, oFile As Object
Dim filedir As String

filedir = CreateObject("WScript.Shell").specialfolders("Desktop")

Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = fso.CreateTextFile(filedir & "\response.html", Unicode:=True) 'Default is ANSI encoding, change to UNICODE

oFile.WriteLine response
oFile.Close

End Sub

对于IE自动化,它的使用方式如下:

SaveResponse myIE.document.body.innerHTML

它会将响应保存为桌面上的HTML文件。您将能够看到错误之前最后收到的响应是什么样的。

IE自动化可能会出现多种问题,但我最不希望的是完全失去互联网连接。这需要更仔细地检查。 Chrome会在IE不能同时打开此网站或任何其他网站吗?

要克服某些IE问题,您可能希望每{X}个请求IE.Quit。另外,在后台删除旧的IE实例有时会有所帮助,尤其是处理内存泄漏时:

Public Sub TerminateIE()

Dim objWMIService As Object
Dim colItems, objItem

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")

On Error GoTo ErrHandler
For Each objItem In colItems
    If objItem.Name = "iexplore.exe" Then objItem.Terminate
Next objItem

Exit Sub
ErrHandler:
MsgBox ("error " & Err.Name & "with description " & Err.Description & String(2, vbLf) & "Nothing object test for objItem returns: " & objItem Is Nothing)
End Sub

答案 1 :(得分:0)

VBA hanging on ie.busy and readystate check

也许尝试使用它(首先在VBA编辑器中添加对“Microsoft XML 6.0”的引用):

Dim IE As MSXML2.XMLHTTP60
Set IE = New MSXML2.XMLHTTP60

IE.Open "GET", "http://www.rotoworld.com/teams/contracts/nfl/" & Team, False
IE.send

Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLBody As MSHTML.htmlBody

Set HTMLDoc = New MSHTML.HTMLDocument
Set HTMLBody = HTMLDoc.body
HTMLBody.innerHTML = IE.responseText 

或许可以试一试:

https://www.mrexcel.com/forum/excel-questions/710571-vba-script-website-ie-readystate-ie-busy-loop-finished-before-javascript-elements-loaded-2.html

Do Until ie.ReadyState = READYSTATE_COMPLETE And ie.Busy = False
DoEvents
Loop

通常最好用以下的循环替换上面的代码:

Dim htmlele As ihtmlelement
 For Each htmlele In ie.Document.getElementsByTagName("div")
     debug.print htmlele.classname
     debug.print htmlele.innerHTML
     debug.print htmlele.outerHTML
 Next htmlele

然后在即时窗口中,在网站的母语中找到“加载”或对应的单词。如果网站元素的结果很多,您可能需要将它们写入Excel工作表而不是打印。下面是带有类名“loadingBlock loadingTwirl”的加载面板的示例。宏将不会继续,直到它消失并且页面已完全加载。

For Each htmlele In ie.Document.getElementsByTagName("div")
      If htmlele.className = "loadingBlock loadingTwirl" Then GoTo a
 Next htmlele