excel - VBA With CreateObject("msxml2.xmlhttp") - 从不规则结构的表中获取数据
问题描述
我已经 5 岁了,花了几个小时试图解决这个问题,并花了几个小时试图理解它,所以这里是 :)
我正在尝试 使用 CreateObject 方法从Market Screener 上的该公司页面中提取一些表格。
以 table(25) 为例(这个)(screenshot,我试图提取表“业务类型”,第一列列出业务类型(不是 2016、2017 和 Delta 列)。
我在这个 2016 stackoverflow 线程中找到了一个领先的在线
Dim oDom As Object: Set oDom = CreateObject("htmlFile")
Dim x As Long, y As Long
Dim oRow As Object, oCell As Object
Dim vData As Variant
Dim link As String
link = "https://www.marketscreener.com/COLUMBIA-SPORTSWEAR-COMPA-8859/company/"
y = 1: x = 1
With CreateObject("msxml2.xmlhttp")
.Open "GET", link, False
.send
oDom.body.innerHTML = .responseText
End With
With oDom.getElementsByTagName("table")(25)
ReDim vData(1 To .Rows.Length, 1 To 11) '.Rows(1).Cells.Length)
For Each oRow In .Rows
For Each oCell In oRow.Cells
vData(x, y) = oCell.innerText
y = y + 1
Next oCell
y = 1
x = x + 1
Next oRow
End With
Sheets(2).Cells(66, 2).Resize(UBound(vData), UBound(vData, 2)).Value = vData
它有点工作,但是返回一个混乱的表格,其中所有数据都在一个单元格中,就像这样,但是混乱到一个单元格中
然后我在网上找到了另一个调整,就是这个,它建议复制和粘贴,让 Excel 计算出如何粘贴它,这也可以:
With oDom.getElementsByTagName("table")(25)
Dim dataObj As Object
Set dataObj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
dataObj.SetText "<table>" & .innerHTML & "</table>"
dataObj.PutInClipboard
End With
Sheets(2).Paste Sheets(2).Cells(66, 1)
它正确地创建了这个结果,但不仅仅是值 - 我试图粘贴特殊的,没有任何格式。
让我有点发疯并得到这个概念,但此刻完全卡住了。有没有办法做到这一点?我可以在该页面上的表格和其他选项卡上复制它,然后如果我有一个先机的话。
非常感谢任何帮助,
最好的问候,保罗
解决方案
如果您有 Excel 2010+,则可以使用 Power Query 执行此操作。您可以设置查询以从 Web 获取此数据。
PQ
代码将是:
let
Source = Web.Page(Web.Contents("https://www.marketscreener.com/COLUMBIA-SPORTSWEAR-COMPA-8859/company/")),
myData = Source{3}[Data],
firstColumn = {List.First(Table.ColumnNames(myData))},
#"Removed Other Columns" = Table.SelectColumns(myData,firstColumn),
#"Removed Blank Rows" = Table.SelectRows(#"Removed Other Columns", each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))
in
#"Removed Blank Rows"
这导致:
并且查询可以刷新、编辑等。
如所写,查询将保留所需表的第一列。您可以通过更改 中的数字来决定要处理的表Source{n}
。 3
恰好是您感兴趣的那个,但是如果我没记错的话,有 11 或 12 张桌子。