如何从vba中查找和调​​用javascript方法

Kdu*_*015 6 javascript vba

我相信我需要调用javascript方法而不是尝试触发按钮.我尝试了以下示例,我认为我的问题是我不知道应该使用哪些代码部分.. 单击按钮或使用VBAhttp://www.vbaexpress.com/forum/ 执行JavaScript功能showthread.php?9690-Solved-call-a-javascript-function and http://www.vbforums.com/showthread.php?650771-RESOLVED-How-to-Call-a-JavaScript-function-From-Visual-基本-6-WITH-想参数

我无法发布链接,因为它需要登录才能访问它...如果您需要更大的代码示例以便了解我的问题,请告诉我.

我相信我需要一个引用"导出为CSV"的函数,但我不确定要调用哪个函数以及要在调用中包含哪些函数...以下是来自catalog.js

  function()
  {var a=window.Ext4||window.Ext;a.define    ("Rally.alm.ui.page.plugins.PageToolFactory",{singleton:true,mixins:    {messageable:Rally.Messageable},PRINT:"PRINT",IMPORT:"IMPORT",EXPORT:"EXPORT",ge    t:function(c,b)
{var d=[];
if(this._shouldHaveRowAction(this.PRINT,c))
{
if(b.getPlugin("printplugin"))
{
d.push({text:"Print...",handler:b.getPlugin("printplugin").print,cls:"page-    tools",scope:b.getPlugin("printplugin"),addInteractionClass:true})}}
if(this._shouldHaveRowAction(this.IMPORT,c))
{
if(b.getPlugin("printplugin"))
{
d.push({text:"Import User Stories...",handler:a.emptyFn})}}
if(this._shouldHaveRowAction(this.EXPORT,c))
 {
    if(b.getPlugin("printplugin"))
                  {
                              d.push({text:"Export as  CSV",handler:a.emptyFn})}}                                                                return d}
Run Code Online (Sandbox Code Playgroud)

下一个样本来自yui.js ...

 (function()
 {
 RALLY.ui.menu.AvailablePageTools=Ext.extend(Object, {constructor:function()
 {
 this.PRINT={text:'Print...',slug:'print'};
 this.EMAIL={text:'Email...',slug:'email'};
 this.SAVE={text:'Save...',slug:'save'};
 this.CSV_IMPORT={text:'Import User Stories...',slug:'csvimport'};
 this.CSV_IMPORT_PORTFOLIO_ITEM={text:'Import Portfolio    Items...',slug:'csvimport'};
 this.CSV_EXPORT={text:'Export as CSV',slug:'csvexport'};
 this.PDF_EXPORT={text:'Export as PDF',slug:'pdfexport'};
Run Code Online (Sandbox Code Playgroud)

我在我的vba脚本中尝试了这些选项..

Dim objIE As SHDocVw.InternetExplorer 'microsoft internet controls   (shdocvw.dll)
Dim htmlDoc As MSHTML.HTMLDocument 'Microsoft HTML Object Library
Dim htmlInput As MSHTML.HTMLInputElement
Dim htmlColl As MSHTML.IHTMLElementCollection
Dim CurrentWindow As HTMLWindowProxy




'Set objIE = Nothing
Set objIE = New SHDocVw.InternetExplorer

ThisWorkbook.Worksheets("Sheet1").Activate


With objIE

   .navigate "website"
    .Visible = 1
    Do While .readyState <> 4: DoEvents: Loop
        Application.Wait (Now + TimeValue("0:00:02"))

    Set htmlDoc = .document

    objIE.document.all.Item
        'Set CurrentWindow = objIE.htmlDoc.parentWindow
        'no error no export
        'Call objIE.document.parentWindow.execScript("_exportHandler:Function()", "JavaScript")

         'no error no export
        'Call objIE.document.parentWindow.execScript("_getExportItems:Function()", "JavaScript")

        'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
        'Call objIE.document.parentWindow.execScript("_a.define()", "JavaScript")

        'run time error the object invoked has disconnected from its clients,
        'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
        'Call objIE.document.parentWindow.execScript("_b.push()", "JavaScript")

        'run time error the object invoked has disconnected from its clients,
        'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
         'Call objIE.document.parentWindow.execScript("handler:function(){window.location=Rally.ui.grid.GridExport.buildCsvExportUrl(this.gridboard.getGridOrBoard())}", "JavaScript")

        'Call objIE.document.parentWindow.execScript("b.push()", "JavaScript")

        'Call objIE.document.parentWindow.execScript("c.push()", "JavaScript")

        'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
        'Call objIE.document.parentWindow.execScript("this.CSV_Export()", "JavaScript")

        'error the remote server machine does not exist or is unavailable
        'Call objIE.document.parentWindow.execScript("constructor:function()", "JavaScript")

        'Call objIE.document.parentWindow.execScript("constructor:function()", "JavaScript")

        'object
        Call CurrentWindow.execScript("d.push({text:CHR(34)Export as CSV CHR(34),handler:a.emptyFn})")

        'ofile.SaveAs scrapeRally:=ofile.Name
       'ofile.Close savechanges:=False

        'objIE.Quit
        Set objIE = Nothing

 End With

 End Sub
Run Code Online (Sandbox Code Playgroud)

我试图从VBA运行这个,所以我不能使用var ...

Dim getFunction = "get:function (_shouldhaverowaction(this.export,C)),(b.getPlugin(chr(34)printplugin chr(34)))" 

Dim exportNow 
eval ("exportNow = new" + getFunction + ";") 
Run Code Online (Sandbox Code Playgroud)

我也尝试过

Call objIE.HTMLDocument.eval("get:function (_shouldhaverowaction(this.export,C)),(b.getPlugin( chr(34) printplugin chr(34)))", "JavaScript") 
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我得到"该对象不支持此属性或方法"错误.

任何建议都会很棒.

我刚刚遇到了另一个可能是我想要的功能,但我仍然不知道应该使用哪一部分来调用它.我试着只调用_getExportItems:function()但是由于错误80020101(评估js时出错)我得到RUN TIME ERROR无法完成操作

 _getExportItems:function(){
 var b=[];
 if(this.enableCsvExport){
b.push({
text:"Export to CSV...",
handler:function(){
window.location=Rally.ui.grid.GridExport.buildCsvExportUrl   (this.gridboard.getGridOrBoard())},scope:this})}
Run Code Online (Sandbox Code Playgroud)

dee*_*dee 4

这是使用execScript对象方法的简单示例windowmyFunc它调用名为和 的全局函数myFuncWithParams代码已使用 IE 11 进行测试。

Option Explicit

Private Const Url As String = "c:\Temp\evalExample.html"

Public Sub Test()
    Dim objIE As SHDocVw.InternetExplorer
    Dim currentWindow As HTMLWindowProxy

    Set objIE = New SHDocVw.InternetExplorer
    objIE.navigate Url
    objIE.Visible = 1

    Do While objIE.readyState <> 4
        DoEvents
    Loop

    Set currentWindow = objIE.document.parentWindow

    ' Here the function without parameters is called.
    currentWindow.execScript code:="myFunc()"

    ' Here the function with parameters is called.
    ' First parameter is numeric, then string, then boolean and finally object.
    ' The object has three properties, numeric, string and array.
    currentWindow.execScript code:="myFuncWithParams(123, 'Some text', true, { property1: 555, property2: 'hi there from object', property3: [111,222,333] })"

    ' And here function which receives parameters and returns value.
    ' The return value is then available through hidden property of document named 'Script'.
    ' Thanks to this answer: /sf/ask/630414011/
    currentWindow.execScript code:="func = function(){return myFuncReturns(2,3);}; retVal = func();"
    Dim result As Long
    result = objIE.document.Script.retVal
    Debug.Print result ' for 2 and 3 prints 5

    objIE.Quit
    Set objIE = Nothing
 End Sub
Run Code Online (Sandbox Code Playgroud)

evalExample.html

<!-- saved from url=(0016)http://localhost -->
<html>
<head>
    <script type="text/javascript">
        function myFunc() {
            var date = new Date();
            alert("Hi from my parameter-less 'myFunc'. Day of the month: " + date.getDate());
        }

        function myFuncWithParams(a, b, c, d) {
            var number = a + 100,
                text = b + " from my func2",
                bool = !c,
                obj = d;

            var alertText = "\nNumber = '" + number + "'" +
                            "\nText = '" + text + "'" +
                            "\nBoolean = '" + bool + "'" +
                            "\nObject.property1 = '" + obj.property1 + "'" +
                            "\nObject.property2 = '" + obj.property2 + "'" +
                            "\nObject.property3.lenght = '" + obj.property3.length + "'" + 
                            "\nObject.property3[2] = '" + obj.property3[2] + "'";

            alert("Hi from my 'myFunc2' with parameters.\n" + alertText);
        }

        function myFuncReturns(a, b) {
            return a + b;
        }
    </script>
</head>
<body>
    <div>eval test</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)