我有以下代码,可将网站内容复制到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")
出什么问题了?
感谢您的帮助!
答案 0 :(得分:0)
所以这不是一个很好的答案。至少目前还没有。
XMLHTTP
请求在这里不起作用。页面是动态加载的,通过您使用的方法根本无法找到内容;在此信息可用之前执行。您应该始终在模块顶部使用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)
据我所知,只有一张感兴趣的表,它有一个ID。如果要继续使用方法,则在此行之后:For Each Tab1 In HTML_Content.getElementsByTagName("table")
,每个Tab1
将是一个HTMLTable
对象,因此您不需要下一行带有iTable
变量的行。您正在使用For Each Loop
,因此已经在迭代父集合。只需通过ID With .document.getElementById("fxst-calendartable")
来获取表格。 id是可用的最快的检索方法,因此在可用时应优先于所有其他方法。
桌子的设计不当或故意设计使刮擦困难。您既不能将对象outerHTML
复制到剪贴板并将表粘贴到Excel,也不能简单地循环表行和表单元格以显示所有内容。并且显示的内容不是很好看的。您可能在网络查询方面有些运气,但以我的经验,像这样的Javascript繁重的页面无法与网络查询中的数据很好地融合在一起。
因此,请牢记以下几点:
While ie.Busy Or ie.readyState < 4: DoEvents: Wend
,可能需要额外的明确等待时间