使用VBA从Web文档输入元素获取价值

pex*_*223 3 html excel vba excel-vba web-scraping

我很难300从名为的输入中检索值points

这是我的HTML和VBA代码。

HTML

<td id="myPower_val_9" style="visibility: visible;">
    <input type="text" disabled="disabled" value="300" name="points"></input>
</td>
Run Code Online (Sandbox Code Playgroud)

VBA

Dim ie As Object
Dim myPoints As String

Set ie = CreateObject("InternetExplorer.Application")

With ie
  .Visible = 0
  .navigate "www.example.com"

   While .Busy Or .readyState <> 4 
   DoEvents
   Wend

End With

Dim Doc As HTMLDocument
Set Doc = ie.document

myPoints = Trim(Doc.getElementsByTagName("td")(0).getElementById("myPoints").innerText)
Range("A1").Value = myPoints 
Run Code Online (Sandbox Code Playgroud)

Kyl*_*Mit 6

HTML代码

我将尝试在网络浏览器中编写可处理javascript中的文档对象模型(DOM)的代码,以便您可以使用更好的基于Web的调试工具。

控制台或调试器可以解决以下几个问题

  • 您想获取元素ID,myPoints但在HTML中它只是被称为points
  • 您想按ID获取元素,但只需设置name属性-
  • 只要name元素唯一,您就不需要搜索td第一个
  • 从中可以看到<input></input>,输入元素没有innerText(内的文本><)。相反,他们有一个value属性
  • 元素通过对象本身的属性公开其属性和其他数据。因此,您只需查看以下内容即可检查输入值.value

这是您要执行的操作的javascript示例:

var value = document.getElementsByName("points")[0].value;
console.log(value);
Run Code Online (Sandbox Code Playgroud)
<input type="text" disabled="disabled" value="300" name="points" />
    
Run Code Online (Sandbox Code Playgroud)

打开控制台(F12),您应该看到300

VBA

要将其转换为Excel的VBA代码,只需确保()对VB数组使用括号而不[]对JS数组使用方括号:

myPoints = Trim(Doc.getElementsByName("points")(0).Value)
Run Code Online (Sandbox Code Playgroud)

那应该很好。

参考文献

由于我不确定您在VB上失败了的那一点,因此还要确保在VBA脚本中有适当的Web参考。

转到工具>引用>并添加“ Microsoft HTML对象库”和“ Microsoft Internet控件”:

参考文献

演示版

在plunker中创建了一个演示,因此会有一个实时站点而不是example.com。

将以下代码粘贴到excel中,一切正常。

Public Sub GetValueFromBrowser()
    Dim ie As Object
    Dim url As String
    Dim myPoints As String

    url = "http://run.plnkr.co/plunks/6UTb9kHRZ363Ivhh2BPE/"
    Set ie = CreateObject("InternetExplorer.Application")

    With ie
      .Visible = 0
      .navigate url
       While .Busy Or .readyState <> 4
         DoEvents
       Wend
    End With

    Dim Doc As HTMLDocument
    Set Doc = ie.document

    myPoints = Trim(Doc.getElementsByName("points")(0).Value)
    Range("A1").Value = myPoints

End Sub
Run Code Online (Sandbox Code Playgroud)

输出

输出