Das aufrufen von JavaScript-Dateien aus VBA

wenn ich schreiben will business-Logik in javascript-Dateien und testen von Excel-VBA vor dem Umgang mit Ihnen über ein web-Autor das erfordert, dass wir in der Lage, javascript aufrufen aus VBA. Von anderen Stack-Overflow-Fragen (wie das Parsen von JSON -) ich entdeckte den Microsoft Script Control und so habe ich versucht, aber ich stecken geblieben.

Habe ich eine javascript-Datei, die ich speichern 'c:\temp\starthere.js' enthält eine triviale javascript-Funktion

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

dann habe ich VBA-code zum erstellen einer Instanz von Microsoft Script Control, laden Sie die Datei in es und dann Versuch ich es nennen. Code ist darunter. Man kann neu erschaffen werden, durch das brennen von Excel-VBA und einfügen in den code aber müssen Sie Verweis auf Microsoft Skript-Steuerelement (für mich C:\Windows\SysWOW64\msscript.ocx). Dann die Seite nach unten, um " Sub TestRunIncluded()' wo Sie werden sehen, meine abgebrochenen versuche, damit es funktioniert.

Das Ziel ist es, den code zum Aufruf in javascript (und es ist untergebracht in einer Datei) und return double argument übergeben.

Ich wirklich wollen, dies funktioniert, wie ich habe viele test-Skripte (für Sachen, die komplizierter als eine Verdoppelung!) geschrieben in Excel-VBA. Bitte helfen Sie.

    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
Was ist eigentlich falsch? Do ou eine Fehlermeldung erhalten
Könntest du einfach testen, die Skripte in eine HTML-Seite oder interagieren Sie mit Vba in irgendeiner Weise?
Allen, Sie werden sehen, dass einige der Fehler in den Kommentaren auf der rechten Seite in der letzten Sub. Mit Bezug auf HTML-Seiten, zu re-iterieren, habe ich viele VBA-test-Skripte bereits geschrieben und ich möchte nicht zu haben, um port über so viel code.
Gelöst! Trotzdem danke.

InformationsquelleAutor S Meaden | 2014-05-10

Schreibe einen Kommentar