从VBA调用JavaScript文件

如果我想将业务逻辑写入JavaScript文件,并在将它们处理到Web作者之前从Excel VBA进行testing,那么需要能够从VBA调用JavaScript。 从其他堆栈溢出问题(如parsingJSON),我已经发现了微软脚本控制,所以我一直在尝试这个,但我卡住了。

我有一个JavaScript文件,我保存到'c:\ temp \ starthere.js',其中包含一个简单的JavaScript函数

function DoubleMe(a) { return a * 2; } 

然后我有一些VBA代码来创build一个Microsoft脚本控制的实例,加载文件,然后尝试调用它。 代码在下面。 可以通过启动Excel VBA并粘贴代码来重新创build,但是需要参考Microsoft脚本控制(在C:\Windows\SysWOW64\msscript.ocx )。 然后下一页到“Sub TestRunIncluded()”,你会看到我的中止尝试得到这个工作。

目标是让代码调用到JavaScript(而它是在一个文件中),并返回双参数传入。

我真的希望这个工作,因为我有很多testing脚本(对于比双倍更复杂的东西!)写在Excel VBA中。 请帮忙。

  Option Explicit 'code loosely based on 'http://stackoverflow.com/questions/5773683/excel-vba-parsed-json-object-loop 'Tools->References-> 'MSScriptControl; Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx 'other libraries are late bound Private moScriptEngine As ScriptControl Public Property Get ScriptEngine() 'factory If moScriptEngine Is Nothing Then Set moScriptEngine = New ScriptControl moScriptEngine.Language = "JScript" 'moScriptEngine.AllowUI = True End If Set ScriptEngine = moScriptEngine End Property Public Sub AddJSFile(ByVal sJSFilename As String) Debug.Assert LCase$(Right$(sJSFilename, 3)) = ".js" Dim fso As Object 'Scripting.FileSystemObject Set fso = VBA.CreateObject("Scripting.FileSystemObject") Debug.Assert fso.FileExists(sJSFilename) Dim fil As Object 'Scripting.File Set fil = fso.GetFile(sJSFilename) Dim ins As Object 'Scripting.TextStream Set ins = fil.OpenAsTextStream(1) '1=ForReading Dim sCode As String sCode = ins.ReadAll ins.Close Set ins = Nothing Set fil = Nothing Set fso = Nothing Debug.Assert Len(sCode) > 0 ScriptEngine.AddCode sCode End Sub Sub TestAddJSFile() AddJSFile "c:\temp\starthere.js" '* c:\temp\starthere.js contains the following four lines, last line is just a newline (from Notepad) 'function DoubleMe(a) { ' return a * 2; '} '<newline> End Sub '!Fellow StackOverflow users, press F5 on this Sub as this is entry point! Sub TestRunIncluded() TestAddJSFile Dim res Debug.Assert Not IsObject(ScriptEngine.Eval("var b=DoubleMe(3)")) 'Debug.Print ScriptEngine.Eval("return DoubleMe(3) ") 'Errors 1018: "'return' statement outside of function" Debug.Print ScriptEngine.Eval("(function { DoubleMe(3) })") 'Errors 1005: "expected '('" 'Debug.Assert IsObject(ScriptEngine.Run("(DoubleMe(3))")) 'Debug.Assert IsObject(ScriptEngine.Eval("(DoubleMe(3))")) 'Set res = ScriptEngine.Eval("DoubleMe(3);") End Sub 

那么它看起来像答案很简单…. doh!

Debug.Assert ScriptEngine.Eval("DoubleMe(3)") = 6

良好的资源在这里http://support.microsoft.com/kb/184740