Excel VBA:获取HTML表td的内部文本

Nun*_*ira 5 html javascript excel vba excel-vba

我正在使用excel从网页获取值.在其他元素中,HTML包含下表:

<div id="myDiv">    
<table class="myTable">
        <tbody>
            <tr>
                <td>Text1:</td>
                <td class="data"><strong>0.51</strong></td>
            </tr>
            <tr>
                <td>Text2:</td>
                <td class="data"><strong>2199</strong></td>
            </tr>
        </tbody>
    </table>
</div>
Run Code Online (Sandbox Code Playgroud)

该页面存储在变量oHtml中.它可以很好地抓住这个表外的其他元素.但是当我尝试捕获值0,51时,我在控制台中使用JS:

document.getElementById("myDiv").getElementsByClassName("myTable")[0].getElementsByClassName("data")[0].innerText
Run Code Online (Sandbox Code Playgroud)

并且选择值0,51.

但是,函数内使用的以下VBA代码返回#VALUE!

Function myFunction(id)
Call myConnection(id)    
Set myDadta = oHtml.getElementById("myDiv").getElementsByClassName("myTable")(0).getElementsByClassName("data")(0)
        myFunction = myData.innerText
End Function
Run Code Online (Sandbox Code Playgroud)

这是与IE的连接:

Public Sub myConnection(id)

Set oHtml = New HTMLDocument

With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .Open "GET", "http://www.example.com" & id, False
    .send
    oHtml.body.innerHTML = .responseText
End With

End Sub
Run Code Online (Sandbox Code Playgroud)

正如我所说,这种语法在同一页面中与此表中的其他元素一起工作正常,为什么我会收到此错误?

Pra*_*mar 8

您似乎在变量名中有拼写错误.你用过Option Explicit吗?

Function myFunction(id)
    Call myConnection(id)    
    Set myDadta = oHtml.getElementById("myDiv").getElementsByClassName("myTable")(0).getElementsByClassName("data")(0)
    myFunction = myData.innerText   ' <-- This line
End Function
Run Code Online (Sandbox Code Playgroud)

UPDATE

我在VBA表单上放了一个Button,以及下面更正的代码:

Option Explicit

Dim oHtml, myData

Private Sub CommandButton1_Click()
    MsgBox myFunction(0)
End Sub

Function myFunction(id)
    Call myConnection(id)
    Set myData = oHtml.getElementById("myDiv").getElementsByTagName("Table")(0).getElementsByTagName("td")(1)
    myFunction = myData.innerText ' <-- will give 0.51
End Function

Public Sub myConnection(id)
    Set oHtml = New HTMLDocument
    With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        '.Open "GET", "http://www.example.com" & id, False
        .Open "GET", "http://localhost/Test/Test.htm", False   '<-- this is my local machine; replace appropriately
        .send
        oHtml.body.innerHTML = .responseText
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

更新代码以在现场URL上演示功能

Option Explicit

Dim oHtml, myData

Private Sub CommandButton1_Click()
    MsgBox myFunction(0)
End Sub

Function myFunction(id)
    Call myConnection(id)
    Set myData = oHtml.getElementById("overallRatios").getElementsByTagName("Table")(0).getElementsByTagName("td")(1)
    myFunction = myData.innerText  
End Function

Public Sub myConnection(id)
    Set oHtml = New HTMLDocument
    With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        '.Open "GET", "http://www.example.com" & id, False
        .Open "GET", "http://www.reuters.com/finance/stocks/overview?symbol=PTI.LS", False
        .send
        oHtml.body.innerHTML = .responseText
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

工作演示的截图

  • 好工作pradeep :)希望我能再次投票.@NunoNogueira:如果这是你想要的,那么接受这个答案而不是我的答案;) (2认同)
  • @NunoNogueira:AFAIK Sid,他从不回答积分问题.他有一个宠物短语,说点不能给你买哈利戴维森.但是我觉得他已经回答了你的实际问题.我的回答只是对您的编辑进行更新.BTW避免使用`getElementsByClassName`,因为它不能在所有IE版本和所有浏览器上一致地工作.或者您必须明确定义自己的JavaScript扩展方法. (2认同)
  • @NunoNogueira:关于缓慢,这是因为一切都在同步和单线程上工作.Excel VBA基本上是单线程的.如果它是.NET或支持多线程的任何其他语言,您可以使用该功能来加速它.你可以做的最好的事情是尝试在循环中的某处放置`DoEvents`以阻止UI冻结. (2认同)