【问题标题】:How to find and call javascript method from vba如何从 vba 中查找和调​​用 javascript 方法
【发布时间】:2015-10-09 20:29:13
【问题描述】:

我相信我需要调用 javascript 方法而不是尝试触发按钮。我尝试了以下示例,我认为我的问题是我不知道应该使用代码的哪些部分..Click button or execute JavaScript function with VBA 和这个http://www.vbaexpress.com/forum/showthread.php?9690-Solved-call-a-javascript-functionhttp://www.vbforums.com/showthread.php?650771-RESOLVED-How-to-Call-a-JavaScript-function-From-Visual-Basic-6-WITH-wanted-parameters

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

我相信我需要一个引用“导出为 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}

下一个示例来自 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'};

我已经在我的 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

我正在尝试从 VBA 运行它,所以我不能使用 var...

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

Dim exportNow 
eval ("exportNow = new" + getFunction + ";") 

我也试过了

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

我在尝试运行时收到“对象不支持此属性或方法”错误。

任何建议都会非常棒。

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

 _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})}

【问题讨论】:

  • execScript 不再受支持。从 Internet Explorer 11 开始,使用 eval
  • 嗨,Dee 我按照你的链接尝试了这两件事。我试图从 VBA 运行它,所以我不能使用 var... 'Dim getFunction = "get:function (_shouldhaverowaction(this. export,C)),(b.getPlugin(chr(34)printplugin chr(34)))" 'Dim exportNow 'eval ("exportNow = new" + getFunction + ";") 我也试过了 调用 objIE.HTMLDocument.eval("get:function (_shouldhaverowaction(this.export,C)),(b.getPlugin( chr(34) printplugin chr(34)))", "JavaScript") 我得到了对象不支持此属性或方法错误..

标签: javascript vba


【解决方案1】:

这里是使用window 对象的execScript 方法的简单示例。它调用名为myFuncmyFuncWithParams 的全局函数。 代码已使用 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: https://stackoverflow.com/questions/9005914/retrieve-return-value-of-a-javascript-function-in-the-webbrowser-control-in-vb6
    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

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>

【讨论】:

  • 嗨,迪,谢谢您的帮助!我肯定在我头上,请原谅愚蠢的问题......对于第二个代码sn-p,它应该代表我所指的我的网站源代码吗?还是我应该将它合并到我的 vba 脚本中?
  • Dee 我尝试编写 vba 代码的网站有几个 js 文件。我应该专门引用其中一个来调用我需要的函数吗?谢谢!
  • 这只是一个示例(非常基本的)如何使用execScript 方法调用java-script 函数。在您的情况下,您必须找到需要执行的 java-script 函数的名称,并使用此名称而不是“myFunc()”。
  • 我已经插入了所有我认为可能是我想要的功能,但我仍然没有成功......在您的示例中,您调用了不包含参数的函数。从 vba 脚本调用 js 函数时可以包含/应该包含参数吗?
  • 我已经编辑了答案并添加了第二个带有参数的函数以及如何从 VBA 调用此函数。也许Getting Started with the F12 Developer Tools 可能会帮助您找到正确的 java-script 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2015-11-13
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多