【发布时间】:2020-11-24 04:53:07
【问题描述】:
我正在尝试从网络获取数据。我在 Excel VBA 中尝试了两种途径。两者都有效,但产生的结果不同,而且速度也有明显差异。
第一种方法是使用 Excel Web Query 工具。
我录制宏得到的VBA代码。
ActiveWorkbook.Queries.Add name:="Table 0", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Web.Page(Web.Contents(""" & webSite & """))," & Chr(13) & "" & Chr(10) & " Data0 = Source{0}[Data]" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " Data0"
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Table 0"";Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Table 0]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = False
.RefreshOnFileOpen = False
.BackgroundQuery = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = False
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table_0"
.Refresh BackgroundQuery:=False
End With
第二种方法是使用MSXML2.XMLHTTP60。这种方法非常快,但表格没有任何我需要的标题。
我注意到 Web Query 的代码,用于检索标题
Data0 = Source{0}[Data]
无法使用 XMLHTTP60。
有没有办法通过添加或修改下面的一些代码来使用 MSXML2.XMLHTTP60 检索列标题?
Sub test()
Dim XMLRequest As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim HTMLDiv As MSHTML.IHTMLElement
Dim HTMLTable As MSHTML.IHTMLElement
Dim HTMLDiv2 As MSHTML.IHTMLElement
Dim HTMLTable2 As MSHTML.IHTMLElement
XMLRequest.Open "GET", "webSite", False
XMLRequest.send
If XMLRequest.Status <> 200 Then
MsgBox XMLRequest.Status & "-" & XMLRequest.statusText
Exit Sub
End If
HTMLDoc.body.innerHTML = XMLRequest.responseText
Set HTMLDiv = HTMLDoc.getElementById("__next")
Set HTMLTable = HTMLDiv.getElementsByTagName("table")(0)
Set HTMLDiv = HTMLDoc.getElementsByClassName("tables-container")
Set HTMLTable2 = HTMLDiv.getElementsByClassName("tables-container")(0).getElementsByClassName("time")
Debug.Print HTMLDiv.className
Call subWriteTableToWs(HTMLTable)
End Sub
【问题讨论】:
标签: excel vba web-scraping powerbi excel-web-query