从网页中由脚本创建的表格导入数据到Excel

3
我正在尝试创建一个宏,自动连接到网页并将表格数据导入Excel。我的问题是Excel查询工具无法识别该表格,我认为这是因为它是由页面中的脚本创建的,所以我不能使用标准方法。
目前,我正在使用以下方法:
  1. 将数据复制到剪贴板
  2. 运行VBA宏,从剪贴板获取数据并将其导入Excel
但是,每次我都有超过20个网页需要导入,我希望有一个“独立”的宏,可以根据页面的URL导入数据到Excel。
我感兴趣的网页是:http://www.investing.com/indices/us-30-historical-data,我使用的是Excel 2010。
有人能帮我吗?

将表格中的数据导入Excel - 你能解释一下“表格”的上下文吗?你是指包含数据的HTML表格吗? - robnick
根据我的评论,我猜测您想要进行网页“抓取”,从网页中提取数据并进行一些聪明的操作。Excel查询绝对不能为您完成这项任务。您需要的是一种中间工具,它可以进行屏幕抓取,并将其放入Excel查询可以访问的表单中,例如CSV文件。 - robnick
我想做的是使用宏复制剪贴板中的表格。 - MeSS83
哪个表格?那些网站上的HTML表格?我相信我已经解决了你的问题。你想要屏幕抓取 - 用VBA可能是可行的,但并不容易......使用剪贴板只会让事情更加复杂。一旦它在剪贴板中 - 然后呢? - robnick
我感兴趣的是日期和价格的表格。如果我能将数据放入剪贴板,那么我就可以使用我编写的宏来导入剪贴板中的数据。然而,我只想使用宏从该表格中导入数据到Excel中,如果可以跳过剪贴板,那对我来说也没问题。 - MeSS83
2个回答

4
尝试这个。
Sub Dow_HistoricalData()

    Dim xmlHttp As Object
    Dim TR_col As Object, TR As Object
    Dim TD_col As Object, TD As Object
    Dim row As Long, col As Long

    Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0")
    xmlHttp.Open "GET", "http://www.investing.com/indices/us-30-historical-data", False
    xmlHttp.setRequestHeader "Content-Type", "text/xml"
    xmlHttp.send

    Dim html As Object
    Set html = CreateObject("htmlfile")
    html.body.innerHTML = xmlHttp.ResponseText

    Dim tbl As Object
    Set tbl = html.getElementById("curr_table")

    row = 1
    col = 1

    Set TR_col = html.getelementsbytagname("TR")
    For Each TR In TR_col
        Set TD_col = TR.getelementsbytagname("TD")
        For Each TD In TD_col
            Cells(row, col) = TD.innerText
            col = col + 1
        Next
        col = 1
        row = row + 1
    Next
End Sub

0

另一种方法是像发起HTTP请求一样进行操作

// source http://tkang.blogspot.co.at/2010/09/sending-http-post-request-with-vba.html
Dim result As String
Dim myURL As String
Dim winHttpReq As Object
Set winHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")

myURL = "http://192.168.10.101:80/your_web_service?parameter=hello¶meter2=hi"

winHttpReq.Open "GET", myURL, False
winHttpReq.Send

result = winHttpReq.responseText

并解析结果。 不过我自己还没有尝试过。


谢谢你的帮助,Günter。我尝试了你的答案,但是出现了错误,不过你的想法很好:它类似于 Santos 提出的解决方案,这对我的问题有效。非常感谢。 - MeSS83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接