【问题标题】:VBA Run-time error '380': A script engine for the specified language can not be createdVBA 运行时错误“380”:无法创建指定语言的脚本引擎
【发布时间】:2019-05-22 10:40:30
【问题描述】:

我想这是一个更普遍的问题,以及对特定代码行的帮助。

我有一个几天前正在处理的 Excel 文件,它工作正常,但是现在每当我尝试在工作簿中运行宏以从网站提取数据时,我都会收到错误“运行时错误“380”:无法创建指定语言的脚本引擎。”

这是我遇到问题的代码块。我已为引发错误的特定部分加注星标。

Dim H As Object, S As Object, jParse As Object, X64 As Object, i&

Set H = CreateObject("WinHTTP.WinHTTPRequest.5.1")
    H.SetAutoLogonPolicy 0

#If Win64 Then
    Set X64 = x64Solution()
    X64.execScript "Function CreateObjectx86(sProgID) Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"
    Set S = X64.CreateObjectx86("MSScriptControl.ScriptControl")
#Else
    Set S = CreateObject("ScriptControl")
#End If
    ***S.Language = "JScript"***
    S.AddCode "function keys(O) { var k = new Array(); for (var x in O) { k.push(x); } return k; } "

我以前从未见过这个错误,我不知道如何解决这个问题。我在网上查了一下,到目前为止还没有成功解决这个问题。我还尝试通过以下链接从 Microsoft 下载和安装 zip 文件:https://gallery.technet.microsoft.com/scriptcenter/Registry-key-to-re-enable-835fba77,但没有成功。

任何帮助将不胜感激,因为我真的不知道在这里做什么。

此外,如果 Stack Overflow 不是真正适合此类问题的地方,任何能帮助我找到更适合此类问题的地方的帮助将不胜感激。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我刚刚遇到过类似的尝试,尝试使用 JScript 来使用 x64 机器从 SO API 解析一些 JSON。

    免责声明:我没有编写以下程序,但不幸的是我也没有获得它们的来源。

    您可能已经知道,MSScriptControl.ScriptControl 不太喜欢 x64 架构。这里有几个函数可以让你做你需要做的事情。

    我将它们放在一个单独的模块中:

    Public Function CreateObjectx86(Optional sProgID, Optional bClose = False)
    
        Static oWnd As Object
        Dim bRunning As Boolean
    
        #If Win64 Then
            bRunning = InStr(TypeName(oWnd), "HTMLWindow") > 0
            If bClose Then
                If bRunning Then oWnd.Close
                Exit Function
            End If
            If Not bRunning Then
                Set oWnd = CreateWindow()
                oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"
            End If
            Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)
        #Else
            Set CreateObjectx86 = CreateObject(sProgID)
        #End If
    
    End Function
    
    Private Function CreateWindow()
    
        Dim sSignature, oShellWnd, oProc
    
        On Error Resume Next
        sSignature = Left(CreateObject("Scriptlet.TypeLib").GUID, 38)
        CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""about:<head><script>moveTo(-32000,-32000);document.title='x86Host'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & sSignature & "',document.parentWindow);</script></head>""", 0, False
        Do
            For Each oShellWnd In CreateObject("Shell.Application").Windows
                Set CreateWindow = oShellWnd.GetProperty(sSignature)
                If Err.Number = 0 Then Exit Function
                Err.Clear
            Next
        Loop
    
    End Function
    

    然后你可以回到你的S对象并这样设置:

    Dim S As Object
    Set S = CreateObjectx86("MSScriptControl.ScriptControl")
    
    S.Language = "JScript"
    

    【讨论】:

    • 感谢代码并花时间提供帮助。我应该在哪里将它注入到我的代码中?到目前为止,我在运行脚本时遇到了自动化错误。
    • 检查更新的code here,以防Scriptlet.TypeLib出现权限问题
    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2023-01-30
    • 2012-08-30
    相关资源
    最近更新 更多