Частные и публичные процедуры VBA (подпрограммы и функции)

В этом руководстве объясняется разница между публичными и частными объявлениями в VBA и как указать модули как частные.

Государственные и частные подпроцедуры

Процедуры (подпрограммы и функции) могут быть объявлены частными или общедоступными в VBA. Если они являются общедоступными, это означает, что вы сможете увидеть их из окна макросов Excel, и их можно будет вызывать из любого места в вашем проекте VBA. Если они являются частными, они не отображаются в окне макросов Excel и доступны для использования только в том модуле, в котором они объявлены (с помощью обычных методов, способы доступа к частным процедурам из других модулей см. В нижней части этой статьи) .

Общедоступные функции могут вызываться как встроенные функции Excel на листе Excel.

Примечание: Переменные и константы также могут быть общедоступными или частными.

Окно макросов Excel

По умолчанию макросы Excel (большинство процедур VBA) видны пользователям книги в окне макросов:

Они считаются Общественные процедуры. Вы можете явно определить процедуры как общедоступные, добавив «Public» перед оператором Sub:

123 Публичная подписка HelloWorld ()MsgBox "Hello World"Конец подписки

Если вы не определите процедуру как общедоступную, она будет считаться общедоступной.

Чтобы объявить процедуру частной, просто добавьте «Private» перед подвыражением процедуры:

123 Частная подписка HelloEveryone ()MsgBox «Всем привет»Конец подписки

Вторая процедура не будет видна в окне макросов для пользователей Excel, но все же может использоваться в вашем коде VBA.

Процедуры с аргументами

Подпроцедуры могут иметь аргументы. Аргументы являются входными данными для подпроцедуры:

123 Sub Hello (strName как строка)MsgBox "Hello" & strNameКонец подписки

Если у подпроцедуры есть аргументы, она никогда не появится в окне макроса, независимо от того, объявлена ​​ли она общедоступной, потому что нет способа объявить аргументы.

Функции также никогда не появятся в окне макросов, даже если они объявлены общедоступными.

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

Программирование на VBA | Генератор кода действительно работает для вас!

Использование процедур между модулями в вашем проекте VBA

Общедоступные процедуры можно вызывать из любого модуля или формы в вашем проекте VBA.

Попытка вызвать частную процедуру из другого модуля приведет к ошибке (Примечание: временное решение см. В нижней части этой статьи).

Примечание: Общедоступные процедуры и переменные в модулях классов ведут себя немного иначе и выходят за рамки этой статьи.

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

Если две или более процедуры имеют одинаковое имя и объявлены общедоступными, при запуске кода вы получите ошибку компиляции «Обнаружено неоднозначное имя».

Частные модули

По умолчанию модули являются общедоступными.

Чтобы сделать модуль частным, вы помещаете следующее ключевое слово вверху модуля.

1 Дополнительный частный модуль

Если вы объявите модуль как частный, то никакие процедуры в модуле не будут видны пользователям Excel. Функциональные процедуры не будут отображаться в окне «Вставить функцию», но их можно будет использовать на листе Excel, если пользователю известно имя функции!

Подпроцедуры не появятся в окне макросов, но по-прежнему будут доступны для использования в проекте VBA.

Доступ к частной процедуре из другого модуля

Как упоминалось выше, частные процедуры недоступны в других модулях кода «обычными» методами. Однако вы можете получить доступ к частным процедурам, используя Application.Run команда доступна в VBA.

Рассмотрим следующие 3 модуля.

Модуль 2 - это Частный Модуль с Общественные Подпроцедура, тогда как Module3 Общественные модуль с Частный Дополнительная процедура.

В Module1 мы можем вызвать Hello World - Дополнительный частный модуль вверху не мешает нам вызывать подпроцедуру - все, что он служит, это скрыть подпроцедуру в окне макроса.

Нам также не нужен оператор Call - он нужен для облегчения чтения кода.

Код также может выглядеть так:

1234 Дополнительный вызовHelloFromPrivate ()'вызов субподрядчика из частного модуляПривет, мирКонец подписки

Мы также можем запустить подпроцедуру HelloWorld с помощью VBA Application.Run команда.

Однако в Module3 процедура GoodMorningWorld была объявлена ​​частной. Вы не можете вызвать его из другого модуля, используя «обычные» средства, то есть оператор Call.

Вы должны использовать Application.RunCommand для запуска Private Sub из другого модуля.

1234 Sub CallGoodMorning ()'запустить частную подписку из общедоступного модуляApplication.Run ("GoodMorningWorld")Конец подписки

Обратите внимание, когда вы используете Application.RunCommand , вы должны поместить имя подпроцедуры в кавычки.

Если мы попытаемся использовать оператор Call для запуска подпроцедуры GoodMorningWorld, возникнет ошибка.

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave