Удалите плохой код VBA из файла Visio после его выбора, но до его открытия - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть набор файлов чертежей Visio, которые содержат код VBA, который больше не нужен (фактически, возникают ошибки при попытке открыть файл, поскольку модуль, на который есть ссылка в VBA, больше не существует).

Из-за характера надстройки, над которой я работаю, мои пользователи должны поддерживать макросы и VBA включенными. Однако любой файл, который они открывают в Visio, должен сначала автоматически удалить код VBA.

Я могу достичь точки останова в моем коде при запуске приложения Visio, но до выбора файла для открытия. Я также могу достичь точки останова в моем коде после того, как файл выбран и загружен в Visio. Кажется, я не могу найти способ сделать перерыв после выбора файла, но до того, как Visio загрузит его.

Глядя на сборки Visio Interop в C#, я вижу события Visio.Application с именами «OnDocumentOpened» и «OnDocumentCreated», но они не запускаются до «после» загрузки файла. К сожалению, я не смог найти ничего под названием «BeforeDocumentOpened» или «BeforeDocumentCreated», что в основном именно то, что мне нужно. Существуют другие события с похожими именами, например «BeforeDocumentSave» и «BeforeDocumentClose», но, очевидно, они не то, что я ищу.

Любая помощь будет принята с благодарностью.

Мой вопрос: есть ли какие-либо методы для захвата, когда Visio пытается открыть файл чертежа, но до его фактического открытия? Здесь я собираюсь удалить код VBA из файла, который я уже реализовал. Если нет, то есть ли какие-нибудь известные обходные пути для достижения чего-то подобного?

Пример плохого VBA, который я хочу удалить:

Private Sub Document_DocumentCreated(ByVal doc As Visio.Document)
    Call Initialize(doc)
End Sub

Private Sub Document_DocumentOpened(ByVal doc As Visio.Document)
    Call Initialize(doc)
End Sub

Private Sub Initialize(doc As Visio.Document)
    Dim myLib As Object
    Set myLib = CreateObject("MODULE_NAME") 'Errors here, since we got rid of the module
    ...
End Sub

Ответы [ 2 ]

2 голосов
/ 29 февраля 2020

Я бы не переусердствовал. Вы можете обновить своих пользователей. Например, предоставить скрипт (или какую-то функциональность в установщике, или какую-нибудь кнопку в приложении) для обновления диаграмм. Т.е. отдельная функция, просто не делайте этого при открытии диаграммы. Поскольку это однократная операция, пользователи, вероятно, не будут плакать об этом. И вы не добавите в приложение одноразовый «мусорный» код ...

Просто для ясности: искомого события "до открытия документа" не существует.

1 голос
/ 12 марта 2020

Еще один совет, касающийся макросов VBA в Visio: поместите код в трафарет. Когда у вас есть код на чертежах, он распространяется на каждый чертеж, который создается. Если вам нужно изменить код, то вам нужно найти все чертежи и изменить весь код.

Вместо этого вы можете поместить макросы в трафарет. Трафарет можно поместить в папку «Избранное» пользователя, поэтому он будет легко доступен из любого чертежа («Фигуры»> «Другие фигуры»> «Мои фигуры»> «Избранное», обычно на панели, закрепленной слева).

Трафарет не должен содержать никаких мастер-форм, он может просто служить «библиотекой кода», которую пользователи могут загрузить для любого чертежа. Но это отдельный файл. Если вам нужно обновить макросы, вы можете распространить новый трафарет и попросить пользователей перезаписать старый.

Теперь все ваши файлы чертежей будут свободны от кода, и вам не придется обновлять потенциально тысячи проектов VBA каждый раз, когда требуется внести изменения.

...