Проекты 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 |
Ожидается, что макросы запустятся после редактирования SourceCode | Aspose.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.VbaProject | VbaProject документа, либо null, если в нём нет макросов |
Document.HasMacros | Присутствует ли проект VBA |
VbaProject | Name, Modules, References, CodePage, IsSigned, IsProtected |
VbaModule | Один модуль: Name, Type (VbaModuleType), записываемый SourceCode |
VbaModuleCollection | Add(), индексатор по имени, Remove(), Count |
VbaReference / VbaReferenceCollection | Ссылки на типовые библиотеки: Type (VbaReferenceType), LibId |
Document.RemoveMacros() | Удаляет VBA-проект из документа |