MSXML вместо IE в VBA выдает ошибку времени выполнения 91 «Переменная объекта или переменная блока не установлена» - PullRequest
0 голосов
/ 04 мая 2018

Я проверяю почти 10000 веб-страниц и возвращаю значения в электронную таблицу Exel. Использование объекта IE приводит к противоречивым результатам, и я хочу вместо этого использовать MSXML, поэтому я создал две функции, которые возвращают веб-страницу, одну с использованием IE, а другую с использованием MSXML. Они должны вернуть тот же результат. Вот функция IE:

Function getIEPage(link) As HTMLDocument
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
With objIE
    .Top = 0
    .Left = 0
    .Width = 800
    .Height = 600
    .Visible = False
End With
objIE.navigate (link)
While objIE.readyState <> 4
    DoEvents
Wend
Set getIEPage = objIE.document
End Function

Вот функция XML:

Function getXMLPage(link) As MSHTML.HTMLDocument
Dim ie As MSXML2.XMLHTTP60
Set ie = New MSXML2.XMLHTTP60
ie.Open "GET", link, False
ie.send
While ie.readyState <> 4
    DoEvents
Wend
Dim HTMLDoc As MSHTML.HTMLDocument
Set HTMLDoc = New MSHTML.HTMLDocument
HTMLDoc.body.innerHTML = ie.responseText
Set getXMLPage = HTMLDoc
End Function

На следующем шаге я хочу извлечь все теги «a», например:

Dim webPage As HTMLDocument
Dim allLinks1 As Variant
Set webPage = getIEPage("https://www.stackoverflow.com/")
Set allLinks1 = webPage.getElementsByTagName("A")

или как это:

Dim webPage As HTMLDocument
Dim allLinks2 As Variant
Set webPage = getXMLPage("https://www.stackoverflow.com/")
Set allLinks2 = webPage.getElementsByTagName("A")

Но они не дают того же результата. Функция IE выполняется, но XML выдает ошибку времени выполнения 91 «Переменная объекта или переменная блока не установлена»

1 Ответ

0 голосов
/ 21 июля 2018

Вы имеете дело с HTML. Поэтому вы можете сделать следующее, чтобы получить все теги a:

Option Explicit
Public Sub GetTagList()
    Dim sResponse As String, tagList As Object
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://stackoverflow.com/", False
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With
    With CreateObject("htmlFile")
        .Write sResponse
        Set tagList = .getElementsByTagName("a")
        Debug.Print tagList.Length
    End With
End Sub
...