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
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut wie es aussieht war die Antwort einfach....doh!
Debug.Assert ScriptEngine.Eval("DoubleMe(3)") = 6
Gute Ressource, hier http://support.microsoft.com/kb/184740
InformationsquelleAutor S Meaden