【问题标题】:How to click HTML link using VBA如何使用 VBA 单击 HTML 链接
【发布时间】:2020-07-23 07:46:23
【问题描述】:

我正在尝试单击网站中的链接,如下面的屏幕截图所示。此链接的 HTML 代码类似于 <a target="_blank" href="gamit_main.htm?gamitId=163734">'3311-10310</a>

所以我有一个代码来点击链接,如:

Set HTMLDoc = ie.Document
HTMLDoc.getElementsByTagName("a").Click

但我得到的错误是:

“对象不支持此属性或方法”。

参考代码快照:

完整代码:

Sub Something()
    Dim ie As Object
    Dim HTMLDoc As MSHTML.HTMLDocument
    Dim ckt_No As String
    ckt_No = Range("A2").Value
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ShowWindow ie.Hwnd, SW_MAXIMIZE
    ie.Navigate "http://xyw.htm"
    Do While ie.Busy = True Or ie.ReadyState <> 4: DoEvents: Loop
    ie.Navigate "http:dgetcjdm_ckt_No&display_content=Y&noFormFields=Y&refresh=Y"
    Do While ie.Busy = True Or ie.ReadyState <> 4: DoEvents: Loop
    Set HTMLDoc = ie.Document
    HTMLDoc.getElementById("resultRow").getElementByTagName("a")(0).Click
End Sub

HTML代码如下:

        <td align="center" height="15" title="1" class="tdborder">

            <font class="rtabletext">1</font>

        </td>



        <td align="Left" title="GAMITARM Status Date" class="tdborder" nowrap="">

            <font class="rtabletext">19-MAR-2020</font>

        </td>

        <td align="Left" title="Circuit Number" class="tdborder" nowrap="">

            <font class="rtabletext"><a target="_blank" href="gamit_main.htm?gamitId=168592">'70F934C8</a></font>

        </td>

        <td align="Left" title="CUSTOMER" class="tdborder" nowrap="">

            <font class="rtabletext">MICROSOFT CORPORATION</font>

        </td>

        <td align="Left" title="Customer Id" class="tdborder" nowrap="">

            <font class="rtabletext">8684</font>

        </td>


        <td align="Left" title="AO AM" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="AO SD" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="AO ED/AVP" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="AO VP" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        <td align="Left" title="LCON Phone Contact (SM Feed) " class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="LCON Cell Contact (SM Feed) " class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>


        </td>

        <td align="Left" title="Programme Office Status" class="tdborder" nowrap="">

            <font class="rtabletext">New</font>


        </td>

        <td align="Left" title="Major Initiative" class="tdborder" nowrap="">

            <font class="rtabletext">Ethernet</font>

        </td>

        <td align="Left" title="Project" class="tdborder" nowrap="">

            <font class="rtabletext">APAC Singapore Ethernet Tail Rolls</font>

        </td>

        <td align="Left" title="Phase" class="tdborder" nowrap="">

            <font class="rtabletext">x.2.2.a</font>


        </td>

        <td align="Left" title="LOA received" class="tdborder" nowrap="">

            <font class="rtabletext">NO</font>

        </td>

        <td align="Left" title="Technical Connectivity details received" class="tdborder" nowrap="">

            <font class="rtabletext">NO</font>

        </td>

    </tr>

我正在努力专注于这条线

            <font class="rtabletext"><a target="_blank" href="gamit_main.htm?gamitId=168592">'70F934C8</a></font>

这里有一些父母的快照:请找到突出显示的元素

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我会将父节点的类选择器与属性 = 值选择器(使用 contains 运算符 * )结合起来,通过其值的 href 来定位子标签

    htmlDoc.querySelector(".rtabletext [href*='gamitId=']").click
    

    无需检索多个节点或使用循环

    这确实假设第一个匹配的节点是所需的节点。您始终可以将 '' 之间使用的 href 值扩展为更多选择器(或者更一般地扩展 querySelector 使用的 css 选择器以定位精确节点)。

    css selectors

    【讨论】:

    • 感谢您的回复...通过此代码,我收到类似运行时错误'91'的错误:“对象变量或未设置块变量”
    • 如果你用 F8 逐行执行代码,你还会得到这个错误吗?您使用的是 xmlhttp 还是 Internet Explorer?该节点是在父 iframe 还是框架节点中?
    • 这是表格的代码 1 19-MAR-2020 '70F934C8 跨度>
    • 那是一个不同的html段
    • 1.是的。我在单击 2 之前尝试了一个时间延迟。我不确定。我将添加有问题的代码
    【解决方案2】:

    getElementsByTagName() 方法以 HTMLCollection 对象的形式返回文档中具有指定标记名称的所有元素的集合。

    因此,您应该指明应该点击集合中的哪个元素。在这种情况下,第一个可能是最安全的选择:

    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")    
    Set HTMLDoc = ie.Document
    HTMLDoc.getElementsByTagName("a")(0).Click
    

    通过在 Chrome 中单击 F12,您可以检查该网站。如果您要单击的那个元素中有一个 ID 标签,那么最好指定它:

    HTMLDoc.getElementById("SomeFancyID").getElementsByTagName("a")(0).Click
    

    编辑:

    只要错误出现在Set HTMLDoc 中,那么尽量减少代码并从那里调试。试试这个:

    Sub Something()
    
        Dim ie As Object
        Dim HTMLDoc As MSHTML.HTMLDocument
    
        Set ie = CreateObject("InternetExplorer.Application")
        ie.Navigate "https://stackoverflow.com/questions"
    
        Do While ie.Busy = True Or ie.ReadyState <> 4: DoEvents: Loop
        Set HTMLDoc = ie.Document
    
        Stop 'Press SHIFT + F9 and examine the window...
    
    End Sub
    

    一旦代码在Stop 行停止,按SHIFT + F9 并检查窗口。在那里你会看到所有的收藏:

    【讨论】:

    • 感谢您的快速回复,此行抛出编译错误:预期结束语句
    • 这个没有抛出任何错误,而且。它不是单击链接文本。谢谢!
    • @QHarr - 谢谢,真的,最近我几乎没有做 VBA,主要是 python。而且我还没有尝试过,可能还有其他问题...
    • 这里相同@Vityata :-)
    • @Vityata.. 我只是在问题中添加代码。谢谢
    【解决方案3】:

    这段代码对我来说很好用:

    set ElementCol=IE.Document.frames("Content_iFrame").Document.all
    For each Link in ElementCol
    

    【讨论】:

      【解决方案4】:
      getElementsByTagName("a")
      

      正在返回一个标签的集合

      您必须遍历集合并找到您想要的那个(或者如果您确切知道该标签在 DOM 中的位置,那么您可以直接从集合中访问它)。

      例如,

      For each a in ie.document.getElementsByTagName("a") 
          If a.ClassName = "whatever_it_is" Then
              a.Click
              Exit For
          Next
      

      【讨论】:

      • 感谢您的回复.... Exit For end if Next a 此代码没有抛出任何错误。而且也不是点击链接文字
      • 代码如下: 1 19-MAR-2020 '70F934C8
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签