【问题标题】:VBA to click on an image with link on Internet ExplorerVBA 在 Internet Explorer 上单击带有链接的图像
【发布时间】:2017-08-29 20:19:03
【问题描述】:

我正在尝试使用 Excel 上的 VBA 自动执行将一些数据输入、记录和提取到网站的过程。到目前为止,我已经成功登录并导航到需要单击“搜索”按钮的页面,但它只是一个带有链接的图像:

<a tabindex="-1" class="ui-menuitem-link ui-corner-all" href="#" 
onclick="PrimeFaces.ab({s:'formE:j_idt56',u:'formE:vlrDetalhe 
formE:vlrPedidosTot formE:filiais formE:planejamento',f:'formE'});return 
false;" style="width: 80px; left: 240px;">

<img src="/Sip/resources/img/nissan/bt-searc1.png">

<span style="display:none;">Pesquisar</span>

</a>

我在网上搜索了很多解决方案,但到目前为止没有任何效果。这个“a tabindex=-1”是与其他 4 个“a tabindex=-1”具有相同“class”和“href”值的 div 的一部分,只有“onclick”事件发生了变化,但我似乎不能找到一种方法来查找我在这里提到的事件并触发它。对我来说没有唯一的价值可以搜索。也许我可以在标签内寻找图像?我刚开始学习,我发现了这段代码:

objIE.document.images(n).Title("bt-searc1.png").Click

它给了我一个错误:“对象不支持此操作”

感谢您的帮助!

【问题讨论】:

  • 我需要 excel 来列出用户名、密码和经销商代码,以便我可以填充一些文本框,我也需要它,因为所有这些的目的是在 Excel 中导出电子表格中的大量数据。另外,我工作的地方,不允许我安装编程工具,我老板要excel来做。我知道可以在excel中完成,如果您知道方法,请说出来。
  • 我很乐意提供帮助,但如果我必须这样做,我会制作一个外部脚本来将相关数据提取到 csv 文件中,然后将该文件导入到 excel 中。唉,如果你的老板坚持认为一切都应该适合 excel,我想这不是一个解决方案。
  • 试试objIE.document.parentWindow.execScript "PrimeFaces.ab({s:'formE:j_idt56',u:'formE:vlrDetalhe formE:vlrPedidosTot formE:filiais formE:planejamento',f:'formE'});return false;"
  • 使用这个我得到这个错误:无法完成操作。错误 8020101。
  • 我看了一下,好像和javascript有关(?)

标签: html vba excel internet-explorer


【解决方案1】:

试试这个:

Dim elements As Object, element As Object
Set elements = objIE.document.getElementsByTagName("a")

For Each element In elements
    If element.ClassName = "ui-menuitem-link ui-corner-all" Then
        element.Click
    End If
Next

【讨论】:

  • 你的代码几乎做到了!问题是:“ui-menuitem-link ui-corner-all”是类名,就像我说的,我有 4 个其他元素具有相同的类名,所以 if 对另一个元素成立。我会尝试再做一个 if 来计算尝试次数,直到达到 5,这将是正确的元素。
【解决方案2】:

您还可以“作弊”并模拟鼠标点击,而不是尝试通过 HTML 代码进行操作。不过,为了让这个解决方案发挥作用,您不应该在代码运行时触摸鼠标。

如何应用:

  1. 在模块顶部插入这些函数声明:

    Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
    Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Public Const MOUSEEVENTF_LEFTDOWN = &H2
    Public Const MOUSEEVENTF_LEFTUP = &H4
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Private Sub LeftClick()
      mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
      Sleep 50
      mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
    End Sub
    
  2. 获取按钮的像素位置:为此,请使用SetCursor 函数尝试不同的值,直到找到按钮的位置。 请记住,第一个变量表示 X 轴上的像素位置,第二个变量表示 Y 轴上的像素位置,位置 0 位于屏幕左上角

  3. 要模拟左键单击,请添加:

     SetCursor 200 , 400 ' Change those numbers by the one syou have found at step 2
     Call LeftClick
    

【讨论】:

  • 这可能对我想到的其他一些任务有用!但是,如果有人误触鼠标,我不能冒险弄乱整个过程。还是谢谢!
【解决方案3】:

所以,这就是我想出的:

Dim elements As Object, element As Object, count As Long

count = 0
Set elements = objIE.document.getElementsByTagName("a")

For Each element In elements
    If element.className = "ui-menuitem-link ui-corner-all" Then
        count = count + 1
        If count = 4 Then
        element.Click
        End If
    End If
Next

刚刚在 Kostas K.'s If 中添加了一个 If(非常感谢!),现在它使用“ui-menuitem-link ui-corner-all”类触发正确的项目。

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2021-05-21
    相关资源
    最近更新 更多