【问题标题】:Click button or execute JavaScript function with VBA单击按钮或使用 VBA 执行 JavaScript 函数
【发布时间】:2011-03-15 21:55:02
【问题描述】:

我正在尝试让我的 VBA 例程与使用 JavaScript 的页面进行交互,并且在过去取得了成功。最近更新后,它不再有效。此时我需要 A) 以编程方式单击按钮或 B) 执行按钮调用的函数。棘手的部分是按钮没有声明的名称。在源代码中声明的工作表上还有其他名称,我可以很好地与它们交互。这是页面源代码中的 html 代码:

<input type="button" class="buttonForm" value='Run Report' onclick="exportData(workOrderSearchForm)"/>

如您所见,它没有为按钮声明名称。过去,以下方法有效:

Set ie = CreateObject("InternetExplorer.application")
ie.document.all(79).Click

其中“79”是项目编号的索引。现在看来,按钮已更改为项目“81”,但只需输入:

ie.document.all(81).Click

由于某种原因无法正常工作。我知道我要执行的函数:exportData(workOrderSearchForm),但除了使用“click”方法之外不知道如何执行。

我寻找了一些关于 IE 应用程序对象的不错的文档,但似乎找不到好的来源。有没有办法执行这个功能?

【问题讨论】:

    标签: javascript vba excel


    【解决方案1】:

    试试这个:

    Dim CurrentWindow As HTMLWindowProxy: Set CurrentWindow = ie.Document.parentWindow
    Call CurrentWindow.execScript("exportData(workOrderSearchForm)")
    

    但首先您需要在参考(工具>参考)下包含 Microsoft HTML 对象库

    【讨论】:

      【解决方案2】:

      您可以循环遍历所有输入标签,并通过检查“最具识别性”的属性(id、名称、类型、innerHTML 等)来识别相关的标签。这是我在 Excel 工作表中使用的 Sub(),它会自动登录到网站

      Sub FormAction(Doc As MSHTML.HTMLDocument, ByVal Tag As String, ByVal Attrib As String, ByVal Match As String, ByVal Action As String)
      Dim ECol As MSHTML.IHTMLElementCollection
      Dim IFld As MSHTML.IHTMLElement
      Dim Tmp As String
      
          Set ECol = Doc.getElementsByTagName(Tag)
          For Each IFld In ECol                                         ' cycle thru all <[tag]> elements
              If VarType(IFld.getAttribute(Attrib)) <> vbNull Then      ' does it contain the attribute
                  If Left(IFld.getAttribute(Attrib), Len(Match)) = Match Then
                      If Action = "/C/" Then
                          IFld.Click
                      Else
                          IFld.setAttribute "value", Action
                      End If
                      Exit Sub
                  End If
              End If
          Next
      End Sub
      

      该函数采用以下参数:

      • Doc .... HTML DOM 对象
      • Tag ....您要处理的标签(通常是输入、图像、a、...)
      • Attrib ....要匹配其值的属性
      • 匹配 .... 属性的匹配值
      • Action ..... if "/C/" 对匹配的标签执行.Click() 动作,否则将动作值放入标签的value属性中

      如果您想挂钩任何包含 JavaScript 代码的属性(例如“onclick”),请不要忘记您在 HTML 源代码中看到的代码嵌入在匿名函数中,例如

      function anonymous()
      {
      onclick="exportData(workOrderSearchForm)";
      }
      

      如果您想挂接例如,您需要使用 Instr() 函数或类似函数来考虑这一点。 "exportData(workOrder" .

      同样非常重要:为页面导航和加载 DOM 对象留出足够的时间。我注意到在我的公司中,一旦页面更改,加载时间有时会急剧增加。

      我在这方面取得了很好的成功:

      Sub MyMainSub()
      Dim Browser As SHDocVw.InternetExplorer
      Dim HTMLDoc As MSHTML.HTMLDocument
      ' my other Dim's
      
          ' start browser
          Set Browser = New SHDocVw.InternetExplorer
          Browser.navigate "http://www.whatever.com"
          WaitForBrowser Browser, 5           ' wait for browser, but not more than 5 sec
      
          ' gain control over DOM object
          Set HTMLDoc = Browser.document
          WaitForBrowser Browser, 5           ' wait for browser, but not more than 5 sec
      
          ' do actions
          ' FormAction HTMLDoc, w, x, y, z
      
      End Sub
      
      
      Sub WaitForBrowser(Browser As SHDocVw.InternetExplorer, Optional TimeOut As Single = 10)
      Dim MyTime As Single
      
          MyTime = Timer                   ' seconds since midnight
          Do While Browser.Busy Or (Timer <= MyTime + TimeOut)
              DoEvents                     ' go do something else
          Loop
      
          If Browser.Busy Then
              MsgBox "I waited for " & Timer - MyTime & " seconds, but browser still busy" & vbCrLf & _
                     "exititing Login sequence now"
              End
          End If
      End Sub
      

      希望这足以激发您创建解决方案。

      祝你好运迈克D

      【讨论】:

      • 哇,你的 FormAction 函数真的很有用!谢谢
      • 您可以将其属性设置为“outerHTML”并从对象中搜索确切的 HTML 标记,例如 &lt;input onclick="toggleCheck();" type="checkbox"&gt;
      【解决方案3】:

      像这样:

      ie.window.exportData(ie.document.forms.workOrderSearchForm)
      

      【讨论】:

      • 不幸的是,它说这不是受支持的方法或属性。一旦我把它放进去,它也会像“ie.Window.exportData(ie.Document.forms.workOrderSearchForm)”这样的代码。
      • 试试ie.window.exportData ie.window.workOrderSearchFormie.window.eval "exportData(workOrderSearchForm)"
      • 这两种方法似乎都不起作用。它们产生相同的错误。
      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2019-09-29
      • 2013-11-21
      相关资源
      最近更新 更多