Как можно вызвать скрытый макрос из другого модуля с использованием VBA?

Как можно обратиться к скрытому макросу через Private из других модулей?
  • 28 января 2024 г. 6:48
Ответы на вопрос 2
В VBA понятие "скрытый макрос" обычно означает макрос, объявленный с ключевым словом `Private`. Ключевое слово `Private` при объявлении процедуры или функции в модуле делает этот макрос доступным только в рамках этого модуля. Однако, даже если макрос помечен как `Private`, есть способы вызвать его из другого модуля.

Один из подходов — создать публичную оболочку для приватной процедуры. Например, у вас есть следующая приватная процедура в Module1:

```vb
' Module1
Private Sub PrivateSub()
    MsgBox "Это скрытая процедура."
End Sub
```

Вы не можете вызвать `PrivateSub` непосредственно из другого модуля, но вы можете создать публичную процедуру-оболочку, которая будет вызывать `PrivateSub`:

```vb
' Module1
Public Sub PublicWrapper()
    Call PrivateSub
End Sub
```

Теперь вы можете вызвать `PublicWrapper` из любого места в вашем проекте VBA, и она, в свою очередь, вызовет `PrivateSub`.

Еще один способ - использование Application.Run. Этот метод позволяет вызвать процедуры по имени, представленному в виде строки, даже если они Private, но для этого необходимо знать точное имя процедуры, что нарушает инкапсуляцию:

```vb
' Вызов из другого модуля
Sub CallPrivateSub()
    Application.Run "Module1.PrivateSub"
End Sub
```

Тем не менее, следует соблюдать осторожность при использовании такого подхода, так как это не лучшая практика с точки зрения структуры кода и поддерживаемости.

В зависимости от версии Excel и настроек безопасности Application.Run может не позволять вызывать приватные методы. Если это так и вы не можете использовать первый способ с оболочкой из-за определенных обстоятельств, то вам стоит пересмотреть архитектуру вашего проекта так, чтобы не было необходимости вызывать приватные процедуры из других модулей.

Обычно проектирование кода ведётся таким образом, чтобы избежать необходимости вызовов приватных методов извне, поскольку это нарушает инкапсуляцию и принципы модульности. Если вам необходим доступ к функциональности приватного метода, стоит подумать о передаче части кода в отдельный модуль или класс с публичными методами, которые можно безопасно вызывать из других частей вашего проекта.
Кажется, простейшим решением было бы вынести Ваш макрос в аддон и запаролить его. Тогда точно не удалят и не изменят и виден будет.
Похожие вопросы