单击按钮或使用VBA执行JavaScript功能

时间:2010-07-14 14:53:43

标签: javascript vba excel-vba excel

我正在尝试让我的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应用程序对象的体面文档,但似乎找不到好的来源。有没有办法执行该功能?

3 个答案:

答案 0 :(得分:10)

试试这个:

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

但首先,您需要在参考(工具&gt;参考)

下包含Microsoft HTML对象库

答案 1 :(得分:2)

您可以循环访问所有输入标记,并通过检查“最具识别性”属性(id,name,type,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对象
  • 标记....您要处理的标记(通常是输入,图像,a,...)
  • Attrib ....要匹配其值的属性
  • 匹配....属性的匹配值
  • 操作.....如果“/ 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

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

祝你好运MikeD

答案 2 :(得分:0)

像这样:

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