【问题标题】:Excel VBA: Get inner text of HTML table tdExcel VBA:获取 HTML 表格 td 的内部文本
【发布时间】:2013-12-10 21:49:22
【问题描述】:

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

<div id="myDiv">    
<table class="myTable">
        

【问题讨论】:

    标签: javascript html vba excel


    【解决方案1】:

    您的变量名似乎有错字。你用过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
    

    更新

    我在 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
    

    更新代码以演示实时 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
    

    【讨论】:

    • 这只是乍一看。代码有更多问题。发布更新...
    • 干得好 pradeep :) 希望我能再次投票。 @NunoNogueira:如果这是你要找的,那就接受这个答案而不是我的;)
    • @NunoNogueira:AFAIK Sid,他从不回答分数问题。他有一个口头禅,它说积分买不到你哈雷戴维森。但是我觉得他已经回答了你的实际问题。我的回答只是对您的编辑的更新。顺便说一句,避免使用getElementsByClassName,因为它不能在所有 IE 版本和所有浏览器上一致地工作。或者您必须明确定义自己的 javascript 扩展方法。
    • @PradeepKumar:让我们不要再混淆这个可怜的家伙什么该接受什么不该接受了 :) 他做出了一个在我看来是正确的选择,让我们坚持下去……哦,你还记得短语:P
    • @NunoNogueira:关于速度慢,这是因为一切都在单线程上同步工作。 Excel VBA 基本上是单线程的。如果是 .NET 或任何其他支持多线程的语言,您可以使用该功能来加速它。您可以做的最好的事情是尝试将DoEvents 放在循环内的某个位置以阻止 UI 冻结。
    【解决方案2】:

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

    顺便说一句,您在&lt;div id=myDiv"&gt; 中缺少"

    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
    

    截图

    【讨论】:

    • 我得到运行时错误 '91' 对象变量或 With block variable not set on line Set xobj ...
    • 您是否设置了对Microsoft HTML Object Library的引用?
    • 是的,您的代码是正确的。我现在可以看到,但它对我不起作用,因为我建立了不同的连接,我将在上面编辑我的问题。
    • 谢谢你的帮助,我会接受你的回答,因为代码很好。
    • 我没有看到更新。我会检查。该函数中的代码正在打开一个 Web 连接,使应用程序如此缓慢,我认为它不会像这样可行。无论如何,我会提供反馈,谢谢!
    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2021-07-15
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多