Вопрос или проблема
Я использую надстройку reg-ex для Excel и она работает хорошо, единственная проблема заключается в том, что она не загружается, когда Excel запускается через VBA.
У меня есть макрос в Word, который собирает данные в Word и копирует их в Excel, этот макрос запускает Excel, результат нормальный, но мне нужно перезапустить Excel, чтобы использовать надстройку (она включена в настройках, просто не загружается).
Я пробовал другой макрос: просто открыть Excel и создать новую книгу, и у него та же проблема.
У меня есть только эта одна сторонняя надстройка, поэтому я не могу сравнить с другими.
Какие-нибудь идеи?
Так это и должно работать.
Из документации COM.
Автоматизация компонентов
Экспонирование объекта приложения
Языковой фильтр: Все Языковой фильтр: Несколько Языков Языковой фильтр: Visual Basic Языковой фильтр: C# Языковой фильтр: C++ Языковой фильтр: J# Языковой фильтр: JScript
Visual Basic (Объявление)
Visual Basic (Использование)
C#
C++
J#
JScript
Любые приложения на основе документов, взаимодействующие с пользователем, которые экспонируют объекты ActiveX, должны иметь один верхний уровень объекта, называемого объектом Application. Этот объект инициализируется как активный объект, когда приложение запускается.
Объект Application идентифицирует приложение и предоставляет способ для клиентов ActiveX связываться и навигировать по экспонированным объектам приложения. Все другие экспонированные объекты подчинены объекту Application; это корневой объект в иерархии объектов.
Имена членов объекта Application являются частью глобального пространства имен, поэтому клиентам ActiveX не нужно их квалифицировать. Например, если MyApplication - это имя объекта Application, программа на Visual Basic может ссылаться на метод MyApplication как MyApplication.MyMethod или просто MyMethod. Однако, следует быть осторожным, чтобы не перегружать объект Application слишком большим количеством членов, так как это может вызвать неоднозначность и снизить производительность. Большое, сложное приложение с множеством членов должно быть организовано иерархически, с несколькими обобщенными объектами на вершине, разветвляясь на меньшие, более специализированные объекты.
Следующая таблица показывает, как приложения должны экспонировать свои объекты Application и Document.
Командная строка Приложение с мульти-документным интерфейсом Приложение с одно-документным интерфейсом
/Embedding
Экспонировать классы фабрик для классов документов, но не для приложения.
Вызвать RegisterActiveObject для объекта Application.
Экспонировать классы фабрик для класса документа, но не для приложения.
Вызвать RegisterActiveObject для объекта Application.
/Automation
Экспонировать классы фабрик для классов документов.
Экспонировать класс фабрики для приложения, используя RegisterClassObject.
Вызвать RegisterActiveObject для объекта Application.
Не экспонировать класс фабрики для класса документа.
Экспонировать класс фабрики для объекта Application, используя RegisterClassObject.
Вызвать RegisterActiveObject для объекта Application.
Без переключателей OLE
Экспонировать классы фабрик для классов документов, но не для приложения.
Вызвать RegisterActiveObject для объекта Application.
Вызвать RegisterActiveObject для объекта Application.
Вызов RegisterActiveObject вводит объект Application в таблицу запущенных объектов OLE (ROT), чтобы клиенты ActiveX могли извлекать активный объект, а не создавать новый экземпляр. Приложения Visual Basic могут использовать оператор GetObject для доступа к существующему объекту.
© Корпорация Майкрософт. Все права защищены.
Таким образом, /a или /embedding не загрузят ничего, кроме самого приложения (и /a также является хорошим шагом для устранения неполадок).
Запустите ваше приложение, затем выполните GetObject.
Также нет особой причины использовать такую надстройку, так как вы можете сделать ровно то же самое, что и делает надстройка. Это vbs (так что можно вставить в VBA) с использованием того же движка RegEx, что и ваша надстройка (Word также имеет свой собственный движок RegEx, называемый Использовать подстановочные знаки
). Установите ссылку на Microsoft VBScript Regular Expression 5.5
.
Set regEx1 = New RegExp
If Instr(LCase(Arg(1)), "i") > 0 then
regEx1.IgnoreCase = True
Else
regEx1.IgnoreCase = False
End If
If Instr(LCase(Arg(1)), "v") > 0 then
IncExc = False
Else
IncExc = True
End If
regEx1.Global = False
regEx1.Pattern = Pttn
Do Until Inp.AtEndOfStream
Line=Inp.readline
If RegEx1.Test(Line) = IncExc then
outp.writeline Line
End If
Loop
Я решил это, основываясь на ответе на похожий вопрос на StackOverflow: https://stackoverflow.com/a/806720/4721734
Я снова посмотрел на эту проблему, и коллекция Application.Addins, похоже, содержит все надстройки, указанные в меню Инструменты->Надстройки, с булевым значением, указывающим, установлена ли надстройка или нет. Так что, похоже, что теперь работает для меня – перебрать все надстройки, и если .Installed = true, то я устанавливаю .Installed в False, а затем обратно в True, и это, похоже, правильно загружает мои надстройки.
Function ReloadXLAddins(TheXLApp As Excel.Application) As Boolean Dim CurrAddin As Excel.AddIn For Each CurrAddin In TheXLApp.AddIns If CurrAddin.Installed Then CurrAddin.Installed = False CurrAddin.Installed = True End If Next CurrAddin End Function
.
Ответ или решение
Вопрос: Почему надстройка Excel не загружается при открытии Excel через VBA?
Введение
Проблема, с которой вы сталкиваетесь, когда используете надстройку RegEx в Excel, заключается в том, что она не загружается при запуске Excel через макрос VBA в Word. Данное поведение является распространённым и связано с тем, как Excel управляет загрузкой надстроек, когда он запускается программно.
Причины проблемы
Когда вы открываете Excel напрямую (например, двойным щелчком по ярлыку), все надстройки загружаются автоматически. Однако, когда Excel запускается через макрос VBA, он может не инициализировать надстройки так, как это делает при обычном запуске. Это может быть связано с тем, что при запуске Excel в этом контексте используется другой режим инициализации.
Решения
1. Перезагрузка надстроек
Как было предложено в одном из ответов на Stack Overflow, вы можете обойти данную проблему, повторно инициализировав надстройки в Excel. Используйте следующий код, чтобы пройтись по всем доступным надстройкам и повторно установить их состояние:
Function ReloadXLAddins(TheXLApp As Excel.Application) As Boolean
Dim CurrAddin As Excel.AddIn
For Each CurrAddin In TheXLApp.AddIns
If CurrAddin.Installed Then
CurrAddin.Installed = False
CurrAddin.Installed = True
End If
Next CurrAddin
End Function
Этот код проходит по коллекции AddIns
и отключает/включает каждую надстройку, что заставляет Excel загрузить их заново.
2. Запуск Excel без параметров
Когда Excel запускается с определенными параметрами (например, /a или /embedding), это может ограничить его функциональность. Убедитесь, что ваш VBA-код не передает такие параметры, которые мешают нормальной загрузке надстроек.
3. Настройка надстроек
Перед запуском макроса убедитесь, что надстройки правильно настроены в меню Файл > Параметры > Надстройки
, и что ваша надстройка активна. Порой пользователям нужно просто вручную убедиться, что она включена.
4. Использование встроенных возможностей VBA
Если ваша надстройка предоставляет функционал, доступный через VBA, вы можете рассмотреть возможность использования встроенных возможностей VBA для выполнения тех же операций, которые выполняет ваша надстройка. Это может помочь избежать зависимости от загрузки конкретной надстройки.
Заключение
Если все вышеперечисленные методы не решают вашу проблему, возможна необходимость обновления или переустановки надстройки, а также проверки на совместимость с вашей версией Excel. Вполне вероятно, что сама надстройка имеет некоторые ограничения, когда используется в автоматизированных сценариях. Если вы хотите избежать дальнейших проблем, возможно, вам стоит рассмотреть альтернативные подходы к решению ваших задач, таких как использование встроенных возможностей Excel или других методов, которые могут обеспечить необходимую функциональность без зависимостей от внешних надстроек.
Эти шаги должны помочь вам эффективно диагностировать и устранить проблему с загрузкой надстроек в Excel при работе с VBA.