Вызов процедур Sub (подпрограмм) из кода других процедур, расположенных в одном или разных модулях, в одной или разных книгах Excel (проектах VBA), с аргументами или без. Примеры.
Вызов подпрограммы из кода другой процедуры Sub, расположенной в том же модуле или другом модуле одной рабочей книги (проекта VBA) осуществляется с помощью ключевого слова Call или без него по имени подпрограммы. Вызывающая процедура Sub может быть любой видимости, как Public, так и Private, а вызываемая, если расположена в том же модуле, может быть любой видимости, но если расположена в другом модуле, должна быть объявлена как Public.
Синтаксис вызова подпрограмм в пределах одной книги
[ Call ] ИмяПроцедуры [ (Аргументы) ]
- Call — необязательное ключевое слово;
- ИмяПроцедуры — обязательный компонент, имя вызываемой подпрограммы;
- Аргументы — необязательный компонент, список аргументов вызываемой процедуры Sub, разделенных запятой.
Вызов подпрограмм без аргументов в пределах одного модуля
Скобки рядом с именами вызываемых подпрограмм без аргументов не ставятся:
Private Sub test1() Call test2 test3 End Sub Private Sub test2() MsgBox «Процедура test2 (Private) вызвана с ключевым словом Call!» End Sub Public Sub test3() MsgBox «Процедура test3 (Public) вызвана без ключевого слова Call!» End Sub |
Вы можете скопировать приведенный код в свой модуль и посмотреть, запустив процедуру test1, как она последовательно запускает процедуры test2 и test3.
Вызов подпрограмм с аргументами в пределах одного модуля
При вызове процедур Sub с аргументами и ключевым словом Call, аргументы заключаются в скобки, без ключевого слова Call — аргументы не заключаются в скобки:
Private Sub test4() Call test5(15, 25) test6 256, 312, 4.52 End Sub Sub test5(a As Single, b As Single) MsgBox a + b End Sub Sub test6(c As Single, d As Single, e As Single) MsgBox c + d + e End Sub |
Вы можете разместить этот код в своем модуле и протестировать его.
Вызов подпрограмм из разных модулей одной книги
Правила, касающиеся использования оператора Call и заключения аргументов в скобки, верны и для вызова процедур Sub, находящихся в разных модулях. Единственным отличием является необходимость вместе с именем вызываемой подпрограммы указывать место ее расположения. Место расположения и имя подпрограммы разделяются точкой.
Вызываемая подпрограмма расположена в Стандартном модуле
‘Процедура Sub с уникальным именем — ‘возможны два варианта: УникальноеИмяПроцедуры ИмяМодуля.УникальноеИмяПроцедуры ‘Процедура Sub с неуникальным именем — ‘возможен только один вариант: ИмяМодуля.НеуникальноеИмяПроцедуры |
- ИмяМодуля — уникальное имя стандартного модуля, отображаемое в проводнике проекта VBA.
Неуникальное имя процедуры возникает, когда создаются процедуры с одним именем в разных модулях. Если есть вероятность дублирования в дальнейшем имени подпрограммы и лишения ее уникальности, то лучше сразу вызывать ее с указанием имени стандартного модуля.
Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы
‘В модуле книги: ЭтаКнига.ИмяПроцедуры ‘В модуле листа: ИмяЛиста.ИмяПроцедуры Worksheets(«Имя ярлычка листа»).ИмяПроцедуры ‘В модуле формы: ИмяФормы.ИмяПроцедуры |
- ЭтаКнига — так и пишется, указывает на текущую книгу в которой расположены вызывающая и вызываемая подпрограммы.
- ИмяЛиста — уникальное имя листа, которое в проводнике проекта VBA указано без скобок (по умолчанию: Лист1, Лист2, Лист3 и т.д.).
- Имя ярлычка листа — дублирующее имя листа, которое в проводнике проекта VBA указано в скобках.
- ИмяФормы — уникальное имя пользовательской формы, отображаемое в проводнике проекта VBA.
Вызов процедур Sub из модулей разных книг
Если вызываемая подпрограмма расположена в другой книге, она должна быть объявлена как Public, а книга открыта. Запустить такую процедуру Sub можно с помощью метода Application.Run (протестировано в Excel 2016).
Синтаксис метода Application.Run
Application.Run «ИмяКниги!ИмяМодуля.ИмяПроцедуры», Арг1, Арг2, …, Арг30
- ИмяКниги!ИмяМодуля.ИмяПроцедуры — обязательный компонент, полный адрес подпрограммы, заключен в двойные кавычки.
- ИмяКниги — имя рабочей книги Excel с расширением, в которой находится вызываемая подпрограмма, если имя содержит пробелы, оно заключается в одинарные кавычки — апострофы (‘Имя Книги’).
- ИмяМодуля — имя модуля для стандартного модуля (для уникальных имен вызываемых подпрограмм может не указываться), имя листа для модуля листа, словосочетание «ЭтаКнига» (без кавычек) для модуля книги.
- ИмяПроцедуры — имя вызываемой процедуры Sub.
- Арг1, Арг2, …, Арг30 — необязательные компоненты, аргументы вызываемой подпрограммы, максимальное количество которых ограничено 30 элементами.
Полный адрес вызываемой процедуры заключен в двойные кавычки, отделен от аргументов и аргументы друг от друга запятыми.
Полный адрес вызываемой процедуры
Может показаться сложным составить полный адрес вызываемой подпрограммы, но на самом деле все очень просто — Excel уже сделал это за нас.
1. Откройте окно со списком макросов.
Список макросов во всех открытых книгах
2. Найдите в списке вызываемую подпрограмму и кликните по ней. Ее полный адрес отобразится в поле «Имя макроса».
3. Скопируйте полное имя вызываемой процедуры Sub и вставьте ее в метод Application.Run, заключив в двойные кавычки.
Один нюанс: в окне «Макрос» не отображаются процедуры с аргументами. Чтобы отобразить такую процедуру, закомментируйте аргументы, а после копирования и вставки раскомментируйте их.
Стоит не забывать о том, что если книга с вызываемой подпрограммой будет переименована, то полное имя вызываемой процедуры Sub изменится и везде, где оно присутствует в коде, его необходимо будет отредактировать.
Пример вызова подпрограмм из другой книги
Допустим, у нас есть рабочая книга Excel под именем «Книга1.xlsm» (или «Книга1.xls» в ранних версиях программы). В ней находятся вызываемые из другой книги процедуры Sub, перечисленные ниже.
В стандартном модуле «Module1»:
Sub Vyzov1() MsgBox «Запущена процедура в стандартном модуле!» End Sub |
В модуле листа «Лист1»:
Sub Vyzov2() MsgBox «Запущена процедура в модуле листа!» End Sub |
В модуле книги «ЭтаКнига»:
Sub Vyzov3(a As Variant, b As Variant) MsgBox «Запущена процедура в модуле книги!» _ & vbNewLine & «Сумма равна: « & a + b End Sub |
Для последовательного запуска этих подпрограмм можно вставить в любой модуль другой книги Excel следующую процедуру:
Sub ProverkaVyzova() Application.Run «Книга1.xlsm!Vyzov1» Application.Run «Книга1.xlsm!Module1.Vyzov1» Application.Run «Книга1.xlsm!Лист1.Vyzov2» Application.Run «Книга1.xlsm!ЭтаКнига.Vyzov3», 555, 445 End Sub |
Во второй строке кода пропущено имя стандартного модуля, так как имя подпрограммы оказалось уникальным, а в следующей строке этот же код продублирован, для примера, с именем модуля. В пятой строке — пример запуска процедуры Sub с двумя аргументами.
И еще раз напомню, что имя книги с пробелами заключается в одинарные кавычки (апострофы):
Application.Run «‘Новая Книга 1.xlsm’!Процедура1» |
Если у вас есть процедуры, которые часто вызываются из других книг, поместите их в Личную книгу макросов, и они всегда будут доступны.
Заключение
В этой статье не рассмотрено добавление ссылок из одного проекта VBA на другой, которые позволяют работать с модулями и процедурами, находящимися в другом проекте так, как с находящимися в текущем. Причем книга, с которой установлена связь, может быть закрыта. Я предпочитаю работать с Личной книгой макросов, а при попытке, из любопытства, установить связь между двумя книгами, программа Excel, почему-то, отказала мне в этом и эксперименты закончились.
Если хотите поэкспериментировать со связанными книгами, откройте проект VBA, из которого надо установить связь с другой книгой, и выберите в главном меню «Tools» — «References…». В открывшемся окне «References — VBAProject» все открытые книги будут отображены одним словом — «VBAProject». Выделяйте по очереди строки с этим словом и внизу, в информационной рамке, смотрите, какой книге этот проект принадлежит. Поставьте галочку рядом с выбранным проектом и нажмите кнопку «OK». Если книга, с проектом которой устанавливается связь, закрыта, ее не будет в списке. В этом случае, нажмите на кнопку «Browse…», найдите, выбрав расширение, нужную книгу и откройте ее в проводнике. Связь будет установлена, и процедуры из связанных книг будут вызываться по имени с ключевым словом Call или без него, как будто они расположены в одной книге.
Excel VBA Sub Procedure
SUB in VBA is also known as a subroutine or a procedure that contains all the code. It is an inbuilt statement in VBA, and when used, it automatically gives us the statement of the end sub. The middle portion one may use for coding, the sub statement can be both public and private, and the subprocedure’s name is mandatory in VBA.
Sub means Sub Procedure in VBA. Sub Procedures are used to perform a specific set of tasks provided in the form of code. It performs only the task mentioned in the code as per the VBA language but does not return any value.
Table of contents
- Excel VBA Sub Procedure
- How to write VBA Sub Procedures?
- Example #1 – Simple Sub Procedure
- Example #2 – Simple Subroutine Task
- Types of VBA Subroutine
- Recommended Articles
- How to write VBA Sub Procedures?
You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA Sub (wallstreetmojo.com)
How to write VBA Sub Procedures?
You can download this VBA Sub Procedure Template here – VBA Sub Procedure Template
It is important to understand the structure of the sub procedure to write sub procedure codes. Below is the structure.
Sub [Name of the Procedure] (Parameters)
[What needs to be done?])
End Sub
To start the sub procedure, we need to use the word “Sub.” We need to give a name to the Sub as a procedure name. Procedure Name is nothing but our macro name. We do not usually have parameters inside the parenthesis in the VBA sub procedure.
After writing the Sub Procedure name, we need to write the tasks that we need to do. Then comes the End statement, i.e., End Sub.
Example #1 – Simple Sub Procedure
Now, take a look at the simple sub procedure writing methods.
Step 1: Start the word “Sub” in the module.
Step 2: Now name the macro name or procedure name.
Step 3: After giving the name to the sub procedure, just hit the enter key. It will automatically apply the end statement.
Now, we can see two things here, one is the start, and another is the end of the subprocedure. For better understanding, we can call it “Head” and “Tail.”
Between the head and tail of the macro, we need to write our code to perform some tasks.
Example #2 – Simple Subroutine Task
Now, we will see how to perform some simple actions here.
Assume you want to insert the value “Excel VBA” in cell A1.
Step 1: Start the sub procedure by using the above methods.
Code:
Sub Action1() End Sub
Step 2: To access cell A1 we need to use the word RANGE.
Code:
Sub Action1() Range( End Sub
Step 3: It asks what cell1 you want to refer to is? In this case, it is an A1 cell.
Code:
Sub Action1() Range ("A1") End Sub
Step 4: We need to insert the value “Excel VBA,” so select the VALUE property by putting a dot after the range.
Code:
Sub Action1() Range("A1").Value End Sub
When you start typing the word VALUE, you will see many options. These options are called an IntelliSense list, which predicts based on your typing. It is like how formulas will appear in the worksheet when we start typing the formula.
Step 5: After selecting VALUE, put an equal sign and enter the value in doubles quotes as “Excel VBA.”
Code:
Sub Action1() Range("A1").Value = "Excel VBA" End Sub
So, we have completed it.
Now, we need to execute this task. To execute the task, we had a return. So, we need to run this code by pressing the RUN button in the visual basic editor window.
We can press the excel shortcut keyAn Excel shortcut is a technique of performing a manual task in a quicker way.read more by placing the cursor inside the Macro code.
As soon as you run the code, you will get the “Excel VBA” value in cell A1.
Types of VBA Subroutine
We have two more types in sub procedure: Public Sub Procedure and Private Sub Procedure.
The words “Public” and “Private” are accessibility modifiers that allow us to use them differently.
- Public Sub Procedure allows us to use the procedure in all the workbook modules.
- Private Sub Procedure allows us to use the procedure only in the current module.
For example, look at the below image of the Public Code, which is there in Module 1.
Now, in Module 2 also, we can use this sub procedure.
Action1 is the name of the sub procedure we have used in Module 1.
In Module 2, we have mentioned it as “Call Action1”. It means when you run the sub procedure, it will execute the subprocedure Action1 from Module 1.
One cannot access Private Sub Procedures from a different module. We need to access them from the same module only.
Recommended Articles
This article has been a guide to VBA Sub. Here, we learn how to invoke a sub procedure in Excel VBA and types of subroutines, along with examples and downloadable templates. Below are some useful articles related to VBA: –
- VBA StrConv
- VBA MOD
- VBA Worksheet Function
- VBA Time
- VBA Write Text File
Содержание
- Встроенные функции VBA
- Пользовательские процедуры «Function» и «Sub» в VBA
- Аргументы
- Необязательные аргументы
- Передача аргументов по значению и по ссылке
- VBA процедура «Function»
- Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами
- Вызов VBA процедуры «Function»
- Вызов VBA процедуры «Function» из другой процедуры
- Вызов VBA процедуры «Function» из рабочего листа
- VBA процедура «Sub»
- VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек
- VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек
- Вызов процедуры «Sub» в Excel VBA
- Вызов VBA процедуры «Sub» из другой процедуры
- Вызов VBA процедуры «Sub» из рабочего листа
- Область действия процедуры VBA
- Ранний выход из VBA процедур «Function» и «Sub»
Встроенные функции VBA
Перед тем, как приступить к созданию собственных функций VBA, полезно знать, что Excel VBA располагает обширной коллекцией готовых встроенных функций, которые можно использовать при написании кода.
Список этих функций можно посмотреть в редакторе VBA:
- Откройте рабочую книгу Excel и запустите редактор VBA (нажмите для этого Alt+F11), и затем нажмите F2.
- В выпадающем списке в верхней левой части экрана выберите библиотеку VBA.
- Появится список встроенных классов и функций VBA. Кликните мышью по имени функции, чтобы внизу окна отобразилось её краткое описание. Нажатие F1 откроет страницу онлайн-справки по этой функции.
Кроме того, полный список встроенных функций VBA с примерами можно найти на сайте Visual Basic Developer Centre.
Пользовательские процедуры «Function» и «Sub» в VBA
В Excel Visual Basic набор команд, выполняющий определённую задачу, помещается в процедуру Function (Функция) или Sub (Подпрограмма). Главное отличие между процедурами Function и Sub состоит в том, что процедура Function возвращает результат, процедура Sub – нет.
Поэтому, если требуется выполнить действия и получить какой-то результат (например, просуммировать несколько чисел), то обычно используется процедура Function, а для того, чтобы просто выполнить какие-то действия (например, изменить форматирование группы ячеек), нужно выбрать процедуру Sub.
Аргументы
При помощи аргументов процедурам VBA могут быть переданы различные данные. Список аргументов указывается при объявлении процедуры. К примеру, процедура Sub в VBA добавляет заданное целое число (Integer) в каждую ячейку в выделенном диапазоне. Передать процедуре это число можно при помощи аргумента, вот так:
Sub AddToCells(i As Integer) ... End Sub
Имейте в виду, что наличие аргументов для процедур Function и Sub в VBA не является обязательным. Для некоторых процедур аргументы не нужны.
Необязательные аргументы
Процедуры VBA могут иметь необязательные аргументы. Это такие аргументы, которые пользователь может указать, если захочет, а если они пропущены, то процедура использует для них заданные по умолчанию значения.
Возвращаясь к предыдущему примеру, чтобы сделать целочисленный аргумент функции необязательным, его нужно объявить вот так:
Sub AddToCells(Optional i As Integer = 0)
В таком случае целочисленный аргумент i по умолчанию будет равен 0.
Необязательных аргументов в процедуре может быть несколько, все они перечисляются в конце списка аргументов.
Передача аргументов по значению и по ссылке
Аргументы в VBA могут быть переданы процедуре двумя способами:
- ByVal – передача аргумента по значению. Это значит, что процедуре передаётся только значение (то есть, копия аргумента), и, следовательно, любые изменения, сделанные с аргументом внутри процедуры, будут потеряны при выходе из неё.
- ByRef – передача аргумента по ссылке. То есть процедуре передаётся фактический адрес размещения аргумента в памяти. Любые изменения, сделанные с аргументом внутри процедуры, будут сохранены при выходе из процедуры.
При помощи ключевых слов ByVal или ByRef в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:
Sub AddToCells(ByVal i As Integer) ... End Sub |
В этом случае целочисленный аргумент i передан по значению. После выхода из процедуры Sub все сделанные с i изменения будут утрачены. |
Sub AddToCells(ByRef i As Integer) ... End Sub |
В этом случае целочисленный аргумент i передан по ссылке. После выхода из процедуры Sub все сделанные с i изменения будут сохранены в переменной, которая была передана процедуре Sub. |
Помните, что аргументы в VBA по умолчанию передаются по ссылке. Иначе говоря, если не использованы ключевые слова ByVal или ByRef, то аргумент будет передан по ссылке.
Перед тем как продолжить изучение процедур Function и Sub более подробно, будет полезным ещё раз взглянуть на особенности и отличия этих двух типов процедур. Далее приведены краткие обсуждения процедур VBA Function и Sub и показаны простые примеры.
VBA процедура «Function»
Редактор VBA распознаёт процедуру Function, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:
Function ... End Function
Как упоминалось ранее, процедура Function в VBA (в отличие от Sub), возвращает значение. Для возвращаемых значений действуют следующие правила:
- Тип данных возвращаемого значения должен быть объявлен в заголовке процедуры Function.
- Переменная, которая содержит возвращаемое значение, должна быть названа так же, как и процедура Function. Эту переменную не нужно объявлять отдельно, так как она всегда существует как неотъемлемая часть процедуры Function.
Это отлично проиллюстрировано в следующем примере.
Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами
Ниже приведён пример кода VBA процедуры Function, которая получает три аргумента типа Double (числа с плавающей точкой двойной точности). В результате процедура возвращает ещё одно число типа Double, равное сумме первых двух аргументов минус третий аргумент:
Function SumMinus(dNum1 As Double, dNum2 As Double, dNum3 As Double) As Double SumMinus = dNum1 + dNum2 - dNum3 End Function
Эта очень простая VBA процедура Function иллюстрирует, как данные передаются процедуре через аргументы. Можно увидеть, что тип данных, возвращаемых процедурой, определён как Double (об этом говорят слова As Double после списка аргументов). Также данный пример показывает, как результат процедуры Function сохраняется в переменной с именем, совпадающим с именем процедуры.
Вызов VBA процедуры «Function»
Если рассмотренная выше простая процедура Function вставлена в модуль в редакторе Visual Basic, то она может быть вызвана из других процедур VBA или использована на рабочем листе в книге Excel.
Вызов VBA процедуры «Function» из другой процедуры
Процедуру Function можно вызвать из другой VBA процедуры при помощи простого присваивания этой процедуры переменной. В следующем примере показано обращение к процедуре SumMinus, которая была определена выше.
Sub main() Dim total as Double total = SumMinus(5, 4, 3) End Sub
Вызов VBA процедуры «Function» из рабочего листа
VBA процедуру Function можно вызвать из рабочего листа Excel таким же образом, как любую другую встроенную функцию Excel. Следовательно, созданную в предыдущем примере процедуру Function – SumMinus можно вызвать, введя в ячейку рабочего листа вот такое выражение:
=SumMinus(10, 5, 2)
VBA процедура «Sub»
Редактор VBA понимает, что перед ним процедура Sub, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:
VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек
Рассмотрим пример простой VBA процедуры Sub, задача которой – изменить форматирование выделенного диапазона ячеек. В ячейках устанавливается выравнивание по центру (и по вертикали, и по горизонтали) и размер шрифта изменяется на заданный пользователем:
Sub Format_Centered_And_Sized(Optional iFontSize As Integer = 10) Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub
Данная процедура Sub выполняет действия, но не возвращает результат.
В этом примере также использован необязательный (Optional) аргумент iFontSize. Если аргумент iFontSize не передан процедуре Sub, то его значение по умолчанию принимается равным 10. Однако же, если аргумент iFontSize передается процедуре Sub, то в выделенном диапазоне ячеек будет установлен размер шрифта, заданный пользователем.
VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек
Следующая процедура похожа на только что рассмотренную, но на этот раз, вместо изменения размера, применяется полужирное начертание шрифта в выделенном диапазоне ячеек. Это пример процедуры Sub, которой не передаются никакие аргументы:
Sub Format_Centered_And_Bold() Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Bold = True End Sub
Вызов процедуры «Sub» в Excel VBA
Вызов VBA процедуры «Sub» из другой процедуры
Чтобы вызвать VBA процедуру Sub из другой VBA процедуры, нужно записать ключевое слово Call, имя процедуры Sub и далее в скобках аргументы процедуры. Это показано в примере ниже:
Sub main() Call Format_Centered_And_Sized(20) End Sub
Если процедура Format_Centered_And_Sized имеет более одного аргумента, то они должны быть разделены запятыми. Вот так:
Sub main() Call Format_Centered_And_Sized(arg1, arg2, ...) End Sub
Вызов VBA процедуры «Sub» из рабочего листа
Процедура Sub не может быть введена непосредственно в ячейку листа Excel, как это может быть сделано с процедурой Function, потому что процедура Sub не возвращает значение. Однако, процедуры Sub, не имеющие аргументов и объявленные как Public (как будет показано далее), будут доступны для пользователей рабочего листа. Таким образом, если рассмотренные выше простые процедуры Sub вставлены в модуль в редакторе Visual Basic, то процедура Format_Centered_And_Bold будет доступна для использования на рабочем листе книги Excel, а процедура Format_Centered_And_Sized – не будет доступна, так как она имеет аргументы.
Вот простой способ запустить (или выполнить) процедуру Sub, доступную из рабочего листа:
- Нажмите Alt+F8 (нажмите клавишу Alt и, удерживая её нажатой, нажмите клавишу F8).
- В появившемся списке макросов выберите тот, который хотите запустить.
- Нажмите Выполнить (Run)
Чтобы выполнять процедуру Sub быстро и легко, можно назначить для неё комбинацию клавиш. Для этого:
- Нажмите Alt+F8.
- В появившемся списке макросов выберите тот, которому хотите назначить сочетание клавиш.
- Нажмите Параметры (Options) и в появившемся диалоговом окне введите сочетание клавиш.
- Нажмите ОК и закройте диалоговое окно Макрос (Macro).
Внимание: Назначая сочетание клавиш для макроса, убедитесь, что оно не используется, как стандартное в Excel (например, Ctrl+C). Если выбрать уже существующее сочетание клавиш, то оно будет переназначено макросу, и в результате пользователь может запустить выполнение макроса случайно.
Область действия процедуры VBA
В части 2 данного самоучителя обсуждалась тема области действия переменных и констант и роль ключевых слов Public и Private. Эти ключевые слова так же можно использовать применительно к VBA процедурам:
Public Sub AddToCells(i As Integer) ... End Sub |
Если перед объявлением процедуры стоит ключевое слово Public, то данная процедура будет доступна для всех модулей в данном проекте VBA. |
Private Sub AddToCells(i As Integer) ... End Sub |
Если перед объявлением процедуры стоит ключевое слово Private, то данная процедура будет доступна только для текущего модуля. Её нельзя будет вызвать, находясь в любом другом модуле или из рабочей книги Excel. |
Помните о том, что если перед объявлением VBA процедуры Function или Sub ключевое слово не вставлено, то по умолчанию для процедуры устанавливается свойство Public (то есть она будет доступна везде в данном проекте VBA). В этом состоит отличие от объявления переменных, которые по умолчанию бывают Private.
Ранний выход из VBA процедур «Function» и «Sub»
Если нужно завершить выполнение VBA процедуры Function или Sub, не дожидаясь её естественного финала, то для этого существуют операторы Exit Function и Exit Sub. Применение этих операторов показано ниже на примере простой процедуры Function, в которой ожидается получение положительного аргумента для выполнения дальнейших операций. Если процедуре передано не положительное значение, то дальнейшие операции не могут быть выполнены, поэтому пользователю должно быть показано сообщение об ошибке и процедура должна быть тут же завершена:
Function VAT_Amount(sVAT_Rate As Single) As Single VAT_Amount = 0 If sVAT_Rate <= 0 Then MsgBox "Expected a Positive value of sVAT_Rate but Received " & sVAT_Rate Exit Function End If ... End Function
Обратите внимание, что перед тем, как завершить выполнение процедуры Function – VAT_Amount, в код вставлена встроенная VBA функция MsgBox, которая показывает пользователю всплывающее окно с предупреждением.
Оцените качество статьи. Нам важно ваше мнение:
Содержание
- Calling Sub and Function procedures
- Call Sub procedures with more than one argument
- Use parentheses when calling function procedures
- Pass named arguments
- See also
- Support and feedback
- Оператор Sub
- Синтаксис
- Замечания
- Пример
- См. также
- Поддержка и обратная связь
- Оператор Call
- Синтаксис
- Замечания
- Пример
- См. также
- Поддержка и обратная связь
- Вызов процедур Sub и Function
- Вызов процедур Sub с несколькими аргументами
- Использование круглых скобок при вызове процедур функций
- Передача именованных аргументов
- См. также
- Поддержка и обратная связь
Calling Sub and Function procedures
To call a Sub procedure from another procedure, type the name of the procedure and include values for any required arguments. The Call statement is not required, but if you use it, you must enclose any arguments in parentheses.
Use a Sub procedure to organize other procedures so they are easier to understand and debug. In the following example, the Sub procedure Main calls the Sub procedure MultiBeep , passing the value 56 for its argument.
After MultiBeep runs, control returns to Main , and Main calls the Sub procedure Message . Message displays a message box; when the user clicks OK, control returns to Main , and Main finishes.
Interested in developing solutions that extend the Office experience across multiple platforms? Check out the new Office Add-ins model. Office Add-ins have a small footprint compared to VSTO Add-ins and solutions, and you can build them by using almost any web programming technology, such as HTML5, JavaScript, CSS3, and XML.
Call Sub procedures with more than one argument
The following example shows two ways to call a Sub procedure with more than one argument. The second time it is called, parentheses are required around the arguments because the Call statement is used.
Use parentheses when calling function procedures
To use the return value of a function, assign the function to a variable and enclose the arguments in parentheses, as shown in the following example.
If you are not interested in the return value of a function, you can call a function the same way you call a Sub procedure. Omit the parentheses, list the arguments, and don’t assign the function to a variable, as shown in the following example.
If you include parentheses in the preceding example, the statement causes a syntax error.
Pass named arguments
A statement in a Sub or Function procedure can pass values to called procedures by using named arguments. You can list named arguments in any order. A named argument consists of the name of the argument followed by a colon and an equal sign (:=), and the value assigned to the argument.
The following example calls the MsgBox function by using named arguments with no return value.
The following example calls the MsgBox function by using named arguments. The return value is assigned to the variable.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
Оператор Sub
Объявляет имя, аргументы и код, формирующий текст процедурыSub.
Синтаксис
[ Частный | Общественного | Друг ] [ Static ] Subname [ ( 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 [ ( ) ] [ Astype ] [ =defaultvalue ]
Part | Описание |
---|---|
Необязательное | Необязательный параметр. Ключевое слово, которое указывает, что аргумент не является обязательным. Если используется, все последующие аргументы в списке ресурсов также должны быть необязательными и объявляться с помощью ключевого слова Optional . Optional не может использоваться для каких-либо аргументов, если используется ParamArray. |
ByVal | Необязательный параметр. Указывает, что аргумент передается значением. |
ByRef | Необязательный параметр. Указывает, что аргумент передается по ссылке. ByRef является значением по умолчанию в Visual Basic. |
ParamArray | Необязательный параметр. Используется только в качестве последнего аргумента в списке ресурсов , чтобы указать, что окончательный аргумент является необязательныммассивом элементов Variant . Ключевое слово ParamArray позволяет предоставлять произвольное число аргументов. Ключевое слово ParamArray не может использоваться с аргументами ByVal, ByRef или Optional. |
варнаме | Обязательно. Имя переменной, представляющее аргумент; соответствует стандарту соглашений об именовании переменных. |
type | Необязательный параметр. Тип данных аргумента, передаваемого процедуре; Может быть byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только переменная длина), Object, Variant или определенный тип объекта. Если параметр не является Optional, может быть указан определяемый пользователем тип. |
Defaultvalue | Необязательный параметр. Любая константа или константное выражение. Действительно только для параметров Optional. Если типом является Object, явным значением по умолчанию может быть только Nothing. |
Замечания
Если явно не указано с помощью 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 и обратная связь.
Источник
Оператор Call
Передает управление процедуреSub, процедуре функции или процедуре динамической библиотеки (DLL).
Синтаксис
[ Позвонить ] name [ argumentlist ]
Синтаксис оператора Call состоит из следующих частей:
Part | Описание |
---|---|
Звонок | Необязательный элемент; ключевое слово. Если указан, следует заключить элемент список_аргументов в скобки.
Пример: Call MyProc(0) |
name | Обязательно. Имя вызываемой процедуры. |
список аргументов | Необязательный параметр. Список с разделителями-запятыми переменных, массивов или выражений, передаваемых процедуре. Компоненты список_аргументов могут включать ключевые слова ByVal или ByRef для описания способа, с помощью которого аргументы обрабатываются вызванной процедурой.
Однако ByVal и ByRef могут использоваться с ключевым словом Call только при вызове процедуры DLL. На компьютерах Macintosh ByVal и ByRef могут использоваться с ключевым словом Call при вызове ресурса кода Macintosh. |
Замечания
Ключевое слово Call не требуется обязательно использовать при вызове процедуры. Однако если ключевое слово Call используется для вызова процедуры, требующей задания аргументов, элемент список_аргументов должен быть заключен в скобки. Если ключевое слово Call будет пропущено, необходимо также убрать и скобки вокруг элемента список_аргументов. Если используется синтаксис Call для вызова любой внутренней либо определяемой пользователем функции, значение, возвращаемое этой функцией, отбрасывается.
Чтобы передать процедуре целый массив, используйте имя этого массива, после которого следует записать пустые скобки.
Пример
В этом примере показано, как оператор Call используется для передачи управления процедуре Sub , встроенной функции и процедуре динамической библиотеки (DLL). Библиотеки DLL не используются в Macintosh.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Вызов процедур Sub и Function
Чтобы вызвать процедуру Sub из другой процедуры, введите имя процедуры и включите значения для всех требуемых аргументов. Оператор Call не является обязательным, но в случае его использования вам следует заключить все аргументы в скобки.
Используйте процедуру Sub для упорядочения других процедур с целью упрощения их понимания и отладки. В приведенном ниже примере процедура Sub Main вызывает процедуру Sub MultiBeep , передавая значение 56 для ее аргумента.
После запуска MultiBeep управление возвращается к Main , и Main вызывает процедуру Sub Message . Message отображает окно сообщения; когда пользователь щелкает ОК, управление возвращается к Main , после чего Main завершается.
Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.
Вызов процедур Sub с несколькими аргументами
В приведенном ниже примере показано два способа для вызова процедуры Sub с несколькими аргументами. При втором вызове аргументы должны быть заключены в скобки, так как используется оператор Call.
Использование круглых скобок при вызове процедур функций
Чтобы использовать возвращаемое значение функции, назначьте ее переменной, и заключите аргументы в скобки, как показано в следующем примере.
Если возвращаемое значение функции вас не интересует, можно вызвать функцию тем же способом, что и процедуру Sub. Опустите скобки, укажите аргументы и не назначайте функцию переменной, как показано в следующем примере.
Если включить скобки в предыдущий пример, оператор вызывает ошибку синтаксиса.
Передача именованных аргументов
Оператор в процедуре Sub или Function может передавать значения в вызываемые процедуры с помощью именованных аргументов. Вы можете указывать именованные аргументы в любом порядке. Именованный аргумент состоит из имени аргумента, за которым стоит двоеточие и знак равенства (:=), а затем следует присвоенное аргументу значение.
В примере ниже функция MsgBox вызывается с использованием именованных аргументов без возвращаемого значения.
В примере ниже функция MsgBox вызывается с использованием именованных аргументов. Возвращаемое значение присваивается переменной.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
In this Article
- Creating a Function without Arguments
- Calling a Function from a Sub Procedure
- Creating Functions
- Single Argument
- Multiple Arguments
- Optional Arguments
- Default Argument Value
- ByVal and ByRef
- Exit Function
- Using a Function from within an Excel Sheet
This tutorial will teach you to create and use functions with and without parameters in VBA
VBA contains a large amount of built-in functions for you to use, but you are also able to write your own. When you write code in VBA, you can write it in a Sub Procedure, or a Function Procedure. A Function Procedure is able to return a value to your code. This is extremely useful if you want VBA to perform a task to return a result. VBA functions can also be called from inside Excel, just like Excel’s built-in Excel functions.
Creating a Function without Arguments
To create a function you need to define the function by giving the function a name. The function can then be defined as a data type indicating the type of data you want the function to return.
You may want to create a function that returns a static value each time it is called – a bit like a constant.
Function GetValue() As Integer
GetValue = 50
End Function
If you were to run the function, the function would always return the value of 50.
You can also create functions that refer to objects in VBA but you need to use the Set Keyword to return the value from the function.
Function GetRange() as Range
Set GetRange = Range("A1:G4")
End Function
If you were to use the above function in your VBA code, the function would always return the range of cells A1 to G4 in whichever sheet you are working in.
Calling a Function from a Sub Procedure
Once you create a function, you can call it from anywhere else in your code by using a Sub Procedure to call the function.
The value of 50 would always be returned.
You can also call the GetRange function from a Sub Procedure.
In the above example, the GetRange Function is called by the Sub Procedure to bold the cells in the range object.
Creating Functions
Single Argument
You can also assign a parameter or parameters to your function. These parameters can be referred to as Arguments.
Function ConvertKilosToPounds (dblKilo as Double) as Double
ConvertKiloToPounds = dblKilo*2.2
End Function
We can then call the above function from a Sub Procedure in order to work out how many pounds a specific amount of kilos are.
A function can be a called from multiple procedures within your VBA code if required. This is very useful in that it stops you from having to write the same code over and over again. It also enables you to divide long procedures into small manageable functions.
In the above example, we have 2 procedures – each of them are using the Function to calculate the pound value of the kilos passed to them in the dblKilo Argument of the function.
Multiple Arguments
You can create a Function with multiple arguments and pass the values to the Function by way of a Sub Procedure.
Function CalculateDayDiff(Date1 as Date, Date2 as Date) as Double
CalculateDayDiff = Date2-Date1
End Function
We can then call the function to calculate the amount of days between 2 dates.
Optional Arguments
You can also pass Optional arguments to a Function. In other words, sometimes you may need the argument, and sometimes you may not – depending on what code you are using the Function with .
Function CalculateDayDiff(Date1 as Date, Optional Date2 as Date) as Double
'check for second date and if not there, make Date2 equal to today's date.
If Date2=0 then Date2 = Date
'calculate difference
CalculateDayDiff = Date2-Date1
End Function
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Default Argument Value
You can also set the default value of the Optional arguments when you are creating the function so that if the user omits the argument, the value that you have put as default will be used instead.
Function CalculateDayDiff(Date1 as Date, Optional Date2 as Date="06/02/2020") as Double
'calculate difference
CalculateDayDiff = Date2-Date1
End Function
ByVal and ByRef
When you pass values to a function, you can use the ByVal or ByRef keywords. If you omit either of these, the ByRef is used as the default.
ByVal means that you are passing a copy of the variable to the function, whereas ByRef means you are referring to the original value of the variable. When you pass a copy of the variable (ByVal), the original value of the variable is NOT changed, but when you reference the variable, the original value of the variable is changed by the function.
Function GetValue(ByRef intA As Integer) As Integer
intA = intA * 4
GetValue = intA
End Function
In the function above, the ByRef could be omitted and the function would work the same way.
Function GetValue(intA As Integer) As Integer
intA = intA * 4
GetValue = intA
End Function
To call this function, we can run a sub-procedure.
Sub TestValues()
Dim intVal As Integer
'populate the variable with the value 10
intVal = 10
'run the GetValue function, and show the value in the immediate window
Debug.Print GetValue(intVal)
'show the value of the intVal variable in the immediate window
Debug.Print intVal
End Sub
Note that the debug windows show the value 40 both times. When you pass the variable IntVal to the function – the value of 10 is passed to the function, and multiplied by 4. Using the ByRef keyword (or omitting it altogether), will AMEND the value of the IntVal variable. This is shown when you show first the result of the function in the immediate window (40), and then the value of the IntVal variable in the debug window (also 40).
If we do NOT want to change the value of the original variable, we have to use ByVal in the function.
Function GetValue(ByVal intA As Integer) As Integer
intA = intA * 4
GetValue = intA
End Function
Now if we call the function from a sub-procedure, the value of the variable IntVal will remain at 10.
Exit Function
If you create a function that tests for a certain condition, and once the condition is found to be true, you want return the value from the function, you may need to add an Exit Function statement in your Function in order to exit the function before you have run through all the code in that function.
Function FindNumber(strSearch As String) As Integer
Dim i As Integer
'loop through each letter in the string
For i = 1 To Len(strSearch)
'if the letter is numeric, return the value to the function
If IsNumeric(Mid(strSearch, i, 1)) Then
FindNumber= Mid(strSearch, i, 1)
'then exit the function
Exit Function
End If
Next
FindNumber= 0
End Function
The function above will loop through the string that is provided until it finds a number, and then return that number from the string. It will only find the first number in the string as it will then Exit the function.
The function above can be called by a Sub routine such as the one below.
Sub CheckForNumber()
Dim NumIs as Integer
'pass a text string to the find number function
NumIs = FindNumber("Upper Floor, 8 Oak Lane, Texas")
'show the result in the immediate window
Debug.Print NumIs
End Sub
VBA Programming | Code Generator does work for you!
Using a Function from within an Excel Sheet
In addition to calling a function from your VBA code using a sub procedure, you can also call the function from within your Excel sheet. The functions that you have created should by default appear in your function list in the User Defined section of the function list.
Click on the fx to show the Insert Function dialog box.
Select User Defined from the Category List
Select the function you require from the available User Defined Functions (UDF’s).
Alternatively, when you start writing your function in Excel, the function should appear in the drop down list of functions.
If you do not want the function to be available inside an Excel sheet, you need to put the Private word in front of the word Function when you create the function in your VBA code.
Private Function CalculateDayDiff(Date1 as Date, Date2 as Date) as Double
CalculateDayDiff = Date2-Date1
End Function
It will now not appear in the drop down list showing the Excel functions available.
Interestingly enough, however, you can still use the function – it just will not appear in the list when looking for it!
If you have declared the second argument as Optional, you can omit it within the Excel sheet as well as within the VBA code.
You can also use the a function that you have created without arguments in your Excel sheet.