javascript
  • vba
  • excel-vba
  • 2010-07-14 116 views 3 likes 
    3

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

    <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应用程序对象的体面的文档,但似乎无法找到一个好的来源。有没有办法执行该功能?

    回答

    8

    试试这个:

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

    但首先你需要包括在参考文献(工具>参考)Microsoft HTML对象库

    0

    像这样:

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

    不幸的是,它说这不是一个支持的方法或属性。 “if.window.exportData(ie.Document.forms.workOrderSearchForm)”一旦放入,它也将代码间隔为空。 – Michael 2010-07-14 15:24:29

    +0

    尝试'ie.window.exportData ie.window.workOrderSearchForm'或'ie.window.eval “exportData(workOrderSearchForm)”' – SLaks 2010-07-14 15:25:27

    +0

    这两者似乎都无法做到这一点。他们产生相同的错误。 – Michael 2010-07-14 15:31:59

    1

    可以循环通所有输入标签,并通过检查“最具识别性”属性(id,name,type,innerHTML,... whatever)来识别相关标签。这里的一个小组()我在Excel工作表可以自动登录到网站使用

    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 
    

    该函数采用以下参数:

    • 文件....的HTML DOM对象
    • 标签....你想要处理的标签(通常是输入,图像,a,...)
    • 属性....你想要匹配的值的属性
    • 匹配....匹配值为属性
    • 行动.....如果在匹配标签进行“/ C /”的。点击()动作,其他动作值放入变量的值属性

    如果你想勾上包含的JavaScript代码(如“点击”)不要忘记,你的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

    相关问题