Действительный способ вернуть HTMLDocument при очистке экземпляра InternetExplorer

Является ли это допустимым способом вернуть HTMLDocument при очистке моего экземпляра InternetExplorer?

Private Function myFunction() As HTMLDocument

    'init
    Dim out As HTMLDocument
    Dim browser As InternetExplorer
    Set browser = CreateObject("InternetExplorer.Application")

    ...
        
    'get HTMLDocument
    Set out = browser.document

    browser.Quit
    Set browser = Nothing

    Set myfunction = out
Exit Function

Я спрашиваю, потому что я получаю нестабильное поведение, используя возвращенный HTMLDocument позже в моем коде. Я увижу вывод 003, но не 004:

doc = myFunction()
...
Debug.Print "003"
strVar = doc.getElementsByClassName("sectionheading_center")(0).innerText
Debug.Print "004"
....

Ошибка: -2147417848-Automation error The object invoked has disconnected from its clients. -VBAProject-1000440-0

Не так, поскольку вы выпускаете ссылку на браузер. Создайте класс-оболочку, в котором вы создаете экземпляр браузера на Intitialize() и очищаете Terminate().

Kostas K. 18.12.2020 15:38
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы потеряете динамическое взаимодействие, но сможете получить html, передав innerHTML в переменную MSHTML.HTMLDocument. Это также только тело html.

Private Function myFunction() As MSHTML.HTMLDocument
    'init
    Dim out As MSHTML.HTMLDocument
    Dim browser As SHDocVw.InternetExplorer
    Set browser = New SHDocVw.InternetExplorer

    '...Other code
        
    'get HTMLDocument
    Set out = New MSHTML.HTMLDocument
    out.body.innerHTML = browser.Document.innerHTML

    browser.Quit
    Set myFunction = out
Exit Function

Решение класса @ KostasK - это хороший способ поддерживать экземпляр экземпляра, а также место, где вы можете добавлять методы к этому объекту.

Интересно, если при передаче innerHTML, как мы обсуждаем, DOM будет анализироваться иначе, чем экземпляр IE? Я использую IE, потому что часть моей пользовательской базы получит разные результаты с точки зрения синтаксического анализа с использованием HTMLDocument, когда я использую ServerHTTP или XMLHTTP.

TechFanDan 18.12.2020 18:38

Вы переходите из ie.document, поэтому у вас будет document.body.innerHTML во время передачи в соответствии с ie.document.body. Если вам нужен синтаксический анализ ie html, а не синтаксический анализатор HTMLDocument DOM, просто перенесите обратно в ie.document.body. Если это действительно то, что вы хотите, то работа с классом, безусловно, лучший способ пойти, а затем передать экземпляр ie вокруг. Обратите внимание, что в обоих случаях есть document.mode/emulations, которые влияют на синтаксический анализ.

QHarr 18.12.2020 18:47

Только что заметил, что такое "SHDocVw" в вашем примере?

TechFanDan 19.12.2020 16:09

Это класс. Хорошей практикой является определение объекта Internet Explorer с его родительским классом.

QHarr 19.12.2020 17:01

Я согласен с предложением QHarr. Его решение может помочь вам с вашей проблемой. Вы можете протестировать его на своей стороне. Если все же вы получаете разные результаты, я предлагаю вам поделиться исходным кодом. Это может помочь нам воспроизвести проблему. Результаты тестирования могут помочь правильно понять проблему и сузить ее кругозор.

Deepak-MSFT 21.12.2020 06:10

Другие вопросы по теме