Public function vba: Оператор Function (VBA) | Microsoft Learn

Содержание

Процедуры типа Function. VBA для чайников

Процедуры типа Function. VBA для чайников

ВикиЧтение

VBA для чайников
Каммингс Стив

Содержание

Процедуры типа Function

Процедура типа Function, в принципе, работает так же, как и процедура типа Sub, но в данном случае ее главная задача — вычисление некоторого значения. Когда процедура типа Function завершит свою работу, она возвратит это значение в вызывающую процедуру, которая сможет использовать его в дальнейших вычислениях.

Вот пример процедуры типа Function:

Public Function ДеФункция(х As Integer, y As Integer )

Dim Z AS Integer

z = x + у

ДеФункция = x ? z

End Function

Очевидно, строение процедуры типа Function очень похоже на строение процедуры типа Sub. Объявление начинается с необязательного ключевою слова, определяющего область видимости процедуры (в данном случае это Public). Далее идет ключевое слово Function, определяющее тип процедуры, за ним размещается имя процедуры и, наконец, ее аргументы. Аргументы будут обсуждаться в разделе Привлекательные аргументы, но уже на этом примере вы видите, как они используются. Подобно процедуре типа Sub, в конце процедуры типа Function находится завершающий оператор End Function.


Здесь я вынужден сделать паузу, чтобы обратить ваше внимание на то, что VBA содержит немалое количество встроенных функций. Подобно процедурам типа Function, функции VBA возвращают в вызывающую процедуру некоторое значение. Вызываются функции и процедуры типа Function тоже одинаково.

Единственным различием между функциями и процедурами типа Function является то, что для функций вам не нужно печатать программный код! Обзор функций, доступных в VBA, вы найдете в главе 11.

Отличия процедур типа Function от процедур типа Sub

Между процедурами типа Function и типа Sub есть одно существенное отличие: в процедуре типа Function обязательно где-то должен присутствовать по крайней мере один оператор, задающий значение этой функции. При этом используется имя процедуры, как будто это обычная переменная. В предыдущем примере присвоение значения осуществляется в строке ДеФункция = х ? z. После того как программный код в этой строке будет выполнен, ДеФункция будет содержать значение, которое возвратится в вызывающую процедуру для дальнейшего использования там.

Объект Function

Объект Function
С помощью объекта Function можно манипулировать функцией как объектом. Этот объект содержит ряд специфичных методов и свойств (табл. 11.21 и 11.22).Таблица 11.21. Свойства объекта Function
Таблица 11.22. Методы объекта Function
Синтаксис определения объекта Function выглядит

function — Создает новую функцию

function — Создает новую функцию
functionОпределяет набор операторов, которые вы определили для выполнения определенной задачи. Вы можете декларировать (declare), или определить (define), функцию в том же месте, где вы ее вызываете, или в любом другом месте муви-клипа. При определении

EXTERNAL FUNCTION DIRECTORY

EXTERNAL FUNCTION DIRECTORY
Параметры в ibconfig
EXTERNAL_FUNCTION_DIRECTORY <quoted directory string>EXTERN

EnumObjects function EnumObjects(DC: HDC, ObjectType: Integer; ObjectFunc: TFarProc; Data:

EnumObjects function EnumObjects(DC: HDC, ObjectType: Integer; ObjectFunc: TFarProc; Data:
Pointer):Integer;Пеpечисляет типы объектов, возможные на устpойстве, пеpедавая функции обpатного вызова TLogPen или TLogBrush и Data. Пеpечисление заканчивается, если функция обpатного вызова возвpащает нуль или если пеpечислены все

2. Процедуры и функции для переменных строкового типа

2.  Процедуры и функции для переменных строкового типа
1. Function Copy(S: String; Index, Count: Integer): String;
Возвращает подстроку строки. S – выражение типа String.Index и Count – выражения целого типа. Функция возвращает строку, содержащую Count символов, начинающихся с позиции Index. Если Index больше, чем

Процедуры типа Sub

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

Элементы объявления процедуры типа Sub

Элементы объявления процедуры типа Sub
В операторе объявления процедуры первый термин Public определяет область видимости процедуры. Для области видимости можно указать либо Public, либо Private. При этом Public подразумевается по умолчанию, так что это ключевое слово можно

Отличия процедур типа Function от процедур типа Sub

Отличия процедур типа Function от процедур типа Sub
Между процедурами типа Function и типа Sub есть одно существенное отличие: в процедуре типа Function обязательно где-то должен присутствовать по крайней мере один оператор, задающий значение этой функции. При этом используется имя

Вызов процедур типа Function

Вызов процедур типа Function
Процедуру типа Function можно выполнить, только вызвав ее из другой процедуры.Как правило, это делается путем присваивания имени данной функции некоторой переменной. В следующем примере переменная ZСтепень получает значение, возвращенное

Реализация паттерна «Стратегия» посредством класса tr::function

Реализация паттерна «Стратегия» посредством класса tr::function
Если вы привыкли к шаблонам и их применению для построения неявных интерфейсов (см. правило 41), то применение указателей на функции покажется вам не слишком гибким решением. Почему вообще для вычисления

5.2.3. Синтаксис DROP PROCEDURE и DROP FUNCTION

5.2.3. Синтаксис DROP PROCEDURE и DROP FUNCTION
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_nameЭта инструкция используется, чтобы удалить сохраненную процедуру или функцию. То есть определенная подпрограмма будет удалена с сервера. Начиная с MySQL 5.0.3, Вы должны иметь привилегию ALTER ROUTINE для подпрограммы. Такая

Адаптеры функций (Function adaptors)

Адаптеры функций (Function adaptors)
Функциональные адаптеры работают только с классами функциональных объектов с определёнными типами параметров и типом

11. Строковый тип в Pascal. Процедуры и функции для переменных строкового типа

11.  Строковый тип в Pascal. Процедуры и функции для переменных строкового типа
Последовательность символов определенной длины называется строкой. Переменные строкового типа определяются путем указания имени переменной, зарезервированного слова string, и возможно, но не

Примеры как создать пользовательскую функцию в Excel

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

Пример создания своей пользовательской функции в Excel

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

  1. Открыть редактор языка VBA с помощью комбинации клавиш ALT+F11.
  2. В открывшемся окне выбрать пункт Insert и подпункт Module, как показано на рисунке:
  3. Новый модуль будет создан автоматически, при этом в основной части окна редактора появится окно для ввода кода:
  4. При необходимости можно изменить название модуля.
  5. В отличие от макросов, код которых должен находиться между операторами Sub и End Sub, пользовательские функции обозначают операторами Function и End Function соответственно. В состав пользовательской функции входят название (произвольное имя, отражающее ее суть), список параметров (аргументов) с объявлением их типов, если они требуются (некоторые могут не принимать аргументов), тип возвращаемого значения, тело функции (код, отражающий логику ее работы), а также оператор End Function. Пример простой пользовательской функции, возвращающей названия дня недели в зависимости от указанного номера, представлен на рисунке ниже:
  6. После ввода представленного выше кода необходимо нажать комбинацию клавиш Ctrl+S или специальный значок в левом верхнем углу редактора кода для сохранения.
  7. Чтобы воспользоваться созданной функцией, необходимо вернуться к табличному редактору Excel, установить курсор в любую ячейку и ввести название пользовательской функции после символа «=»:

Встроенные функции Excel содержат пояснения как возвращаемого результата, так и аргументов, которые они принимают. Это можно увидеть на примере любой функции нажав комбинацию горячих клавиш SHIFT+F3. Но наша функция пока еще не имеет формы.

Чтобы задокументировать пользовательскую функцию, необходимо выполнить следующие действия:

  1. Создайте новый макрос (нажмите комбинацию клавиш Alt+F8), в появившемся окне введите произвольное название нового макроса, нажмите кнопку Создать:
  2. В результате будет создан новый модуль с заготовкой, ограниченной операторами Sub и End Sub.
  3. Введите код, как показано на рисунке ниже, указав требуемое количество переменных (в зависимости от числа аргументов пользовательской функции):
  4. В качестве «Macro» должна быть передана текстовая строка с названием пользовательской функции, в качестве «Description» — переменная типа String с текстом описания возвращаемого значения, в качестве «ArgumentDescriptions» — массив переменных типа String с текстами описаний аргументов пользовательской функции.
  5. Для создания описания пользовательской функции достаточно один раз выполнить созданный выше модуль. Теперь при вызове пользовательской функции (или SHIFT+F3) отображается описание возвращаемого результата и переменной:

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



Примеры использования пользовательских функций, которых нет в Excel

Пример 1. Рассчитать сумму отпускных для каждого работника, проработавшего на предприятии не менее 12 месяцев, на основе суммы общей заработной платы и числа выходных дней в году.

Вид исходной таблицы данных:

Каждому работнику полагается 24 выходных дня с выплатой S=N*24/(365-n), где:

  • N – суммарная зарплата за год;
  • n – число праздничных дней в году.

Создадим пользовательскую функцию для расчета на основе данной формулы:

Код примера:


Public Function Otpusknye(summZp As Long, holidays As Long) As Long
If IsNumeric(holidays) = False Or IsNumeric(summZp) = False Then
    Otpusknye = "Введены нечисловые данные"
    Exit Function
ElseIf holidays <= 0 Or summZp <= 0 Then
    Otpusknye = "Отрицательное число или 0"
    Exit Function
Else
    Otpusknye = summZp * 24 / (365 - holidays)
End If
End Function

Сохраним функцию и выполним расчет с ее использованием:

=Otpusknye(B3;C3)

Растянем формулу на остальные ячейки с целью получения результатов для остальных работников:

Калькулятор расчета калорий в Excel

Пример 2. Рассчитать суточную норму калорий для участников программы похудения, среди которых есть как женщины, так и мужчины определенного возраста с известными показателями роста и веса.

Вид исходной таблицы данных:

Для расчета используем формулу Миффлина — Сан Жеора, которую запишем в коде пользовательской функции с учетом пола участника. Код примера:


Public Function CaloriesPerDay(sex As String, age As Integer, weight As Integer, height As Integer) As Integer
If sex = "женский" Then
    CaloriesPerDay = 10 * weight + 6.25 * height - 5 * age - 161
ElseIf sex = "мужской" Then
    CaloriesPerDay = 10 * weight + 6.25 * height - 5 * age + 5
Else: CaloriesPerDay = 0
End If
End Function

Проверки корректности введенных данных упущены для упрощения кода. Если пол не определен, функция вернет результат 0 (нуль).

Пример расчета для первого участника:

=CaloriesPerDay(B3;C3;D3;E3)

В результате использования автозаполнения получим следующие результаты:

Пользовательская функция для решения квадратных уравнений в Excel

Пример 3. 2 — 4 * a * c)) / (2 * a) & «)»
Else:
    SquareEquation = «Решений нет»
End If
End Function

Найдем корни первого уравнения:

=SquareEquation(A3;B3;C3)

Выполним расчеты для остальных уравнений. Полученные результаты:

Скачать примеры создания пользовательский функций в Excel

Мы создали свою пользовательскую функцию для расчета квадратных уравнений, которой раньше не было в Excel по умолчанию.

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

В этой статье

  • Публичные и частные подпроцедуры
    • Окно макросов Excel
  • Процедуры с аргументами
  • Использование процедур между модулями VBA 5 Модули
  • Доступ к приватной процедуре из другого модуля

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

Общедоступные и частные подпроцедуры

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

Открытые функции можно вызывать так же, как и встроенные функции Excel на листе Excel.

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

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

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

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

 Общедоступная подпрограмма HelloWorld()
   MsgBox "Привет, мир"
End Sub 

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

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

 Private Sub HelloEveryone()
MsgBox "Всем привет"
End Sub 

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

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

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

 Sub Hello (strName как строка)
   MsgBox "Привет" и имя_улицы
End Sub 

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

 

Модуль 2 — это частный модуль с общедоступной подпроцедурой , а Модуль 3 — общедоступный модуль с частной подпроцедурой .

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

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

Код также может выглядеть следующим образом:

 Sub CallHelloFromPrivate()
'вызов сабвуфера из частного модуля
   Привет, мир
End Sub 

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

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

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

 Дополнительный вызов Доброе утро ()
'запустить приватную подпрограмму из публичного модуля
  Application.Run ("Доброе утро, мир")
End Sub 

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

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

 

Кодирование VBA стало проще

Прекратите искать код VBA в Интернете. Узнайте больше об AutoMacro — конструкторе кода VBA, который позволяет новичкам создавать процедуры с нуля с минимальными знаниями в области программирования и множеством функций, позволяющих сэкономить время для всех пользователей!

Узнайте больше!

Частные и общедоступные подпрограммы, переменные и функции в VBA

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

В качестве простой аналогии — в социальных сетях вы можете настроить части своего профиля так, чтобы его могли видеть все (общедоступные) или только те, кому вы разрешаете, например друзья или подписчики, видеть его (частные). Концепция Private vs. Public в VBA аналогична, но, поскольку мы говорим здесь о VBA, все не так просто.

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

Содержимое

Модули

Модули — это место, где записывается и хранится код VBA. В Excel есть много разных типов модулей, и мы используем каждый модуль для разных целей.

Модули рабочего листа

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

На приведенном выше снимке экрана код VBA содержится в модуле рабочего листа Sheet1. Поскольку мы использовали событие Worksheet_Activate, код срабатывает только при активации Sheet1. Любой код, основанный на событии (например, активация рабочего листа) в модуле рабочего листа, применяется только к рабочему листу, в котором хранится код.

Модуль рабочей книги

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

На снимке экрана выше мы использовали событие Workbook_Open. Поэтому код VBA будет выполняться при открытии книги. Каждая рабочая книга имеет свой модуль.

Модуль пользовательской формы

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

На приведенном выше снимке экрана код VBA запускается, когда пользователь щелкает CommandButton1 в пользовательской форме.

Стандартные модули

Стандартные модули не связаны с какими-либо конкретными объектами и не имеют связанных с ними событий. Поэтому стандартные модули не запускаются взаимодействием с пользователем. Если мы полагаемся на инициированные события, нам нужны модули Workbook, Worksheet или UserForm для отслеживания события. Однако это событие может вызвать макрос в стандартном модуле.

СОВЕТ: Узнайте, как запустить макрос из другого макроса здесь: Запуск макроса из макроса (из другой книги)

На приведенном выше снимке экрана показан код, который защищает ActiveSheet паролем, независимо от того, какая книга или рабочий лист.

Другие типы модулей

Последний доступный тип модуля VBA — это модуль класса. Они предназначены для создания пользовательских объектов и работают совсем иначе, чем другие типы модулей. Модули классов выходят за рамки этого поста.

Публичный и частный

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

Объявление частной подпрограммы или функции

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

 Private Sub nameOfSub() 
 Private Function nameOfFunction() 

Объявление общедоступной подпрограммы или функции

Чтобы рассматривать подпрограмму или функцию как общедоступную, мы можем использовать ключевое слово Public. Однако, если слово Public или Private исключено, VBA обрабатывает подпрограмму/функцию, как если бы она была общедоступной. В результате все нижеследующие являются общедоступными, хотя не все они включают ключевое слово.

 Общедоступная подпрограмма nameOfSub()
Sub nameOfSub() 
 Публичная функция nameOfFunction()
Function nameOfFunction() 

Давайте рассмотрим подпрограммы и функции немного подробнее

Подпроцедуры (подпрограммы)

Размышляя о разнице между общедоступной подпрограммой и частной подпрограммой, необходимо учитывать два основных момента:

  • Выполнение мы хотим, чтобы макрос отображался в списке доступных макросов в окне макросов Excel?
  • Хотим ли мы, чтобы макрос запускался из другого макроса?
Появляется ли он в окне макросов?

Одной из наиболее важных особенностей частных подписок является то, что они не отображаются в окне макросов Excel.

Предположим, что Module1 содержит два следующих макроса:

 Private Sub NotVisible()
MsgBox "Это частная подписка"
End Sub 
 Public Sub IAmVisible()
MsgBox "Это общедоступная подписка"
End Sub 

В диалоговом окне Macro отображается только Public sub.

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

Можно ли запустить код из другого макроса?

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

Используя простой пример, вот приватная подпрограмма в Module1:

 Приватная подпрограмма ShowMessage()
MsgBox "Это частная подписка"
End Sub 

Теперь попробуем вызвать макрос ShowMessage из Module2.

 Sub CallAPrivateMacro()
Вызов ПоказатьСообщение
End Sub 

Running CallAPrivateMacro генерирует ошибку, так как два макроса находятся в разных модулях.

Если бы макрос ShowMessage в Module1 был Public Sub, он выполнялся бы правильно.

Существует много способов запустить макрос из другого макроса. Один из таких методов позволяет нам запускать Private Sub из другого модуля. Если мы воспользуемся командой Application.Run , она успешно запустит частную подпрограмму. Давайте изменим код в Module2, включив в него Application.Run команда:

 Sub CallAPrivateMacro()
Application.Run "ShowMessage"
End Sub 

Вместо ошибки приведенный выше код выполнит макрос ShowMessage.

Работа с объектно-ориентированными событиями модуля

Excel по умолчанию создает события Worksheet, Workbook и UserForm Module как Private, но это не обязательно. Если их изменить на общедоступные, их можно будет вызывать из других модулей. Давайте посмотрим на пример.

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

 Общедоступная подсистема Workbook_Open()
MsgBox "Книга открыта"
End Sub 

Мы можем вызвать это из другого макроса, используя имя объекта, за которым следует имя Public sub.

 Подпрограмма RunWorkbook_Open()
Вызовите ThisWorkbook.Workbook_Open
End Sub 

Это означает, что мы можем запускать событие Workbook_Open всякий раз, когда нам нужно. Если подпрограмма в модуле рабочей книги является частной, мы все равно можем использовать метод Application.Run, указанный выше.

Функции

Функции VBA используются для возврата рассчитанных значений. У них есть два основных применения:

  • Для вычисления значения в ячейке на листе (известной как пользовательские функции)
  • Для вычисления значения в коде VBA

Подобно подпрограммам, функции, созданные без объявления Private или Public, рассматриваются как общедоступные.

Вычисление значений на листе (определяемые пользователем функции)

Определяемые пользователем функции — это формулы рабочего листа, которые работают аналогично другим функциям Excel, таким как СУММЕСЛИМН или XLOOKUP.

Следующие фрагменты кода включены в Module1:

 Открытая функция IAmVisible (myText как строка)
IAmVisible = мой текст
Завершить функцию 
 Частная функция NotVisible (myText As String)
Невидимый = мой текст
End Function 

Если мы посмотрим на диалоговое окно Insert Function , функция IAmVisible доступна как функция рабочего листа.

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

Функция в коде VBA

Функции, используемые в коде VBA, работают так же, как подпрограммы; Частные функции должны быть видны только внутри одного и того же модуля. И снова мы можем вернуться к команде Application.Run, чтобы использовать функцию Private из другого модуля.

Предположим, что в Module2 был введен следующий код:

 Sub CallAPrivateFunction()
MsgBox Application.Run("NotVisible", "Это частная функция")
End Sub 

Приведенный выше код с радостью вызовет частную функцию NotVisible из Module1.

Переменные

Переменные содержат значения или ссылки на объекты, которые изменяются во время выполнения макроса. Переменные бывают трех видов: Public, Private и Dim.

Общедоступные переменные

Общедоступные переменные должны быть объявлены в верхней части модуля кода, непосредственно после оператора Option Explicit (если он у вас есть) и перед любыми подпрограммами или функциями.

Следующее неверно и приведет к ошибке, если мы попытаемся использовать общедоступную переменную.

 Явный параметр
Sub Что-тоЕщеВверху()
MsgBox "Общая переменная не первая"
Конец сабвуфера
Public myPublicMessage As String 

Правильный подход: (переменная Public объявляется перед любыми подпрограммами или функциями):

 Option Explicit
Public myPublicMessage As String
Подпрограмма SomethingAfterPrivateVariables()
MsgBox "Публичная переменная первая"
End Sub 

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

 Sub UsePublicVariable()
myPublicMessage = "Это общедоступно"
MsgBox моеобщее сообщение
End Sub 

Частные переменные

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

Ниже показано приемлемое использование частной переменной.

Модуль 1:

 Опция Явный
Частный myPrivateMessage как строка
Подпрограмма UsePrivateVariable()
myPrivateMessage = "Это личное"
MsgBox мое личное сообщение
Конец суб 

Dim Variables

Большинство из нас учится создавать переменные, используя слово Dim . Однако переменные Dim ведут себя по-разному в зависимости от того, как они объявлены.

Переменные Dim, объявленные внутри подпрограммы или функции, могут использоваться только внутри этой подпрограммы или функции. В приведенном ниже примере Dim был объявлен внутри подпрограммы с именем CreateDim , но используется в подсистеме под названием UseDim . Если мы запустим код UseDim , он не сможет найти переменную Dim и выдаст ошибку.

 Sub CreateDim()
Dim myDimMessage
End Sub 
 Sub UseDim()
myDimMessage = "Затемнение внутри сабвуфера"
MsgBox myDimMessage
End Sub 

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

 Явный параметр
Dim myDimMessage
Sub UseDim()
myDimMessage = "Затемнение внутри сабвуфера"
MsgBox myDimMessage
End Sub 

Имеет ли это значение?

Вы можете подумать, что проще создать все как общедоступное; тогда его можно использовать где угодно. Логичный, но опасный вывод. Гораздо лучше контролировать все участки кода. Спросите себя, если бы кто-то использовал ваш макрос из окна макросов Excel, должен ли он работать? Или, если кто-то запустил вашу функцию как пользовательскую функцию, она должна работать? Ответы на эти вопросы являются хорошим руководящим принципом, помогающим выбрать между публичным и частным.

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


Об авторе

Привет, меня зовут Марк, и я запускаю Excel Off The Grid.

Мои родители рассказали мне, что в возрасте 7 лет я объявил, что стану квалифицированным бухгалтером. Либо я был экстрасенсом, либо у меня не было воображения, как это и произошло. Однако мое путешествие по-настоящему началось только в 35 лет.

В 2015 году я устроился на новую работу, на которой регулярно работал после 22:00. В результате я редко видел своих детей в течение недели. Итак, я начал искать секреты автоматизации Excel. Я обнаружил, что, создав небольшое количество простых инструментов, я могу комбинировать их по-разному, чтобы автоматизировать почти все свои обычные задачи. Это означало, что я мог работать меньше часов (и мне повысили зарплату!). Сегодня я обучаю этим техникам других специалистов в рамках нашей программы обучения, чтобы они тоже могли проводить меньше времени на работе (и больше времени со своими детьми и любимыми делами).


Вам нужна помощь в адаптации этого поста к вашим потребностям?

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

Но если вы все еще испытываете трудности, вам следует:

  1. Почитайте другие блоги или посмотрите видео на YouTube по той же теме. Вы получите гораздо больше пользы, открыв для себя собственные решения.
  2. Спросите «Excel Ninja» в вашем офисе. Удивительно, какие вещи знают другие люди.
  3. Задайте вопрос на форуме, таком как Mr Excel, или в сообществе Microsoft Answers. Помните, что люди на этих форумах обычно отдают свое время бесплатно. Поэтому постарайтесь сформулировать свой вопрос, убедитесь, что он четкий и лаконичный.