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

我正在使用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> 

该页面存储在variablesoHtml中。 抓住这个表格外的其他元素工作正常。 但是当我尝试捕获值0.51例如,我在控制台中使用JS:

 document.getElementById("myDiv").getElementsByClassName("myTable")[0].getElementsByClassName("data")[0].innerText 

然后select值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 

这是连接到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 

正如我所说的,这种语法在这个表格中的其他元素正常工作,所以为什么我会得到这个错误?

你的variables名似乎有一个错字。 你有没有使用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 

UPDATE

我把一个button上的VBAforms和以下纠正的代码工作:

 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 

更新代码以演示实时URL的function

 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 

工作演示的截图

这对我有用。 我已经设置了对Microsoft HTML Object Library引用

顺便说一句,你错过了一个" in <div id=myDiv">

 Option Explicit Sub Sample() Dim objIe As Object, xobj As HTMLDivElement Set objIe = CreateObject("InternetExplorer.Application") objIe.Visible = True objIe.navigate "C:\a.htm" While (objIe.Busy Or objIe.READYSTATE <> 4): DoEvents: Wend Set xobj = objIe.document.getElementById("myDiv") Set xobj = xobj.getElementsByClassName("myTable").Item(0) Set xobj = xobj.getElementsByClassName("data")(0) Debug.Print xobj.innerText Set xobj = Nothing objIe.Quit Set objIe = Nothing End Sub 

截图

在这里输入图像描述