设置HTML_Content = CreateObject(“ htmlfile”)不起作用

时间:2018-10-10 23:15:47

标签: excel vba excel-vba

我有以下代码,可将网站内容复制到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 :(得分:0)

所以这不是一个很好的答案。至少目前还没有。

  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. 进行编码更为安全
  4. 据我所知,只有一张感兴趣的表,它有一个ID。如果要继续使用方法,则在此行之后:For Each Tab1 In HTML_Content.getElementsByTagName("table"),每个Tab1将是一个HTMLTable对象,因此您不需要下一行带有iTable变量的行。您正在使用For Each Loop,因此已经在迭代父集合。只需通过ID With .document.getElementById("fxst-calendartable")来获取表格。 id是可用的最快的检索方法,因此在可用时应优先于所有其他方法。

  5. 桌子的设计不当或故意设计使刮擦困难。您既不能将对象outerHTML复制到剪贴板并将表粘贴到Excel,也不能简单地循环表行和表单元格以显示所有内容。并且显示的内容不是很好看的。您可能在网络查询方面有些运气,但以我的经验,像这样的Javascript繁重的页面无法与网络查询中的数据很好地融合在一起。

因此,请牢记以下几点:

  1. 您可能需要使用浏览器进行导航,并确保页面内容已加载,例如While ie.Busy Or ie.readyState < 4: DoEvents: Wend,可能需要额外的明确等待时间
  2. 您还可能需要仔细检查表的html,以编写适合您的目的的东西,以获取您感兴趣的元素,并将其以连贯的方式写到页面上。例如,很明显,您需要考虑div元素在表中的作用和位置,以使输出中的数据正确对齐。
  3. 您可以简单地转储上述方法并截屏时间表或将其打印出来。考虑将代码编码的工作是否值得,而不是每周仅打印一次页面(除非页面经常更新)是否值得。