【问题标题】:Excel VBA Writing in-line VBScript - Run-time error '429': ActiveX component can't create objectExcel VBA 编写内联 VBScript - 运行时错误“429”:ActiveX 组件无法创建对象
【发布时间】:2019-06-11 23:17:33
【问题描述】:

我正在尝试使用 VBA 代码将 CSV 文件导入 MS Excel (2016)。到目前为止,操作导入不起作用,Excel 每次都使用 Windows 系统分隔符,而不是我试图在 VBA 导入中设置的内容。

所以,我想首先使用 VBScript 将系统分隔符从“逗号”更改为“制表符”,导入 CSV 文件,然后将系统分隔符设置回“逗号”。

将 VBScript 作为单独的文件并通过以下方式运行它:

    Shell "wscript D:\Hutsul\ChangeDelimiter.vbs", vbNormalFocus

有效,但 VBA 需要在其他机器上运行,为了便于使用,我想尝试在 Excel VBA 环境中内联编码 VBScript。 我写的代码停在Set scr = New ScriptControl 并抛出: 运行时错误“429”:ActiveX 组件无法创建对象

试过set scr = CreateObject("MSScriptControl.ScriptControl") 没有帮助。 此外,这是我的 VBAProject 参考的片段:

  • Visual Basic 应用程序
  • Microsoft Excel 16.0 对象库
  • OLE 自动化
  • Microsoft Office 16.0 对象库
  • Microsoft ActiveX 数据对象 6.1 库
  • Microsoft HTML 对象库
  • Microsoft 脚本运行时
  • Microsoft VBScript 正则表达式 5.5
  • Microsoft 脚本控制 1.0
  • Microsoft Scriptlet 库

下面是我的内嵌脚本的 VBA 代码(单独的脚本文件只包含 scriptCode 行中的内容:

'Execute VBScript directly from VBA to change system delimiter from COMMA to TAB
Dim scriptCode As String
Dim scr As ScriptControl: Set scr = New ScriptControl
scriptCode = ""
scriptCode = scriptCode & "Set sh = CreateObject(""WScript.Shell"")"
scriptCode = scriptCode & "Path = ""HKCU\Control Panel\International\sList"""
scriptCode = scriptCode & "Set Separator = CreateObject(""Scripting.Dictionary"")"
scriptCode = scriptCode & "Separator.Add True, ""\t"""
scriptCode = scriptCode & "Separator.Add False, "","""
scriptCode = scriptCode & "sh.RegWrite Path, Separator(sh.RegRead(Path) = "",""), ""REG_SZ"""

scr.Language = "VBScript"
scr.AddCode scriptCode
scr.Run scriptCode

另外,当脚本本身被执行时(现在作为一个单独的 .vbs 文件)多次,它切换分隔符,而不是仅仅从“逗号”设置到“制表符”并保持这种方式,所以如果分隔符已经是“制表符”并且我再次运行脚本,则分隔符再次变为“逗号”。

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 注册C:\Windows\System32\MSscript.ocx你应该没问题:)
  • @SiddharthRout 成功注册了 MSscript.ocx 但之后同样的错误
  • 我知道问题出在哪里了。让我发布一个答案
  • 为什么你的 VBS 代码不能像在 VBA 中那样工作。VBScript 被设计成可以粘贴到 VBA 中。

标签: excel vba csv vbscript


【解决方案1】:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
@="ScriptControl Object"
"AppID"="{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\AppID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"DllSurrogate"=""

[HKEY_CURRENT_USER\SOFTWARE\Classes\AppID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"DllSurrogate"=""

此 reg 文件通过强制 MSScript 的 32 位 DLL 进入 32 位 DLLHost 来启用 x64 程序的 MSScriptControl,从而允许 64 位程序访问此 32 位 dll。 exe文件中的COM对象可以被64位和32位程序访问。

由于 Regedit 需要管理员权限才能启动,如果不是管理员,请使用此批处理文件合并 reg 文件,因为 reg.exe 不需要管理员权限即可启动。注册表文件仅包含每个用户的设置,所有用户都可以更改(但使用 reg.exe 而不是 regedit.exe)。

reg import "%~dp0\MSScript.reg"
Pause

另一种方法是自己在类文件中托管接口。您至少需要实现 IActiveScriptSite。请参阅 VBS 帮助中的 IActiveScript 主题http://download.microsoft.com/download/winscript56/Install/5.6/W982KMeXP/EN-US/scrdoc56en.exe

【讨论】:

    【解决方案2】:

    您可以在 64 位 Windows 上将 VBScript 作为 32 位进程或 64 位进程运行。我相信你有一个 64 位系统,因此当你双击它时,它会以 32 位的方式运行它。导致错误。如果运行 32 位,则需要 32 位 ActiveX;如果运行 64 位,则需要 64 位 ActiveX。

    要在 64 位系统上运行 32 位 VBScript,试试这个

    创建一个名为Test.Vbs 的新VBS 文件并将其另存为C:\Temp\Test.Vbs 在该文件中键入这两行。

    Set scr = CreateObject("MSScriptControl.ScriptControl")
    MsgBox "Success"
    

    现在按 Win + R 启动Run。输入这个

    C:\windows\sysWOW64\cscript C:\Temp\test.vbs
    

    它现在运行吗?看到“成功”消息框了吗?

    如果上面没有运行,那么试试这个

    C:\windows\system32\cscript C:\Temp\test.vbs     
    

    其中一个会运行。

    【讨论】:

    • 使用命令 C:\windows\sysWOW64\cscript C:\Temp\test.vbs 运行单独的文件,在 VBA 中运行脚本代码仍然会引发相同的错误。需要知道如何在VBA中强制这种执行Set scr = CreateObject("MSScriptControl.ScriptControl")
    • VBA 不应该给你任何问题。它对我来说很好用。你的是 64 位 windows 和 32 位 office?
    • 获得了带有 64 位 Office 2016 的 64 位系统。另外,还安装了 64 位的 2010 Excel 和 Access。 2010 年尝试过,结果相同。因此,如果 VBScript 在其自己的文件中,则该代码 Set scr = CreateObject("MSScriptControl.ScriptControl") 在普通运行期间仍然会失败,但如果使用您给我的命令执行则运行。但是,当我通过 Excel VBA(我提供的代码)运行脚本时,如果失败。
    猜你喜欢
    • 2013-04-13
    • 2011-02-08
    • 2015-04-24
    • 2016-04-24
    • 1970-01-01
    • 2013-06-24
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多