какдиалоговое cannot be suppressed:
диалоговое окно сохранения документа HTML не может быть подавлено при вызове этого метода из сценария.
Это также модальный диалог, и вы не можете автоматизировать способ щелчка по кнопке «Сохранить». Выполнение VBA приостанавливается во время ожидания ввода пользователем вручную, когда сталкивается с диалогом такого типа.
Вместо того, чтобы использовать метод IE.Document.ExecCommand
, вы можете попробовать прочитать HTML-код страницы и распечатать его в файл с помощью стандартных функций ввода-вывода.
Option Explicit
Sub SaveHTML()
Dim URL as String
Dim IE as Object
Dim i as Long
Dim FileName as String
Dim FF as Integer
URL = "http://google.com" 'for TEST
Filename = "C:\Test.htm"
Set IE = CreateObject("Internetexplorer.Application")
IE.Visible = True
IE.Navigate URL
Do
Loop While IE.Busy
'Creates a file as specified
' this will overwrite an existing file if already exists
CreateObject("Scripting.FileSystemObject").CreateTextFile FileName
FF = FreeFile
Open Filename For Output As #FF
With IE.Document.Body
Print #FF, .OuterHtml & .InnerHtml
End With
Close #FF
IE.Quit
Set IE = Nothing
End Sub
Я не уверен, что это даст вам именно то, что вы хотите, или нет. Существуют и другие способы получения данных из Интернета, и, вероятно, лучше всего получить необработанный HTML-код от XMLHTTP request и распечатать его в файле.
Конечно, редко бывает, что на самом деле нам нужна вся веб-страница в формате HTML, поэтому, если вы ищете, чтобы затем очистить определенные данные с веб-страницы, XMLHTTP и DOM были бы лучшим способом сделать это, и нет необходимости сохранять это в файле вообще.
Или вы можете использовать оболочку Selenium для автоматизации IE, которая намного более надежна, чем использование относительно небольшого количества собственных методов для класса InternetExplorer.Application.
Обратите внимание, что вы используете довольно грубый метод ожидания загрузки веб-страницы (Loop While IE.Busy
). Хотя это может работать иногда, это может быть ненадежным. Есть десятки вопросов о том, как сделать это правильно здесь, на SO, поэтому я хотел бы отнести вас к функции поиска здесь, чтобы немного изменить этот код.