预期';'尝试使用jscript运行excel宏时

时间:2013-06-06 16:38:58

标签: javascript excel excel-vba jscript object-expected vba

我正在编写一个网页,作为访问excel工作簿的前端,该工作簿为某些硬件生成配置文件。目前,这只是我测试这个概念并熟悉jscript如何自动化excel。

我的问题是当我尝试运行宏时,我不断得到一个“预期的”;第46行Char 7的错误。“据我所知,语法是正确的,它适用于不同的Excel工作簿宏。我已经在我的电脑上修复了.dll并检查了IE设置,但令我困惑的是为什么这不起作用,而其他jscript运行得很好。

工作正常:oXL.Run(“ButtonTest.xlsm!Module1.buttonclick”);

GIves错误:oXL.Run(“test.xlsm!Module1.makeconfigs”);

我的概念测试的完整代码:

<!DOCTYPE html>
<html lang="en">


    <body>
<SCRIPT LANGUAGE="VBScript">

</SCRIPT>

<SCRIPT LANGUAGE="JScript"> 
function AutomateExcel(store,direct,MdfFloor,MdfSW,Include)
{

   // Start Excel and get Application object.
      var oXL = new ActiveXObject("Excel.Application");
      var filename = "D:\\Profiles\\ngwx36\\Desktop\\test.xlsm"; 
      oXL.Visible = true;

   // Open Staging Workbook
      var oWB = oXL.Workbooks.Add(filename);


   // Place vars from input in correct cell
      oWB.Sheets("Instructions").Cells(1, 5).Value = store;
      oWB.Sheets("Instructions").Cells(2,5).Value = direct;
      oWB.Sheets("SWInventory").Cells(3,2).Value = MdfFloor;
      oWB.Sheets("SWInventory").Cells(3,6).Value = MdfSW;

   //checks to see if 3rd MDF needs to be included
      if (Include == "Yes"){
        oWB.Sheets("SWInventory").Cells(5,2).Value = "Included";
      }

   //fill 2 IDFs in to test atm
      oWB.Sheets("SWInventory").Cells(7,2).Value = "1";
      oWB.Sheets("SWInventory").Cells(7,3).Value = "1";
      oWB.Sheets("SWInventory").Cells(7,4).Value = "SW01";
      oWB.Sheets("SWInventory").Cells(7,6).Value = "EX2200C";
      oWB.Sheets("SWInventory").Cells(8,2).Value = "2";
      oWB.Sheets("SWInventory").Cells(8,3).Value = "2";
      oWB.Sheets("SWInventory").Cells(8,4).Value = "SW02";
      oWB.Sheets("SWInventory").Cells(8,6).Value = "EX2200C";

      window.alert("Filled Sheet Just Fine");
      //run config macro
      oXL.Run("test.xlsm!Module1.makeconfigs");
      window.alert("Process Complete");





}

</SCRIPT>
<Form Name=Input>
<p>
          <label>Store Name</label>
          <input type = "text"
                 name= "StoreName"
                 value = "" />
</p>
<p>
          <label>File Directory</label>
          <input type = "text"
                 name= "FilePath"
                 value = "" />
</p>
<p>
          <label>MDF Floor #</label>
          <input type = "text"
                 name= "MdfFloor"
                 value = "" />
</p>
<p>
          <label>MDF Type</label>
          <input type = "text"
                 name= "MdfType"
                 value = "Enter MDF SW TYpe" />
</p>
<p>
          <label>MDF Include</label>
          <input type = "text"
                 name= "MdfInc"
                 value = "3rd MDF Yes or No?" />
</p>

</form>
<P><INPUT id=button1 type=button value="Start Excel" 
          onclick="AutomateExcel Input.StoreName.Value,Input.FilePath.Value,Input.MdfFloor.Value,Input.MdfType.value,Input.MdfInc.Value">
</P>    

</body>
</html>

更新

我还没有发现为什么我会得到预期的错误,但我确实通过制作一个只运行宏的VBScript函数来实现一个解决方法修复。由于某种原因,VB可以运行这个特定的宏,但Jscript不喜欢。

<!DOCTYPE html>
<html lang="en">
    <body>
        <script language = "VBscript">
         function RunMacro()
            dim oXL
            Set oXL = GetObject(,"Excel.Application")
            oXL.Run "makeconfigs"
         end function
        </script>
        <Script Language = "jscript">
         function AutomateExcel(){
            var oXL = new ActiveXObject("Excel.Application");
            var filename = "D:\\Profiles\\ngwx36\\Desktop\\test.xlsm"; 
            oXL.Visible = true;

            var oWB = oXL.Workbooks.Add(filename);
            RunMacro();

         }
        </Script>

        <P><INPUT id=button1 type=button value="Start Excel" 
          onclick="AutomateExcel()">
</P>    

    </body>
</html>

5 个答案:

答案 0 :(得分:1)

这是错误代码冲突的情况。

JavaScript引擎将1004映射到*语法错误:预期';'*,请参阅JavaScript Syntax Errors

Office Automation将代码1004映射到运行时错误1004:应用程序定义的错误或对象定义的错误

如果您调用Office组件(在您的情况下为Excel.Application)表单JavaScript,组件中发生的运行时错误1004将传播到JavaScript引擎,该引擎将此代码映射到语法错误:预期';'。

当然,这种类型的错误传播是彻头彻尾的愚蠢,感谢Microsoft。

所以你的问题不在于JavaScript,而是在对Office组件的调用中,可能是run()方法。

答案 1 :(得分:0)

我看到的唯一缺少分号的是您拨打window.alert()

window.alert("Filled Sheet Just Fine")

只需将其添加回来,我猜你会没事的。

答案 2 :(得分:0)

你在这行末尾错过了一个分号:

window.alert("Filled Sheet Just Fine")

答案 3 :(得分:0)

看起来JScript正在处理onclick。它的语法适用于VBScript,但不适用于JScript。这可以通过添加伪协议来修复:

onclick="VBScript: AutomateExcel Input.StoreName.Value, Input.FilePath.Value, ... "
      JScript expects ; here ---^

您也可以使用JScript,但是您需要将AutomateExcel()的参数括在括号中,但我不确定是否为Jscript定义了Input

我不清楚,为什么有时会使用VBScript和JScript解释在线事件处理程序。也许你想问一个关于这个的新问题。

答案 4 :(得分:0)

//这对我来说很好。

       function call_Macro(){
        try{
        var ExApp;
        var excel_file;
        ExApp = new ActiveXObject("Excel.Application");
        var excel_file = ExApp.Workbooks.Open("D:\\NewFolder\\FSO.xlsm"); 

        ExApp.Run("FSO.xlsm!MacroName");

        excel_file.Close();    // important
        excel_file = null;
        ExApp.Quit();
        ExApp = null;       
        }
        catch(ex)
        {
        alert(ex.message);
        excel_file.Close();    // important
        excel_file = null;
        ExApp.Quit();
        ExApp = null;   
        }
    }