Excel VBA Запись встроенного VBScript - ошибка времени выполнения «429»: компонент ActiveX не может создать объект - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь импортировать файл CSV в MS Excel (2016) с использованием кода VBA. Манипулирование импортом до сих пор не работало, Excel использует системный разделитель Windows каждый раз, когда я пытаюсь установить импорт VBA.

Итак, я решил использовать VBScript, чтобы сначала изменить системный разделитель с «запятой» на «Tab», импортировать файл CSV, а затем установить системный разделитель обратно на «запятую».

Наличие VBScript в качестве отдельного файла и его запуск:

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

Работает, но VBA должен работать на других машинах, и для простоты использования я хотел попробовать встроить код VBScript в среду Excel VBA. Код, который я написал, останавливается на Set scr = New ScriptControl и выдает: Ошибка времени выполнения '429': компонент ActiveX не может создать объект

Попробовал set scr = CreateObject("MSScriptControl.ScriptControl") не помогло. Кроме того, вот фрагмент моих ссылок на VBAP-проект:

  • Visual Basic для приложений
  • Библиотека объектов Microsoft Excel 16.0
  • OLE Automation
  • Библиотека объектов Microsoft Office 16.0
  • Объекты данных Microsoft ActiveX 6.1. Библиотека
  • Библиотека объектов Microsoft HTML
  • Microsoft Scripting Runtime
  • Регулярные выражения Microsoft VBScript 5.5
  • Microsoft Script Control 1.0
  • Библиотека скриптов Microsoft

Ниже приведен мой код 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 на данный момент) несколько раз , он переключает разделитель вместо простой установки с «запятой» на « Tab и сохраняя его таким образом, так что если разделитель уже «Tab» и я снова запускаю скрипт, разделитель снова становится «запятой».

Любая помощь очень ценится, спасибо!

Ответы [ 2 ]

0 голосов
/ 18 января 2019
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-файл включает MSScriptControl для x64-программ, принудительно помещая 32-битные DLL MSScript в 32-битную DLLHost, позволяя 64-битным программам получать доступ к этой 32-битной dll. COM-объекты в exe-файлах доступны как для 64-битных, так и для 32-битных программ.

Поскольку для запуска Regedit требуются разрешения администратора, в противном случае администратор использует этот пакетный файл для объединения файла reg, поскольку reg.exe не требует прав администратора для запуска. Файл реестра содержит настройки каждого пользователя, которые разрешено изменять всем пользователям (но с reg.exe, а не regedit.exe).

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

Альтернативный способ - разместить интерфейсы самостоятельно в файле класса. Вы должны реализовать IActiveScriptSite как минимум. См. Раздел IActiveScript в справке VBS http://download.microsoft.com/download/winscript56/Install/5.6/W982KMeXP/EN-US/scrdoc56en.exe

0 голосов
/ 17 января 2019

Вы можете запустить VBScript в 64-битной Windows как 32-битный или 64-битный процесс. Я считаю, что у вас есть 64-битная система и, следовательно, когда вы дважды кликаете по ней, она запускается как 32-битная .. что приводит к ошибке. Если вы используете 32-битную версию, вам нужен 32-битный ActiveX, а если вы используете 64-битную версию, вам нужен 64-битный ActiveX.

Чтобы запустить 32-битный VBScript в 64-битной системе, попробуйте это

Создайте новый VBS-файл с именем Test.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     

Один из них побежит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...