Set HTML_Content = CreateObject ("htmlfile") не работает - PullRequest
0 голосов
/ 11 октября 2018

У меня есть этот код, который копирует содержимое веб-сайта в Excel:

Sub HTML_Table_To_Excel()
Dim htm As Object
Dim Tr As Object
Dim Td As Object
Dim Tab1 As Object

Web_URL = "https://www.fxstreet.com/economic-calendar"

'Create HTMLFile Object
 Set HTML_Content = CreateObject("htmlfile")

 'Get the WebPage Content to HTMLFile Object
  With CreateObject("msxml2.xmlhttp")
 .Open "GET", Web_URL, False
  .send
  HTML_Content.body.innerHTML = .responseText 'this is the highlighted part 
   for the error
  End With
 Column_Num_To_Start = 1
 iRow = 1
 iCol = 1
 iTable = 1

  'Loop Through Each Table and Download it to Excel in Proper Format
     For Each Tab1 In HTML_Content.getElementsByTagName("table")
   With HTML_Content.getElementsByTagName("table")(iTable)
    For Each Tr In .Rows
        For Each Td In Tr.Cells
        Worksheets("Sheet1").Cells(iRow, iCol).Select
        Worksheets("Sheet1").Cells(iRow, iCol) = Td.innerText
        iCol = iCol + 1
        Next Td
    iCol = Column_Num_To_Start
    iRow = iRow + 1
    Next Tr
  End With

 Next Tab1

 MsgBox "Process Completed"
 End Sub

Эта кодировка работала так хорошо, но теперь не работает;«появляется сообщение: время выполнения« 429 »: компонент ActiveX не может создать объект» ...... после этого, если я выберу «Отладка», часть кода будет выделена:

  Set HTML_Content = CreateObject("htmlfile")

В чем проблема?

Спасибо за помощь!

1 Ответ

0 голосов
/ 11 октября 2018

Так что это не будет хорошим здесь вы идете ответ.По крайней мере, в настоящее время.

  1. XMLHTTP запрос не будет работать здесь.Страница загружается динамически, а содержимое просто отсутствует с помощью метода, который вы используете;который выполняется до того, как эта информация станет доступной.
  2. Вы всегда должны использовать Option Explicit в верхней части вашего модуля.У вас есть множество необъявленных переменных (например, Web_URL As String), которые будут сгенерированы на лету как варианты.И вы не уловили то, что выглядело как опечатки / непоследовательное именование переменных: Dim htm As Object: Set HTML_Content = CreateObject("htmlfile").

    Я подозреваю, что вы хотели Set htm = CreateObject("htmlfile").Это будет тип объекта, соответствующий вашим существующим именам и объявлениям.HTML_Content будет строкой, и для нее не потребуется ключевое слово Set, которое присваивает ссылку на объект.Здесь, я думаю, вы хотели HTML_Content = .responseText, но на самом деле безопаснее убедиться, что любая возвращаемая строка не закодирована с HTML_Content = StrConv(.responseBody, vbUnicode)

  3. Существует только одна интересная таблица, посколькуЯ вижу, и у него есть идентификатор.Если вы продолжите свой метод, то после этой строки: For Each Tab1 In HTML_Content.getElementsByTagName("table"), каждый Tab1 будет объектом HTMLTable, поэтому вам не понадобится следующая строка с переменной iTable.Вы используете For Each Loop, поэтому уже выполняете итерацию родительской коллекции.Просто возьмите стол с его идентификатором: With .document.getElementById("fxst-calendartable").id - это самый быстрый из доступных методов поиска, поэтому он должен быть предпочтительнее всех других методов, если они доступны.

  4. Таблица либо плохо спроектирована, либо специально разработана для затруднения очистки.Вы не можете ни скопировать объект outerHTML в буфер обмена и вставить таблицу в Excel, ни просто зациклить строки таблицы и ячейки таблицы, чтобы получить весь отображаемый контент.И отображаемый контент не очень удобочитаемый.Возможно, вам повезет с веб-запросами, но по моему опыту такие тяжелые Javascript-страницы плохо сочетаются с данными веб-запросов.

Итак, помните следующее:

  1. Вероятно, вам понадобится браузер для навигации и загрузки содержимого страницы, например, While ie.Busy Or ie.readyState < 4: DoEvents: Wend, возможно, с дополнительным явным временем ожидания
  2. Вероятно, вам также понадобитсявнимательно изучить HTML-таблицу, чтобы написать что-то подходящее для цели, чтобы захватить элементы, которые вас интересуют, и записать их согласованным образом на странице.Например, ясно, что вам нужно будет рассмотреть роль и расположение элементов div в таблице для правильного выравнивания данных в ваших выходных данных.
  3. Вы можете просто вывести вышеприведенный подход и сделать снимок экрана с расписанием или распечататьэто из.Подумайте, стоит ли усилий по написанию этого кода больше, чем просто печатать страницу раз в неделю (если страница часто обновляется).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...