簡體   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