繁体   English   中英

Excel VBA 编写内嵌 VBScript - 运行时错误“429”:ActiveX 组件无法创建对象

[英]Excel VBA Writing in-line VBScript - Run-time error '429': ActiveX component can't create object

我正在尝试使用 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 库
  • 微软 HTML 对象库
  • Microsoft 脚本运行时
  • Microsoft VBScript 正则表达式 5.5
  • 微软脚本控制 1.0
  • Microsoft Scriptlet 库

下面是我的scriptCode脚本的 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 文件)时,它会切换 delimiter ,而不是仅仅将“逗号”设置为“Tab”并保持这种方式,因此如果分隔符已经是“Tab” ' 然后我再次运行脚本,分隔符再次变为“逗号”。

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

您可以在 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     

其中之一将运行。

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 允许 64 位程序访问这个 32 位 dll,从而为 x64 程序启用 MSScriptControl。 64 位和 32 位程序都可以访问 exe 文件中的 COM 对象。

由于 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM