我正在编写一个网页,作为访问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>
答案 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;
}
}