public sub vba что значит
VBA-Урок 9. Процедуры и функции
Чтобы сделать процедуру доступной только в определенном модуле, используется ключевое слово Private:
Запуск процедуры с середины другой процедуры
Чтобы выполнить процедуру с середины другой процедуры, просто введите ее название.
Здесь есть очень простой пример:
Аргументы
Аргументы делают возможным использование значений из процедуры в под-процедуры (запомните, что по умолчанию, переменные являются доступны только по той процедуры, в которой они были объявлены).
К процедуре «warning» был добавлен аргумент, в данном случае это переменная «var_text» с типом «String» (строка):
Эта процедура требует аргумент, поэтому мы должны поставить значение после «warning», чтобы выполнить ее:
Когда мы хотим прописать несколько аргументов, тогда они должны быть отделены запятыми.
Необязательные аргументы
По умолчанию, если процедура имеет аргументы, то они должны быть обязательно проставлены, и если они не проставлены, тогда процедура не выполнится.
Теперь эта процедура может быть выполнена с или без опционального аргумента, как здесь:
Аргументы должны быть введены в правильном порядке.
Здесь есть пример, который использует два фрагмента кода, которые рассматривались выше:
См. рисунок ниже (пример 1):
Чтобы стало понятнее, ниже есть пример того, что произойдет, если макрос будет запущен на выполнение:
Ниже вы можете увидеть как предыдущий код и ByVal работают:
Функции
Основным отличием между процедурой и функцией является то, что функция возвращает значение.
Вот простой пример:
Функция может быть использована на рабочем листе, подобно любой другой функции в Excel.
Например, чтобы получить квадрат значения, которое введенное в ячейку A1:
VBA SUB
Подфункция VBA
Подпроцедура обычно принимает аргументы или код (то есть переменные, константы или выражения, которые передаются вызывающей процедурой), которые выполняются для выполнения конкретной задачи. Оператор Sub содержит пустой набор скобок () без аргументов.
Давайте посмотрим, как писать подпроцедуры в Excel VBA?
Базовая структура VBA Sub
Sub (подпроцедура или название задачи) ()
(Какую задачу нужно выполнить?)
End Sub
Примечание: Sub может принимать только аргументы, они не возвращают результаты
Различные типы подпрограмм в VBA (модификаторы доступа)
Как использовать подфункцию в Excel VBA?
Ниже приведены различные примеры использования Sub Function в Excel с использованием кода VBA.
Шаг 1. На вкладке « Разработчик » щелкните Visual Basic в группе « Код » или используйте сочетание клавиш Alt + F11.
Шаг 2: Теперь вы можете создать пустой модуль, т.е. щелкнуть правой кнопкой мыши на Sheet1 (VBA_SUB), появятся различные опции, в этом выберите « Вставить» и под вставкой появятся три опции, где вам нужно выбрать « Модуль», будет создан пустой модуль., Вы можете переименовать его как «VBA_SUB» в окне раздела свойств
Шаг 3. Начните с подпроцедуры следующим образом и создайте код VBA_SUB
Шаг 4: Как только вы начнете вводить диапазон, его аргумент появится в скобках и щелкните по клавише табуляции, чтобы выбрать его. Как только вы оставите пробел и введете открытую скобку «(», появится аргумент CELLS, где вам нужно ввести синтаксис или аргумент для функции диапазона, то есть «E5»
Предположим, я хочу, чтобы SUBROUTINE появился в ячейке «E5». Для этого мне нужно набрать = «SUBROUTINE» после функции диапазона. и затем нажмите ввод.
Шаг 1: Начните с Sub, и теперь мы увидим, как мы можем вызвать функцию, используя MsgBox.
Шаг 2. Предположим, что при запуске вышеупомянутого кода в модуле VBA_SUB он сработает, но при попытке скопировать и запустить его в другом модуле, т.е. запустить этот код во вновь созданном модуле 1 листа 2 или 3, всплывающее сообщение не появится.
Шаг 1: Доступ к публичным подпроцедурам возможен из другого модуля, давайте посмотрим, как он работает.
Шаг 2: Когда я запускаю вышеупомянутый код (Public sub task_1 ) в модуле VBA_SUB, он возвращает значение или результат, то есть текстовую строку «PUBLIC SUBROUTINE» в ячейке «H7» sheet1
Предположим, я хочу запустить этот же код во вновь созданном модуле, например, PUBLIC_SUB, тогда нет необходимости писать весь код в этом модуле, просто вы упоминаете имя макроса, то есть вызов task_1, вместо функции range во второй строке кода., вы получите тот же вывод или результат, то есть текстовую строку «ОБЩЕСТВЕННЫЙ ПОДРАТИН» в ячейке «Н7» листа2.
Сохраните вашу книгу как «Excel с поддержкой макросов». Когда вы снова откроете этот файл Excel, вы можете использовать нижеприведенную комбинацию клавиш, т.е.
То, что нужно запомнить
Рекомендуемые статьи
Public sub vba что значит
6. СОЗДАНИЕ ПОВТОРНО ИСПОЛЬЗУЕМОГО КОДА
6.1. Процедуры и функции
Visual Basic – процедурный язык программирования. Это означает, что в нем можно создавать блоки программного кода, на которые можно впоследствии ссылаться по их имени. После того как блок кода получит имя, он может быть вызван и выполнен. Маленькие программы, «живущие» в больших программах, называются функциями, если они возвращают какое-либо значение, и процедурами, если они значений не возвращают, и объединенными общим термином подпрограмма. Они делают процесс программирования более простым и быстрым, а создаваемый код – более надежным.
Разработки собственных процедур и функций – первый шаг к разработке инкапсулированного и повторно используемого кода. Под инкапсуляцией понимают сокрытие реализации свойств и методов объекта за его внешним интерфейсом.
Следует, однако, различать собственно процедуры и процедуры обработки событий. Первые содержат код, необходимый для многократного выполнения в разных программных блоках, а вторые всегда являются реакцией на события, происходящие в приложении.
Синтаксис объявления простой процедуры следующий:
[Private|Public] Sub SubName()
· SubName() – имя, присваиваемое процедуре.
Существует два способа добавить процедуру в программный код проекта:
· Написание кода в разделе General формы или модуля.
· Использование диалогового окна « Add Procedure »:
1) из меню « Tool » выберете пункт « Add Procedure », для открытия соответствующего диалогового окна;
Рис. 3. Диалоговое окно « Add Procedure »
2) введите имя процедуры в поле Name и щелкните по кнопке «Ok», чтобы добавить ее заготовку в форму или модуль;
3) после создания блока процедуры в него необходимо добавить нужный фрагмент кода.
Нельзя вводить код после ключевых слов « End Sub », поскольку это приведет к ошибке при компиляции программы.
Отличие процедуры от функции состоит лишь в том, что она всегда возвращает некоторое значение. Синтаксис функции указан ниже :
[Private|Public] Function FunctionName() As DataType
· FunctionName() – имя, присваиваемое функции.
· DataType – тип данных возвращаемого значения.
· ReturnValue – собственно возвращаемое значение, присваиваемое имени функции (только один раз!).
Добавить в проект функцию можно теми же способами, которыми пользуются для процедуры. При использовании диалога « Add Procedure » переключатель « Type » устанавливают в положение « Function » (см. рис. 3).
6.2. Передача аргументов в процедурах и функциях
Public Sub SubName(NumOne As DataType, NumTwo As DataType)
Использование аргументов в процедурах и функциях делает код более универсальным.
При использовании процедур и функций очень важно, чтобы передаваемые значения соответствовали типам данных аргументов и их порядку. Тем не менее, аргумент можно сделать необязательным, если поместить ключевое слово « Optional » перед его описанием в операторе объявления. Все аргументы, описанные после этого ключевого слова, также будут необязательными и все они должны иметь тип « Variant »:
Public Sub SubName(NumOne As DataType, Optional NumTwo)
Для облегчения передачи в подпрограмму аргументов их можно именовать. Именованный аргумент – это буквальное имя аргумента в подпрограмме. Чтобы передать в нее значения, нужно использовать имена аргументов и присвоить им значения с помощью символов «:=». Для процедуры :
Public Sub SubName(NumOne As Integer, NumTwo As String)
ее вызов с применением именованных аргументов выглядит следующим образом:
SubName ( NumTwo :=3, NumOne :=4)
Именованные аргументы можно указывать в произвольном порядке. Его соблюдение в данном случае необязательно.
При работе с аргументами можно использовать два необязательных ключевых слова: « ByVal » и « ByRef », записываемых для каждого параметра.
Ключевое слово « ByVal » предусматривает, что в аргумент может быть передано только одно конкретное значение (число, строка, но не массив!), при этом соответствие типов не является жестким и находится в рамках автоматического их преобразования.
Ключевое слово « ByRef » означает, что в аргумент может быть передан любой объект Visual Basic (числа, строки, массивы, классы и др.). Соответствие типа в этом случае является обязательным. Другой его особенностью является то, что возможна обратная связь при вызове подпрограммы: при изменении значения аргументов происходит соответствующее изменение переменных указанных в ее вызове.
При отсутствии ключевых слов « ByVal » и « ByRef » в описании аргументов подпрограммы всегда будет подразумеваться слово « ByRef ».
Иногда возникает необходимость досрочного выхода из процедуры или из функции, не дожидаясь ее окончания. Для этого пользуются операторами Exit :
При работе с процедурами и функциями важно помнить об областях видимости переменных. Они полностью подчиняются выше приведенным характеристикам из п. 2.1.
В целом смысл применения процедур и функции в программном коде приложения имеет два основных преимущества:
· Вызов одной и той же подпрограммы удовлетворяет множество запросов из разных частей программы.
· Чтобы каким-то образом усовершенствовать вычисления, не придется просматривать весь программный код. Достаточно лишь изменить его фрагмент внутри блока данной подпрограммы.
· Внутренние структуры подпрограммы можно сделать полностью локальными, не влияющими на остальную часть программного кода (инкапсуляция).
Контрольные вопросы для самопроверки
Процедуры «Function» и «Sub» в VBA
Встроенные функции VBA
Перед тем, как приступить к созданию собственных функций VBA, полезно знать, что Excel VBA располагает обширной коллекцией готовых встроенных функций, которые можно использовать при написании кода.
Список этих функций можно посмотреть в редакторе VBA:
Кроме того, полный список встроенных функций VBA с примерами можно найти на сайте Visual Basic Developer Centre.
Пользовательские процедуры «Function» и «Sub» в VBA
В Excel Visual Basic набор команд, выполняющий определённую задачу, помещается в процедуру Function (Функция) или Sub (Подпрограмма). Главное отличие между процедурами Function и Sub состоит в том, что процедура Function возвращает результат, процедура Sub – нет.
Поэтому, если требуется выполнить действия и получить какой-то результат (например, просуммировать несколько чисел), то обычно используется процедура Function, а для того, чтобы просто выполнить какие-то действия (например, изменить форматирование группы ячеек), нужно выбрать процедуру Sub.
Аргументы
При помощи аргументов процедурам VBA могут быть переданы различные данные. Список аргументов указывается при объявлении процедуры. К примеру, процедура Sub в VBA добавляет заданное целое число (Integer) в каждую ячейку в выделенном диапазоне. Передать процедуре это число можно при помощи аргумента, вот так:
Имейте в виду, что наличие аргументов для процедур Function и Sub в VBA не является обязательным. Для некоторых процедур аргументы не нужны.
Необязательные аргументы
Процедуры VBA могут иметь необязательные аргументы. Это такие аргументы, которые пользователь может указать, если захочет, а если они пропущены, то процедура использует для них заданные по умолчанию значения.
Возвращаясь к предыдущему примеру, чтобы сделать целочисленный аргумент функции необязательным, его нужно объявить вот так:
В таком случае целочисленный аргумент i по умолчанию будет равен 0.
Необязательных аргументов в процедуре может быть несколько, все они перечисляются в конце списка аргументов.
Передача аргументов по значению и по ссылке
Аргументы в VBA могут быть переданы процедуре двумя способами:
При помощи ключевых слов ByVal или ByRef в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:
Помните, что аргументы в VBA по умолчанию передаются по ссылке. Иначе говоря, если не использованы ключевые слова ByVal или ByRef, то аргумент будет передан по ссылке.
Перед тем как продолжить изучение процедур Function и Sub более подробно, будет полезным ещё раз взглянуть на особенности и отличия этих двух типов процедур. Далее приведены краткие обсуждения процедур VBA Function и Sub и показаны простые примеры.
VBA процедура «Function»
Редактор VBA распознаёт процедуру Function, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:
Как упоминалось ранее, процедура Function в VBA (в отличие от Sub), возвращает значение. Для возвращаемых значений действуют следующие правила:
Это отлично проиллюстрировано в следующем примере.
Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами
Ниже приведён пример кода VBA процедуры Function, которая получает три аргумента типа Double (числа с плавающей точкой двойной точности). В результате процедура возвращает ещё одно число типа Double, равное сумме первых двух аргументов минус третий аргумент:
Эта очень простая VBA процедура Function иллюстрирует, как данные передаются процедуре через аргументы. Можно увидеть, что тип данных, возвращаемых процедурой, определён как Double (об этом говорят слова As Double после списка аргументов). Также данный пример показывает, как результат процедуры Function сохраняется в переменной с именем, совпадающим с именем процедуры.
Вызов VBA процедуры «Function»
Если рассмотренная выше простая процедура Function вставлена в модуль в редакторе Visual Basic, то она может быть вызвана из других процедур VBA или использована на рабочем листе в книге Excel.
Вызов VBA процедуры «Function» из другой процедуры
Процедуру Function можно вызвать из другой VBA процедуры при помощи простого присваивания этой процедуры переменной. В следующем примере показано обращение к процедуре SumMinus, которая была определена выше.
Вызов VBA процедуры «Function» из рабочего листа
VBA процедуру Function можно вызвать из рабочего листа Excel таким же образом, как любую другую встроенную функцию Excel. Следовательно, созданную в предыдущем примере процедуру Function – SumMinus можно вызвать, введя в ячейку рабочего листа вот такое выражение:
VBA процедура «Sub»
Редактор VBA понимает, что перед ним процедура Sub, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:
VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек
Рассмотрим пример простой VBA процедуры Sub, задача которой – изменить форматирование выделенного диапазона ячеек. В ячейках устанавливается выравнивание по центру (и по вертикали, и по горизонтали) и размер шрифта изменяется на заданный пользователем:
Данная процедура Sub выполняет действия, но не возвращает результат.
В этом примере также использован необязательный (Optional) аргумент iFontSize. Если аргумент iFontSize не передан процедуре Sub, то его значение по умолчанию принимается равным 10. Однако же, если аргумент iFontSize передается процедуре Sub, то в выделенном диапазоне ячеек будет установлен размер шрифта, заданный пользователем.
VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек
Следующая процедура похожа на только что рассмотренную, но на этот раз, вместо изменения размера, применяется полужирное начертание шрифта в выделенном диапазоне ячеек. Это пример процедуры Sub, которой не передаются никакие аргументы:
Вызов процедуры «Sub» в Excel VBA
Вызов VBA процедуры «Sub» из другой процедуры
Чтобы вызвать VBA процедуру Sub из другой VBA процедуры, нужно записать ключевое слово Call, имя процедуры Sub и далее в скобках аргументы процедуры. Это показано в примере ниже:
Если процедура Format_Centered_And_Sized имеет более одного аргумента, то они должны быть разделены запятыми. Вот так:
Вызов VBA процедуры «Sub» из рабочего листа
Процедура Sub не может быть введена непосредственно в ячейку листа Excel, как это может быть сделано с процедурой Function, потому что процедура Sub не возвращает значение. Однако, процедуры Sub, не имеющие аргументов и объявленные как Public (как будет показано далее), будут доступны для пользователей рабочего листа. Таким образом, если рассмотренные выше простые процедуры Sub вставлены в модуль в редакторе Visual Basic, то процедура Format_Centered_And_Bold будет доступна для использования на рабочем листе книги Excel, а процедура Format_Centered_And_Sized – не будет доступна, так как она имеет аргументы.
Вот простой способ запустить (или выполнить) процедуру Sub, доступную из рабочего листа:
Чтобы выполнять процедуру Sub быстро и легко, можно назначить для неё комбинацию клавиш. Для этого:
Внимание: Назначая сочетание клавиш для макроса, убедитесь, что оно не используется, как стандартное в Excel (например, Ctrl+C). Если выбрать уже существующее сочетание клавиш, то оно будет переназначено макросу, и в результате пользователь может запустить выполнение макроса случайно.
Область действия процедуры VBA
В части 2 данного самоучителя обсуждалась тема области действия переменных и констант и роль ключевых слов Public и Private. Эти ключевые слова так же можно использовать применительно к VBA процедурам:
Помните о том, что если перед объявлением VBA процедуры Function или Sub ключевое слово не вставлено, то по умолчанию для процедуры устанавливается свойство Public (то есть она будет доступна везде в данном проекте VBA). В этом состоит отличие от объявления переменных, которые по умолчанию бывают Private.
Ранний выход из VBA процедур «Function» и «Sub»
Если нужно завершить выполнение VBA процедуры Function или Sub, не дожидаясь её естественного финала, то для этого существуют операторы Exit Function и Exit Sub. Применение этих операторов показано ниже на примере простой процедуры Function, в которой ожидается получение положительного аргумента для выполнения дальнейших операций. Если процедуре передано не положительное значение, то дальнейшие операции не могут быть выполнены, поэтому пользователю должно быть показано сообщение об ошибке и процедура должна быть тут же завершена:
Обратите внимание, что перед тем, как завершить выполнение процедуры Function – VAT_Amount, в код вставлена встроенная VBA функция MsgBox, которая показывает пользователю всплывающее окно с предупреждением.
Оператор Sub
Объявляет имя, аргументыи код, которые формируют тело процедуры Sub.
Синтаксис
[ Частный | Public | Друг ] [ Статическое ] Sub name [ (arglist) ]
[заявления]
[ Exit Sub ]
[заявления]
End Sub
Синтаксис оператора Sub состоит из следующих частей:
Part | Описание |
---|---|
Public | Необязательное. Показывает, что процедура Sub доступна всем другим процедурам во всех модулях. При использовании в модуле, содержащем оператор Option Private, процедура становится недоступной вне проекта. |
Private | Необязательное. Показывает, что процедура Sub доступна только другим процедурам из модуля, в котором она объявлена. |
Friend | Необязательное. Используется только в модуле класса. Показывает, что процедура Sub видима по всему проекту, кроме контроллера экземпляра объекта. |
Static | Необязательное. Показывает, что локальные переменные процедуры Sub сохраняются в промежутках между вызовами. Атрибут Static не влияет на переменные, объявленные вне процедуры Sub, даже если они используются в процедуре. |
name | Обязательный. Имя процедуры Sub массива; должен соответствовать стандартным правилам именования переменных. |
arglist | Необязательное. Список переменных, представляющих аргументы, передаваемые в процедуру Sub при ее вызове. В качестве разделителя переменных используется запятая. |
Операторы | Необязательное. Любая группа операторов, выполняющихся внутри процедуры Sub. |
Аргумент arglist имеет следующий синтаксис и элементы:
[ Необязательный ] [ ByVal | ByRef ] [ ParamArray ] varname [( ) ] [ Как тип ] [ = defaultvalue ]
Примечания
Если явно не указано с помощью процедур Public, Private или Friend, процедуры Sub являются общедоступными по умолчанию.
Если не используется static, между вызовами не сохраняется значение локальных переменных.
Ключевое слово Friend может использоваться только в модулях классов. Однако доступ к процедурам Friend может осуществляться в любом модуле проекта. Процедура Friend не отображается в библиотеке типов своего родительского класса; процедура Friend не может быть привязана позднее.
Процедуры Sub могут быть рекурсивными, то есть вызывать сами себя для выполнения определенной задачи. Однако рекурсия может привести к переполнению стека. Как правило, ключевое слово Static не используется с рекурсивными процедурами Sub.
Весь исполняемый код должен находиться в процедурах. Процедуру Sub нельзя объявлять внутри другой процедуры Sub, Function или Property.
Ключевые слова Exit Sub вызывают мгновенный выход из процедуры Sub. Выполнение программы продолжается с оператора, следующего за вызовом процедуры Sub. В процедуре Sub можно использовать сколько угодно операторов Exit Sub.
Как и процедура Function, процедура Sub является отдельной процедурой, которая может принимать аргументы, выполнять последовательность операторов и менять значения своих аргументов. Но в отличие от процедуры Function, которая возвращает значение, процедуру Sub нельзя использовать в выражениях.
Вы вызываем процедуру Sub, используя имя процедуры, а затем список аргументов. Сведения о том, как вызывать процедуры Sub, см. в заявлении Call.
Переменные, используемые в процедурах Sub, делятся на две категории: объявленные и не объявленные в явном виде внутри процедуры. Переменные, объявленные в явном виде внутри процедуры (с использованием инструкции Dim или ее аналогов) всегда являются локальными для процедуры. Переменные, которые используются, но не были явно объявлены в процедуре, также являются локальными, если они не были объявлены на более высоком уровне вне процедуры.
В процедуре могут использоваться переменные, не объявленные внутри нее в явном виде, однако если на уровне модуля объявлены переменные с такими же именами, может возникнуть конфликт имен. Если процедура ссылается на необъявленную переменную, имя которой совпадает с именем другой процедуры, предполагается, что она ссылается на имя из уровня модуля. Во избежание таких конфликтов рекомендуется объявлять переменные в явном виде. Также можно использовать оператор Option Explicit для принудительного объявления переменных в явном виде.
Операторы GoSub, GoTo или Return нельзя использовать для входа в процедуру Sub и выхода из нее.
Пример
В приведенном ниже примере оператор Sub используется для определения имени, аргументов и кода, формирующих тело процедуры Sub.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.