Проекты VBA

Проекты VBA

VBA-проекты

В этом руководстве показано, как просматривать и изменять проект VBA, встроенный в документ с поддержкой макросов, с помощью Aspose.Words FOSS для .NET. Aspose.Words FOSS для .NET может просматривать и изменять проект VBA, встроенный в документ с поддержкой макросов (.docm) — его модули, исходный код и ссылки на библиотеки — через Document.VbaProject и объектную модель VbaProject/VbaModule. Это просмотр и редактирование проекта, а не выполнение макросов: Aspose.Words никогда не включал среду выполнения VBA, ни в коммерческом продукте, ни в этой версии FOSS, поэтому код VBA читается и изменяется как данные, а не исполняется.


Доступ к проекту VBA документа

Document.VbaProject возвращает VbaProject, или null, если у документа нет проекта VBA. Document.HasMacros сообщает, присутствует ли проект VBA, без необходимости сначала обращаться к VbaProject. VbaProject.Name, CodePage, IsSigned и IsProtected описывают сам проект.


Чтение и редактирование модулей

VbaProject.Modules возвращает VbaModuleCollection. Обращайтесь к нему по имени, чтобы найти конкретный модуль (например, modules["ModuleName"]) или перечислить всю коллекцию. Каждый VbaModule раскрывает свой Name, Type (это VbaModuleType: DocumentModule, ProceduralModule, ClassModule или DesignerModule), и — что особенно важно — его SourceCode как свойство-строку, доступное для записи, так что исходный код модуля можно читать и переписывать программно. VbaModuleCollection.Add(vbaModule) и Remove(module) добавляют или удаляют модули из проекта.


Ссылки на библиотеки

VbaProject.References возвращает VbaReferenceCollection из VbaReference объектов — библиотеки типов Automation и другие проекты VBA, от которых зависит код макроса. VbaReference.Type сообщает о VbaReferenceType (Registered, Project, Original или Control), а LibId идентифицирует ссылку на библиотеку. VbaReferenceCollection.Remove(item) / RemoveAt(index) удаляют ссылки.


Удаление проекта VBA

Document.RemoveMacros() полностью удаляет проект VBA из документа — полезно для создания копии без макросов документа, который изначально поставлялся с макросами.


Советы и рекомендации

  • Проверьте Document.HasMacros перед тем как работать с Document.VbaProject, чтобы избежать обработки null для документов, в которых никогда не было макросов.
  • Обрабатывайте VbaModule.SourceCode как обычный текст — поскольку среды выполнения VBA нет, редактирование не проверяет код; некорректный VBA всё равно будет проходить сквозь процесс, но не будет работать корректно в Word до исправления.
  • Используйте VbaProject.IsSigned/IsProtected для обнаружения подписанных или защищённых проектов перед попыткой изменить их модули.
  • Document.RemoveMacros() — самый простой способ удалить макросы для «чистой» дистрибутивной копии, вместо того чтобы вручную очищать каждый модуль.

Распространённые проблемы

ПроблемаПричинаИсправление
Document.VbaProject является nullВ документе нет проекта VBAСначала проверьте Document.HasMacros, прежде чем обращаться к членам VbaProject
Ожидается, что макросы запустятся после редактирования SourceCodeAspose.Words не имеет движка выполнения VBAИспользуйте этот API только для чтения/модификации исходного кода макроса и его структуры; запустите полученный документ в среде с поддержкой VBA, например Microsoft Word, чтобы выполнить код
Индексация VbaModuleCollection по имени ничего не возвращаетНесоответствие имени модуля (регистр или точное написание)Перечислите VbaProject.Modules, чтобы подтвердить точное имя модуля

FAQ

Может ли Aspose.Words FOSS для .NET выполнять VBA-макросы в документе?

Нет. Ни эта версия, ни коммерческий продукт Aspose.Words не включают движок выполнения VBA — проекты VBA читаются и изменяются как данные (исходный код модуля, ссылки, метаданные проекта), но не исполняются.

Как прочитать исходный код макроса?

Получите модуль, индексируя VbaProject.Modules по имени (например, modules["ModuleName"]), затем прочитайте его свойство SourceCode.

Могу ли я добавить совершенно новый VBA-модуль в документ?

Да — создайте VbaModule и добавьте его в VbaModuleCollection проекта через Add(vbaModule).

Как проверить, содержит ли документ макросы, прежде чем обрабатывать его?

Прочитайте Document.HasMacros; это true, если документ содержит проект VBA, без необходимости сначала обращаться к Document.VbaProject.

Как удалить все макросы из документа?

Вызовите Document.RemoveMacros().


API Reference Сводка

Класс / МетодОписание:
Document.VbaProjectVbaProject документа, либо null, если в нём нет макросов
Document.HasMacrosПрисутствует ли проект VBA
VbaProjectName, Modules, References, CodePage, IsSigned, IsProtected
VbaModuleОдин модуль: Name, Type (VbaModuleType), записываемый SourceCode
VbaModuleCollectionAdd(), индексатор по имени, Remove(), Count
VbaReference / VbaReferenceCollectionСсылки на типовые библиотеки: Type (VbaReferenceType), LibId
Document.RemoveMacros()Удаляет VBA-проект из документа

См. также:

 Русский