Сообщение об ошибке «Компонент ActiveX не может создать объект» появляется для всех объектов - PullRequest
0 голосов
/ 16 апреля 2019

Я не могу создать объекты в макросе Excel, который пытаюсь написать. Первоначально я пытался работать с MSXML2.DOMDocument60, однако я понял, что не могу заставить ActiveX создавать какие-либо объекты. Например, я получаю ту же ошибку (во время выполнения 429 «компонент ActiveX не может создать объект») для этой строки кода:

Dim ExcelSheet As Object
Set ExcelSheet = CreateObject("Excel.Sheet")

Очевидно, что так как я в Excel, программа установлена ​​правильно, и она должна иметь к ней доступ. Я проверил несколько других страниц Stackoverflow для этого. Похоже, что это не проблема со ссылкой, и я не могу представить, как простой код выше не работает из-за отсутствия DLL, так как я снова уже в Excel.

Возможно, на моем компьютере есть функция безопасности, блокирующая это действие?

Опять же, моя проблема не в вышеуказанном коде. Это был простой способ показать, что объект Create не работает.

Моя главная цель - заставить работать следующее: Dim objXML As MSXML2.DOMDocument60 Установите objXML = CreateObject ("MSXML2.DOMDocument60")

Я уже подтвердил, что у меня есть правильная ссылка, и я перерегистрировал Dlls.

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Я нашел ответ, который искал. В моей компании заблокирован диск C и другой сетевой диск, что препятствует работе CreateObject при сохранении листа Excel в любом из этих мест. Сохраняя лист Excel на рабочем столе, я могу заставить его работать.

0 голосов
/ 16 апреля 2019

В объектной модели Excel нет класса с Excel.Sheet progID. Вы, вероятно, имели в виду Excel.Worksheet, но это тоже не сработает, и это не из-за CreateObject или какой-либо неясной функции безопасности.

Проще говоря, не все классы / типы могут быть созданы : в библиотеке типов Excel Application есть, и это все: все остальное необходимо создавать в объектной модели, используя фабричные методы предоставляется этим API.

Другими словами, единственный способ создать Excel.Worksheet - это создать его в Excel.

Set excelSheet = Excel.Application.ActiveWorkbook.Worksheets.Add

То же самое с Excel.Workbook:

Set excelBook = Excel.Application.Workbooks.Add

Есть другие способы (например, копирование существующего Worksheet без указания аргумента Target создаст новый Workbook, содержащий копию этого источника Worksheet), но правило большой палец, если вы не можете New создать класс в указанной библиотеке типов, есть небольшой шанс, что CreateObject сможет сделать что-то лучше (если только регистрация типа явно не предотвращает раннее связывание).


Вопрос был отредактирован, но этот ответ стоит: не используйте CreateObject для создания экземпляров классов, которые уже разрешены и легко доступны.

Set objXml = New MSXML2.DOMDocument60 'works fine

Если вы действительно хотите использовать CreateObject, тогда вам нужно использовать строки progID, которые существуют в вашем реестре.

Set objXml = CreateObject("MSXML2.DOMDocument60") ' blows up on my machine as well
Set objXml = CreateObject("MSXML2.DOMDocument") ' works fine

Но использование CreateObject для создания экземпляра класса, о котором компилятор уже знает, - очень и очень окольный способ сделать это.

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