如何从vba

时间:2015-07-20 16:05:35

标签: javascript vba

我相信我需要调用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()但由于错误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})}

1 个答案:

答案 0 :(得分:1)

这里使用execScript对象的window方法的简单示例。它调用名为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>