【问题标题】:Calling JavaScript files from VBA从 VBA 调用 JavaScript 文件
【发布时间】:2014-05-10 11:27:34
【问题描述】:

如果我想将业务逻辑写入 javascript 文件并从 Excel VBA 对其进行测试,然后再将它们处理给网络作者,那么这需要能够从 VBA 调用 javascript。从其他 Stack Overflow 问题(如解析 JSON)中,我发现了 Microsoft Script Control,所以我一直在尝试这个,但我卡住了。

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

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

然后我有一些 VBA 代码来创建 Microsoft Script Control 的实例,将文件加载到其中,然后尝试调用它。代码在下面。可以通过启动 Excel VBA 并粘贴代码来重新创建,尽管您需要参考 Microsoft Script Control(对我来说,C:\Windows\SysWOW64\msscript.ocx)。然后向下翻页到“Sub TestRunIncluded()”,您将在其中看到我为使其正常工作而中止的尝试。

目标是让代码调用 javascript(虽然它位于一个文件中)并返回传入的参数的两倍。

我真的希望它能够工作,因为我有很多用 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

【问题讨论】:

  • 到底出了什么问题?你得到一个错误
  • 您能否简单地测试 HTML 页面中的脚本,或者它们是否以某种方式与 Vba 交互?
  • @Toby Allen,您会在最后一个 Sub 右侧的 cmets 中看到一些错误。关于 HTML 页面,重申一下,我已经编写了很多 VBA 测试脚本,我不想移植这么多代码。
  • 解决了!还是谢谢。

标签: javascript vba excel


【解决方案1】:

嗯,看起来答案很简单....doh!

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

这里有很好的资源http://support.microsoft.com/kb/184740

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多