【问题标题】:Excel Web Query vs MSXML2.XMLHTTP60Excel Web 查询与 MSXML2.XMLHTTP60
【发布时间】: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


    【解决方案1】:

    我也遇到了同样的问题。我能找到的唯一解决方案是将网页保存为单个文件或保存 HTML 页面,然后让光标读取页面。

    如果您只为一页执行此操作,这可能会起作用,但在循环中执行多页时,我不确定这是否是一个可行的解决方案。

    我真的很高兴了解基于 XMLHTTP60 的解决方案

    您还可以在这篇文章中找到类似的问题,其中标头可能已使用 XMLHTTP60 而不是表格被抓取

    Excel VBA IE verses XMLHTTP discrepencies

    【讨论】:

    • 是的,我正在做一个大循环,因此不确定保存每个页面是否就是我想要的,但感谢您的输入
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2020-08-24
    • 1970-01-01
    • 2019-11-20
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多