Вызов процедур 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 или без него, как будто они расположены в одной книге.
Содержание
- Встроенные функции 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, которая показывает пользователю всплывающее окно с предупреждением.
Оцените качество статьи. Нам важно ваше мнение:
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.
Процедура — это последовательность операторов VBA, расположенная в модуле VBA, доступ к которому можно получить с помощью VBE. Модуль может включать любое количество процедур.[1] Некоторые процедуры получают аргументы. Аргумент — это информация, используемая процедурой в процессе выполнения. Аргументы процедуры во многом подобны аргументам, используемым функциями Excel.
При объявлении процедуры с использованием ключевого слова Sub применяется следующий синтаксис.
[Private | Public][Static] Sub имя([список_аргументов])
[инструкции]
[Exit Sub]
[инструкции]
End Sub
Рис. 1. Запуск процедуры из Visual Basic Editor
Скачать заметку в формате Word или pdf
Private (необязательное ключевое слово). Указывает на то, что процедура доступна только для других процедур в том же модуле.
Public (необязательное ключевое слово). Указывает на то, что процедура доступна для всех остальных процедур во всех модулях рабочей книги. При использовании в модуле, содержащем оператор Option Private Module, процедура будет недоступна за пределами проекта.
Static (необязательное ключевое слово). Указывает на то, что переменные процедуры сохраняются после окончания процедуры.
Sub (обязательное ключевое слово). Обозначает начало процедуры.
Имя. Любое корректное название процедуры.
Список_аргументов. Представляет заключенный в скобки список переменных, содержащих аргументы, которые передаются в процедуру. Для разделения аргументов используется запятая. Если процедура не использует аргументы, то необходимо включить в объявление процедуры пустые скобки.
Инструкции (необязательные). Корректные инструкции VBA.
Exit Sub (необязательный оператор). Вызывает немедленный выход из процедуры до ее формального завершения.
End Sub (обязательный оператор). Указывает на завершение процедуры.
Выполнение процедуры
Основные способы выполнения, или вызова, процедуры VBA.
1-й способ. С помощью команды Run–>Run Sub/UserForm (Выполнить –> Выполнить процедуру/ пользовательскую форму, рис. 1) в VBE. Альтернатива — нажать <F5> либо воспользоваться кнопкой Run Sub/UserForm панели инструментов Standard (Стандартная, рис. 2).
Рис. 2. Кнопка Run Sub/UserForm на панели Standard VBE
2-й способ. Из диалогового окна Макрос в Excel (рис. 3). Чтобы вызвать окно пройдите по меню Разработчик –> Макрос или нажмите Alt+F8.
Рис. 3. Диалоговое окно Макрос в Excel
3-й способ. С помощью комбинации клавиши <Ctrl> и присвоенной процедуре клавиши (если процедуре присвоена комбинация клавиш). Если в момент создания процедуры ей не была присвоена клавиша, сделать это никогда не поздно. Откройте окно Макрос, как описано выше, выделите процедуру в окне Имя макроса, кликните Параметры, и введите букву в окне Сочетание клавиш (рис. 4).
Рис. 4. Присвоение процедуре комбинации клавиш
4-й способ. Щелкнув на кнопке или любой фигуре рабочего листа. Для этого кнопке или фигуре должна быть присвоена процедура (рис. 5).
Рис. 5. Назначение макроса фигуре
5-й способ. Из другой процедуры. Процедуры Sub и Function могут вызывать другие процедуры.
6-й способ. С помощью пользовательского элемента управления, находящегося на ленте. Кроме того, встроенные элементы управления ленты могут быть «перенастроены» для вызова макроса на выполнение.
7-й способ. Из пользовательского контекстного меню.
8-й способ. После выполнения определенного события. Такими событиями могут выступать открытие рабочей книги, сохранение рабочей книги, закрытие рабочей книги, изменение ячейки, переход на другой рабочий лист и многие другие.
9-й способ. Из окна отладки (Immediate) в VBE. Просто введите название процедуры, укажите все необходимые аргументы и нажмите клавишу <Enter>.
Передача аргументов процедурам
Аргументы обеспечивают процедуру данными, использующимися в ее инструкциях. Аргумент может передавать следующие данные: переменная, константа, массив, объект.
Используются два способа передачи аргументов процедуре.
- По ссылке. При передаче аргумента по ссылке (метод, применяемый по умолчанию) процедуре передается адрес ячейки памяти, в которой хранится переменная. Поэтому изменение аргумента в процедуре приводит к изменению исходной переменной.
- По значению. Передача аргумента по значению фактически означает передачу процедуре копии исходной переменной. Следовательно, изменение аргумента при выполнении процедуры не отражается на исходной переменной.
В следующем примере аргумент процедуры Process передается по ссылке (по умолчанию). После того как процедура Main присваивает переменной MyValue значение 10, она вызывает процедуру Process и передает MyValue в качестве аргумента. Процедура Process умножает значение своего аргумента (с названием YourValue) на 10. По окончании процедуры Process возобновляется выполнение процедуры Main, а функция MsgBox отображает строку MyValue: 100.
Sub Main ()
Dim MyValue As Integer
MyValue = 10
Call Process(MyValue)
MsgBox MyValue
End Sub
Sub Process (YourValue)
YourValue = YourValue * 10
End Sub
Если требуется, чтобы вызываемая процедура не изменяла переменные, полученные как аргументы, измените список аргументов вызываемой процедуры так, чтобы аргументы передавались по значению, а не по ссылке. Для этого добавьте перед аргументом ключевое слово ByVal. Тогда вызываемая процедура будет управлять копией переданных данных, а не самими данными. В следующей процедуре, например, изменения, которые происходят с YourValue в процедуре Process, не влияют на значение переменной MyValue в процедуре Main. В результате функция MsgBox отображает 10, а не 100.
Sub Process(ByVal YourValue)
YourValue = YourValue * 10
End Sub
Обработка ошибок
Чтобы указать. программе, что должно произойти при возникновении ошибки, используется оператор On Error. Вы вправе выбрать один из двух вариантов.
- Проигнорировать ошибку и позволить VBA продолжить выполнение программы. После этого можно проанализировать объект Err, чтобы узнать, какая ошибка произошла, и при необходимости принять меры для ее предотвращения.
- Перейти к специальному разделу кода для обработки ошибок, чтобы выполнить необходимые действия. Этот раздел вводится в конце процедуры и обозначается специальной меткой.
Чтобы программа продолжала выполняться после возникновения ошибки, необходимо вставить в начало процедуры оператор On Error Resume Next. При возникновении ошибки можно использовать объект Err для определения ее номера. Например, на рис. 6 представлена процедура, присваивающая Листу2 имя Исходные данные. Однако, в книге может не быть Листа2. В этом случае появится сообщение об ошибке.
Рис. 6. Процедура присвоения имени Листу Excel, обрабатывающая ошибку
Ссылка на Err эквивалентна обращению к свойству Number объекта Err. Следовательно, два приведенных ниже оператора идентичны:
MsgBox Err
MsgBox Err.Number
Оператор On Error также применяется для определения места в процедуре, к которому должна перейти программа в случае ошибки. Чтобы обозначить это место, используется метка.
On Error GoTo ErrorHandler
Следующая процедура выделяет все ячейки в текущем диапазоне, содержащие формулы, возвращающие число. Процедура также использует оператор If для определения результата: произошла ли ошибка. Оператор On Error GoTo 0 восстанавливает нормальную обработку ошибок перед выходом из процедуры.
Sub SelectFormulas2()
On Error Resume Next
Selection.SpecialCells(xlFormulas, xlNumbers).Select
If Err.Number = 1004 Then MsgBox "
He найдены ячейки с формулами."
On Error GoTo 0
'
…[код]
End Sub
Если свойство Number объекта Err не равно 0, происходит ошибка. С помощью оператора If проверяется, не равно ли свойство Err.Number 1004, и, если это так, отображается окно сообщения. В рассмотренном примере осуществляется проверка кода на предмет обнаружения ошибки с указанным номером.
В следующем примере кода демонстрируется обработка ошибок путем перехода по метке.
Sub ErrorDemo()
On Error GoTo Handler
Selection.Value = 123
Exit Sub
Handler:
MsgBox "
Невозможно присвоить значение выделенному диапазону."
End Sub
В процедуре предпринимается попытка присвоить значение текущему выделенному объекту. Если происходит ошибка (например, не выделен диапазон ячеек или лист защищен), то оператор присваивания выдает ошибку. Оператор On Error задает переход к метке Handler в случае ошибки. Обратите внимание, что перед меткой используется оператор Exit Sub. Программа обработки не выполняется, если ошибок не было.
[1] По материалам книги Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA. – М: Диалектика, 2013. – С. 253–273.
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
If you’ve read other Excel tutorials covering the topics of macros and Visual Basic for Applications, you’ve probably seen the term procedure mentioned several times. If you’re only beginning to read about these topics, you’ll probably see this term in the near future.
And there are good reasons for this:
If you want to become a powerful macro and VBA user, you must understand the concept of procedures, the different types of procedures and how to work with them. In fact, procedures are so important that I’ve included them among the 16 essential terms you need to know in order to learn VBA programming.
However, the post I reference above only provides an introduction to the topic of procedures. Today I’m digging much deeper and explaining, in a lot more detail, one of the most common types of procedures: VBA Sub procedures. More particularly, in today’s VBA tutorial I cover the following topics:
Let’s start with the most basic topic:
What Is A Procedure: VBA Sub Procedures And Function Procedures
When you’re using Excel’s Visual Basic Editor, a procedure is the block of statements that is enclosed by a particular declaration statement and End declaration. The main purpose of a procedure is to carry out a particular task or action.
VBA instructions are generally within a procedure. Therefore, if you want to master Visual Basic for Applications and macros, you should get familiar with this topic.
The 2 most common types of procedures in Visual Basic for Applications are Sub procedures and Function procedures. In this VBA tutorial, I focus on VBA Sub procedures. I cover Function procedures in this separate Excel tutorial.
The main difference between VBA Sub procedures and Function procedures is the following:
- VBA Sub procedures perform an action with Excel.
In other words, when you execute a VBA Sub procedure, Excel does something. What happens in Excel depends on what the particular VBA code says.
- Function procedures carry out calculations and return a value. As explained by John Walkenbach in Excel VBA Programming for Dummies, this value can be either a single value or an array.
If you’ve worked with regular Excel functions and formulas, you already have a good basis to understand how Function procedures work. Function procedures work similarly to regular Excel functions; they carry out certain calculations behind the scenes before returning a value.
According to Walkenbach, one of the foremost Excel authorities:
Most of the macros you write in VBA are Sub procedures.
Additionally, if you use the macro recorder to create a macro, Excel always creates a VBA Sub procedure.
The above comments make it quite clear that you’ll be working quite a bit with VBA Sub procedures. Therefore, let’s start taking a more detailed look at them…
How Does A VBA Sub Procedure Look Like
The image below shows how a basic VBA Sub procedure looks like in the Visual Basic Editor. Notice how, this VBA Sub procedure:
- Begins with the declaration statement “Sub”.
- Has an End declaration statement.
- Has a block of statements that is enclosed by the declaration and End declaration statements.
The purpose of this particular VBA Sub procedure, named “Delete_Blank_Rows_3”, is to delete rows when some of the cells in those rows are blank.
Before we continue, let’s take a look at the first statement of this VBA Sub procedure. There are 3 items:
- The Sub keyword which you already know is used to declare the beginning of the VBA Sub procedure.
- The name of the VBA Sub procedure.
VBA Sub procedure names must follow certain rules, which I explain in the following section.
- Parentheses.
If you’re creating a particular VBA Sub procedure that uses arguments from other procedures, you should list them here. The arguments must be separated by a comma (,).
You can have a VBA Sub procedure without arguments (they’re optional). However, the parentheses themselves aren’t. If the relevant procedure uses no arguments, such as the example above, you must have the set of empty parentheses.
I’ve described 4 elements that are required in any VBA Sub procedure:
- Sub statement.
- Name.
- Parentheses.
- End Sub keyword.
Additionally, I’ve also described 2 elements that are optional:
- The list of arguments that may go within the parentheses.
- The valid VBA instructions that are enclosed by the declaration and End declaration statements.
However, there 3 other main optional items of a VBA Sub procedure. I introduce them below…
But first, let’s take a look at how a procedure with all the most important elements (both optional and required) is structured, as explained in Excel 2013 Power Programming with VBA:
[Private/Public] [Static] Sub name ([Argument list])
[Instructions]
[Exit Sub]
[Instructions]
End Sub
You can learn more about the different parts of the Sub statement (including some that I don’t describe above) at the Microsoft Dev Center.
Now, let’s take a look at the optional elements within the above structure. You can identify these elements because I’ve written them within square brackets ([ ]).
Element #1: [Private/Public].
Private and Public are known as access modifiers.
If you type “Private” at the beginning of a VBA Sub procedure, the only procedures that are able to access it are those stored in the same VBA module.
If, on the other hand, you use “Public”, the VBA Sub procedure has no access restrictions. Despite this, if the procedure is located in a module that uses the Option Private Statement, the VBA Sub procedure can’t be referenced outside the relevant project.
I explain the topic of procedure scope below.
Element #2: [Static].
If you type “Static” before indicating the beginning of the VBA Sub procedure, the variables of the relevant procedure are preserved when the module ends.
Element #3: [Exit Sub].
An Exit Sub statement is used to immediately exit the VBA Sub procedure in which the statement is included.
How To Name A VBA Sub Procedure
Procedures must always be named. The main rules that you must follow when naming a VBA Sub procedure are the following:
- The first character must be a letter.
- Despite the above, the other characters can be letters, numbers or certain (but not any) punctuation characters.
For example, the following characters can’t be used: #, $, %, &, @, ^, * and !.
- Periods (.) and spaces ( ) are not allowed.
- There is no distinction between upper and lowercase letters. In other words “A” is the same as “a”.
- The maximum number of characters a name can have is 255.
In Excel VBA Programming for Dummies and Excel 2013 Power Programming with VBA, Excel authority John Walkenbach suggests that your VBA Sub procedure names:
- Describe the purpose of the VBA Sub procedure or what the procedure does.
- Are not meaningless.
- Usually, combine a verb and a noun.
Walkenbach goes on to explain how certain practitioners name the VBA Sub procedures using sentences that provide a complete description. In his opinion, this method has one main advantage and one main disadvantage:
- On the one hand, using sentences to name VBA Sub procedures pretty much guarantees that the names are descriptive and unambiguous.
- On the other, typing a full sentence requires more time. This may slow you down a little bit while working.
In my opinion, as long as the VBA Sub procedure names you use are descriptive, meaningful and unambiguous, you should be fine. This is an aspect where you can and should choose a style that you find comfortable and appropriate to achieve your own goals and purposes.
How To Determine The Scope Of A VBA Sub Procedure
The word scope refers to how a VBA Sub procedure may be called.
When creating a VBA Sub procedure you have the option of determining which other procedures are able to call it. This is done through the use of the Public or Private keywords that I introduce above and which are one of the optional elements of VBA Sub procedures. However, let’s take a deeper look at what is the meaning of public or private procedures, and how can you determine whether a particular VBA Sub procedure is public or private.
Public VBA Sub Procedures
VBA Sub procedures are, by default, public. When a particular procedure is public, there are generally no access restrictions.
Since the default is that procedures are public, you actually don’t need to use the Public keyword. For example, the following VBA Sub procedure, Delete_Blank_Rows_3, is public. Note that there is no Public keyword.
However, in order to make your VBA code clearer, you may want to include the Public keyword in your VBA Sub procedures. This practice is relatively common among programmers. The following screenshot shows how the VBA code of the Delete_Blank_Rows_3 macro looks like with this keyword included.
In both of the above cases, the VBA Sub procedures are public. In other words, both are essentially the same.
Private VBA Sub Procedures
As explained by Microsoft, when you use the Private keyword, the relevant element can only be accessed from within the context in which it was declared. In the case of private VBA Sub procedures, this means that they can only be accessed or called by those procedures that are stored in the same VBA module. Any procedures within any other module are not able to call it, even if those other modules are in the same Excel workbook.
For example, continuing with the Delete_Blank_Rows_3 macro, the following screenshot shows the relevant VBA code to make the VBA Sub procedure private:
How To Make All VBA Sub Procedures In a Module Private To A VBA Project
In addition to the public and private scopes that I’ve explained above, you can make all the VBA Sub procedures within a particular module accessible only from the VBA project that contains them (but not from other VBA projects) by using a single statement: the Option Private Statement.
The syntax of the Option Private Statement is: “Option Private Module”. If you decide to use it, the statement must go before the first Sub statement of the module.
For example, the following screenshot shows how the VBA code of a module with 3 macros that delete blank rows based on whether a row has empty cells. The last of these VBA Sub procedures is the Delete_Blank_Rows_3 macro that I’ve used as an example in other parts of this VBA tutorial, and doesn’t appear fully.
All of the 3 VBA Sub procedures contained in the module above can only be referenced and accessed from the VBA project that contains them.
When To Make VBA Sub Procedures Private: An Example
One way of executing a VBA Sub procedure is by having another procedure call it. You’re quite likely to use this method of running procedures in the future. In fact, in some cases, you may have certain procedures that aren’t stand-alone and are designed to be called by another Sub procedure.
If you have such procedures within a particular Excel workbook, it is advisable to make them private. If you do this, these private VBA Sub procedures aren’t listed in the Macro dialog which is one of the most common methods to execute a Sub procedure.
Don’t worry if you don’t fully understand how this works yet. I explain how to execute VBA Sub procedures both by calling them from other procedures or by using the Macro dialog below.
How To Execute / Run / Call a VBA Sub Procedure
While working with macros, you may use the terms execute, run or call when referring to the action of executing a VBA Sub procedure. As explained by John Walkenbach in Excel VBA Programming for Dummies, they mean the same thing and “you can use whatever terminology you like”.
You can execute, run or call a VBA Sub procedure in a variety of ways. In this section, I illustrate 9 of the ways in which you can execute a Sub procedure. There is an additional (tenth) option that I don’t explain in this VBA tutorial: executing a macro from a customized context menu. The reason for this is that context menu customization is a different topic that I may cover in a separate guide. If you want to receive emails whenever I publish new posts in Power Spreadsheets, please enter your email below.
The VBA Sub procedure that I use as an illustration is the Delete_Blank_Rows_3 macro that I show you above.
This Excel VBA Sub Procedures Tutorial is accompanied by Excel workbooks containing the data and macros I use throughout this Tutorial (including Delete_Blank_Rows_3). You can get immediate free access to these example workbooks by subscribing to the Power Spreadsheets Newsletter.
Option #1: How To Execute A VBA Sub Procedure Directly From The Visual Basic Editor
According to Walkenbach, this method is the fastest way to execute a VBA Sub procedure. In this case, you’re basically running the procedure directly from the module within the Visual Basic Editor.
Despite the above, I believe you’ll probably not use this method too often. In practice, you’ll usually want to execute VBA Sub procedures while you’re in Excel, not in the VBE. Some of the other options that I describe below allow you to do this.
This particular method only works when the particular VBA Sub procedure that you want to run doesn’t rely on arguments that come from another procedure. The reason for this is that this option doesn’t allow you to pass the arguments from the other procedures to the VBA Sub procedure you’re calling.
If you want to run a VBA Sub procedure that contains arguments, John Walkenbach explains that you can only do it by calling it from another procedure. That procedure from which you make the calling needs to supply the arguments that are required by the Sub procedure you want to execute.
In any case, if you choose to use this first method, you can call a VBA Sub procedure in 3 easy steps:
Step #1: Open The Visual Basic Editor.
You can open the VBE with the keyboard shortcut “Alt + F11”. Alternatively, click on the Visual Basic icon in the Developer tab of the Ribbon.
Step #2: Open The VBA Module That Contains The VBA Sub Procedure You Want To Execute.
You want the Visual Basic Editor to show you the VBA code of the Sub procedure that you want to call.
You can do this in several ways, which I explain in The Beginner’s Guide to Excel’s Visual Basic Editor. One of the methods you can use is to double-click on the relevant VBA module.
For example, if the VBA Sub procedure is within Module1, simply double-click on “Module1” in the Project Explorer of the VBE.
As a result of the above, the Visual Basic Editor displays the relevant code in the Programming Window and places the cursor there:
Step #3: Run The VBA Sub Procedure.
You can call a VBA Sub Procedure directly from the relevant module in the Visual Basic Editor using any of the following methods:
- Click on “Run Sub/UserForm” in the Run menu.
- Use the keyboard shortcut “F5”.
Option #2: How To Execute A VBA Sub Procedure Using The Macro Dialog
This method only works if the VBA Sub procedure you want to call doesn’t contain arguments. The reason for this is the same that I explained previously: You can’t specify those arguments.
Regardless of the above, this option is one of the most commonly used methods to execute VBA Sub procedures. When using it, you can run a VBA Sub procedure in 2 simple steps. Let’s take a look at them.
Step #1: Open the Macro dialog.
You can ask Excel to open the Macro dialog box in either of the following ways:
- Use the “Alt + F8” keyboard shortcut.
- Click on “Macros” in the Developer tab of the Ribbon.
Excel displays the Macro dialog, which looks roughly as follows:
Step #2: Select The Macro You Want To Execute And Execute It.
You’ve probably notice in the screenshot above that there is only 1 macro in all open Excel workbooks (Delete_Blank_Rows_3). Therefore, this is the only macro listed and, obviously, is the macro that we’ll be executing.
You already know that this method for running macros doesn’t allow you to call VBA Sub procedures that use arguments. Therefore, any such Sub procedure wouldn’t even appear in the Macro dialog.
Additionally, the Macro dialog only shows public procedures. However, you can still execute private VBA Sub procedures from the Macro dialog. To do this, type the name of the relevant private Sub procedure in the Macro name field that appears in the image below.
Similarly, the Macro dialog doesn’t show VBA Sub procedures that are contained in Add-Ins. In that case, you can also execute the procedure by typing the name of the relevant macro in the Macro name field.
In any case, the rules to select and execute a macro are the same regardless of whether you have only 1 or several macros in the open Excel workbooks. You can do the selection and execution in either of the following ways:
- Double-click on the macro you want to execute. For example, in the image below you’d double-click on the macro Delete_Blank_Rows_3.
- Click on the macro you want to execute to select it, and click on the Run button.
Option #3: How To Execute A VBA Sub Procedure Using A Keyboard Shortcut
You can execute VBA Sub procedures by using keyboard shortcuts. To run a macro using this method, simply press the relevant key combination.
This option doesn’t work for macros that use arguments. I explain the reasons for this above.
However, you may be wondering:
How does one assign a keyboard shortcut to a macro?
There are 2 main ways of assigning a keyboard shortcut to a macro.
The first method to assign a keyboard shortcut to a macro works only if you’re using the macro recorder. If this is the case, during the recording process (which I explain in detail in an Excel macro tutorial for beginners), you’ll encounter the Record Macro dialog. This dialog allows you to determine whether the macro you’ll be recording can be called by a keyboard shortcut and which keys compose that shortcut.
The second method of assigning a keyboard shortcut to a macro is perhaps more interesting. This method allows you to assign or edit the keyboard shortcut of any macro in the following 3 quick steps.
Step #1: Open The Macro Dialog.
You can access the Macro dialog by using the “Alt + F8” keyboard shortcut or going to the Developer tab and clicking on “Macros”.
Step #2: Select The Macro You Want To Assign A Keyboard Shortcut To.
On the Macro dialog, simply select the VBA Sub procedure you want to assign a macro to and click on “Options…” on the lower right side of the dialog box. For example, in the screenshot below I’ve selected the macro Delete_Blank_Rows_3.
Step #3: Assign A Keyboard Shortcut.
When Excel displays the Macro Options dialog, assign the keyboard shortcut and click on the OK button at the bottom of the dialog box.
Keyboard shortcuts are of the form “Ctrl + Letter” or “Ctrl + Shift + Letter”.
When selecting a keyboard shortcut, be mindful about what is the combination you’re assigning to the VBA Sub procedure. The reason for this is that assigned macro keyboard shortcuts override built-in shortcuts. Therefore, if you choose a shortcut that is the same as a built-in one, you’ll be disabling the latter.
For example, “Ctrl + B” is the default built-in keyboard shortcut for bold. If you were to assign the same shortcut to a macro, you’ll not be able to use the shortcut in order to make text bold.
Using keyboard shortcuts of the form “Ctrl + Shift + Letter” reduces the risk of overriding pre-existing keyboard shortcuts. In any case, remember to be careful about what is the exact combination that you assign.
Option #4: How To Execute A VBA Sub Procedure Using A Button Or Other Object
The idea behind this method is that you can assign or attach a macro to certain “objects”. I put quotations around the word objects because, in this particular case, I’m not referring to any type of object but to certain types of objects that Excel allows you to put in a worksheet. In Excel 2013 Power Programming with VBA, John Walkenbach classifies these objects into 3 classes:
- ActiveX controls.
- Form controls.
- Inserted objects, such as shapes, text boxes, clip art, SmartArt, WordArt, charts and pictures.
In this guide I explain how you can attach a macro to a button from the Form controls or to other inserted objects.
How To Assign A Macro To A Form Control Button
Let’s look at how you can attach a macro to a Form control button in just 4 steps.
Step #1: Insert A Button.
Go to the Developer tab in the Ribbon. Click on “Insert” and choose the Button Form Control. The following screenshot shows you the location of all of these:
Step #2: Create The Button.
Once you’ve clicked on the Button Form Control, you can actually create the button in the Excel worksheet by simply clicking on section of the worksheet where you want the top left corner of the button to appear.
For example, if I want the button to appear in cell B5, I click on the top left corner of that cell.
Step #3: Assign A Macro To The Button.
Once you’ve clicked on the location where you want the button to appear, Excel displays the Assign Macro dialog.
Excel suggests a macro that is based on the button’s name. In the case below, this is “Button1_Click”.
In many cases, this suggestion isn’t going to match what you want. Therefore, select the macro that you actually want to assign to the button and click on the OK button at the bottom right corner of the Assign Macro dialog.
In the example we’ve been working with, the macro to be assigned to the button is Delete_Blank_Rows_3.
Step #4: Edit Button (Optional).
Once you’ve completed the 3 steps described above, Excel shows the button that you’ve created. Now you can execute the relevant VBA Sub procedure by simply clicking on the button.
After the button has been created, you can edit it in a few ways. The following are 4 of the main things you can change:
- Size: The button created by Excel has the default size. You can change this size by dragging any of the handles with your mouse.
For example, if I want to increase the size of the button so that it covers 4 cells (B5, B6, C5 and C6), I drag the bottom right handle as required.
If the handles are not visible, you can make Excel show them by right-clicking on the button or pressing the left mouse button at the same time as the Ctrl key.
- Location: You can modify the location of the button by dragging it with your mouse.
You can only drag the button with the left button of your mouse if the handles (as shown above) are visible. Therefore, if they’re not, right-click on the button or press the left mouse button at the same time of the the Ctrl key before attempting to drag it somewhere else.
Alternatively, you can simply drag the button using the right mouse button. For example, if you want to move the button a couple of cells down, so that it covers cells B8, B9, C8 and C9, drag the button with the right mouse until the desired point. As you drag, Excel shows a shadow in the new location, but the button continues in the original spot.
Once you let go off the right mouse button, Excel displays a contextual menu. Click on “Move Here” to move the button.
- Text: To edit the text of the button, right click on the button. Excel displays a contextual menu, where you can choose “Edit Text”.
Excel places the cursor inside the button so you can modify the text as you desire. Once you’re done, click outside the button to confirm the change.
In the case used as an example throughout this VBA tutorial, a more appropriate button label is Delete Blank Rows. Once the process is completed, the button looks as follows: - Assigned macro: If necessary, you can change the VBA Sub procedure that has been assigned to any button by right-clicking on it and selecting “Assign Macro…”.
In that case, Excel takes you back to the Assign Macro dialog, which allows you to select which particular VBA Sub procedure is assigned to the button. You’re already familiar with this dialog box, which I explain above.
In addition to the above, you can edit several other aspects of the button by right-clicking on it and selecting “Format Control…”.
Excel displays the Format Control dialog. By using this dialog you can determine several settings of the macro button.
Some of the main settings you can modify from the Format Control dialog are the following:
- Font, including typeface, style, size, underline, color and effects.
- Text alignment and orientation.
- Internal margins.
- Size.
- Whether the button moves and/or sizes with cells.
How To Assign A Macro To Another Object
In addition to the ability to assign macros to Form Control buttons, Excel allows you to assign a macro to other objects. As I explain above, these objects include shapes, text boxes, clip art, SmartArt, WordArt, charts or pictures.
Attaching a VBA Sub procedure to these objects is very easy. Let’s see how to do it in the case of a WordArt object which says “Delete Blank Rows”.
Step #1: Open The Assign Macro Dialog.
To open the Assign Macro dialog, right-click on the object and select “Assign Macro…”
Step #2: Select Macro To Assign.
Once you’ve completed the first step above, Excel displays the Assign Macro dialog. You’re already familiar with this dialog box.
To complete the process of assigning a VBA Sub procedure to the object, simply select the macro you want to assign and click the OK button on the bottom right corner of the dialog box. In the example used throughout this VBA tutorial, the macro to be assigned is Delete_Blank_Rows_3.
Once you’ve completed the 2 steps above, you can execute the VBA Sub procedure by simply clicking on the relevant object.
Option #5: How To Execute A VBA Sub Procedure From Another Procedure
In Excel 2013 Power Programming with VBA, John Walkenbach explains that executing a VBA Sub procedure from another procedure is fairly common. The term used to refer to this way of running a procedure is procedure call and the code that is invoking the procedure is known as the calling code.
As explained by Microsoft, the calling code specifies the relevant Sub procedure and transfers control to it. Once the called procedure has ran, control returns to the calling code.
According to Walkenbach, there are several reasons why calling other procedures is advisable, including the following:
- As explained by Microsoft, this makes VBA code simpler, smaller and clearer. As a consequence, it is easier to understand, debug, maintain or modify.
More generally, maintaining several separate and small VBA Sub procedures is a good practice. Even though you can create very long procedures, I suggest you avoid this. Instead, when working with Visual Basic for Applications, follow Walkenbach’s suggestion of (i) creating several small procedures, and then (ii) create a main procedure that calls the other small procedures.
The following diagram shows how a possible structure of several VBA Sub procedures calling each other can work. The main procedure appears on the left side. This main procedure then calls each of the smaller VBA Sub procedures, all of which appear on the right side.
- It helps you avoid repetition and redundancies.
There are cases where you’ll need to create a macro that carries out the same action in several different places. You can either create a VBA Sub procedure that is called in all those places, or enter the full piece of VBA code each and every time. As you can imagine, having a VBA Sub procedure that is executed in those different places is a more appropriate option.
- If you have certain VBA Sub procedures that you use frequently, you can store them in a frequently-used module which can be easily imported into all your VBA projects. Once the module is imported, you can easily call those macros whenever you need them.
The alternative is to always be copying and pasting VBA code into your new VBA procedures. You’ll probably agree that the first option (importing a module with frequently-used VBA Sub procedures) is easier and faster to implement on your day-to-day work.
There are 3 methods you can use to call a VBA Sub procedure from another procedure. Let’s take a look at each of them.
Method #1: Use VBA Sub Procedure’s Name
Under this method, you enter the following 2 things in the VBA code of the calling Sub procedure:
- #1: The name of the procedure that is being called.
- #2: The arguments of the procedure that is being called. The arguments are separated by commas.
In other words, the syntax you must apply when using this method is simply “Procedure_Name Arguments”.
As a very simple example, let’s assume that you create a VBA Sub procedure that only calls the Delete_Blank_Rows_3 macro.
This new macro doesn’t make much sense, because you may as well simply execute the Delete_Blank_Rows_3 macro directly. However, since the structure is extremely simple, I’ll use it as an example so you can clearly see how this method works.
The new VBA Sub procedure is called “Calling_Delete_Blank_Rows”. The macro contains just 3 statements:
Sub Calling_Delete_Blank_Rows()
Delete_Blank_Rows_3
End Sub
The following screenshot shows the whole VBA code (including comments) as it appears in the Visual Basic Editor:
You can, obviously, add statements to the VBA Sub procedure used as an example in order to make it more realistic and useful.
Method #2: Use Call Statement
To apply this method you must proceed, to a certain extent, similarly as with method #1 above. In this particular case, you also enter the name and arguments of the procedure that is being called within the VBA code of the calling Sub procedure.
There are, as explained by Microsoft, 2 main differences between methods #1 and #2:
- In method #2, you use the Call statement. This keyword goes before the name of the procedure you’re calling.
- In method #2, the arguments of the VBA Sub procedure being called are enclosed in parentheses.
In other words, when using method #2, the syntax you must apply is “Call Procedure_Name (Arguments)”.
Let’s see how this looks in practice. Again, we’ll be creating a very simple VBA Sub procedure whose sole purpose if to call the Delete_Blank_Rows_3 macro. The VBA code behind this new macro, called “Delete_Blank_Rows_2”, is as follows:
Sub Calling_Delete_Blank_Rows_2()
Call Delete_Blank_Rows_3
End Sub
Within the Visual Basic Editor environment, this VBA Sub procedure looks as follows:
The question you may have is, if I can use method #1 which doesn’t require the use of any keyword to call another VBA Sub procedure, why would I use method #2 which requires the use of the Call keyword?
The main reason for using this method #2 is simple: clarity. In the words of John Walkenbach:
Even though it’s optional, some programmers always use the Call keyword just to make it perfectly clear that another procedure is being called.
Despite the above, Microsoft states that the use of the Call keyword is generally not recommended. According to the information available at the Microsoft Dev Center, the Call statement is usually used when the VBA Sub procedure you’re calling doesn’t begin with an identifier.
Method #3: Use The Application.Run Method
You can use the Application.Run method to run a VBA Sub procedure.
As explained in Excel 2013 Power Programming with VBA, this particular method is useful if you want to call a VBA Sub procedure whose name is assigned to a variable. Using the Application.Run method is the only way of running a procedure like that. The reason for this is that, when you use the Application.Run method, you’re taking the variable and passing it as an argument to the Run method.
You can see an example of this method being applied in the above-cited Excel 2013 Power Programming with VBA.
How To Call A VBA Sub Procedure From A Different Module
When you call a VBA Sub procedure from another procedure, the process followed to search for the relevant Sub procedure is as follows:
- First, the search is carried in the same module.
- If the desired VBA Sub procedure is not found in the same module, search among the accessible procedures in the other modules within the same Excel workbook takes place.
A logical consequence of the above is that, in order for a procedure to be able to call a private procedure, both procedures must be in the same module.
There may be cases where you have procedures that have the same name but are in different modules (they can’t be in the same module). If you try to call one of these VBA Sub procedures by simply stating its name, an error message (Ambiguous name detected) is displayed.
However, this doesn’t mean that you can’t ask Excel to execute the procedure that you want. More precisely:
If you want to call the VBA Sub procedure that is located in a different module, you need to clarify this by:
- Stating the name of the relevant module before the name of the procedure.
- Using a dot (.) to separate the name of the module and the name of the procedure.
The precise syntax you must use in these cases is “Module_Name.Procedure_Name”.
Now you know how to handle the cases where you need to call a VBA Sub procedure that is in a different module. However, there are times where you may want to run procedures that are not only in a different module but in an altogether different Excel workbook. Therefore, let’s take a look at…
How To Call A VBA Sub Procedure From A Different Excel Workbook
In Excel 2013 Power Programming with VBA, John Walkenbach explains that there are 2 main methods to execute a VBA Sub procedure that is stored in a different Excel workbook:
- Establish a reference to the other workbook.
- Use the Run method and specify the name of the workbook explicitly.
Let’s take a look at how you can use either of these methods:
Method #1: Establish A Reference To Another Excel Workbook.
You can establish a reference to an Excel workbook in the following 2 simple steps:
Step #1: Open The References Dialog.
Inside the Visual Basic Editor, go to the Tools menu and select “References…”.
Step #2: Select The Excel Workbook To Add As Reference.
Once you’ve completed step #1 above, Excel displays the References dialog.
This dialog box lists all the possible references you can use and establish. All the Excel workbooks that are currently open are listed there. Notice, for example, all the Excel workbooks that appear in the screenshot below.
In this particular case, Excel workbooks are not listed using their regular file name. Instead, they appear under their VBE project names. Since “VBAProject” is the default name for every project, the situation below (where “VBAProject” appears several times) isn’t uncommon.
In order to help you identify which particular VBA project you want to add as reference, you can use the location data that appears at the bottom of the dialog box. Alternatively, you can go back to the Visual Basic Editor and change the relevant project’s name.
In order to add an Excel workbook that is currently open as reference, double-click on it or select it (by checking the box to its left) and click the OK button.
Even though the References dialog only lists Excel workbooks that are currently open, you can also create references to workbooks that aren’t currently open. To do this, you need to first click on the Browse button on the right side of the References dialog.
The Add Reference dialog is displayed. This dialog looks pretty much like any other browsing dialog box you’ve used before. Use the Add Reference dialog to browse to the folder where the relevant Excel workbook is saved, select the workbook and click on “Open”.
In the example below, I’m adding one of the sample Excel workbooks for this post.
Once you’ve completed the step above, the relevant Excel workbook is added to the bottom of the list of Available References in the References dialog. You can then select it and click the OK button to add it as a reference.
Done! Once you’ve carried out the 2 steps above, the new references that you’ve added are listed in the Project Window of the Visual Basic Editor under the References node.
You can now start calling procedures that are in the reference Excel workbook as if they were in the same workbook of the VBA Sub procedure that is calling them. You can do this, for example, by using the Sub Procedure’s name or the Call keyword.
In Excel 2013 Power Programming with VBA, John Walkenbach suggests that, in order to clearly identify a procedure that is within a different Excel workbook, you use the following syntax:
Project_Name.Module_Name.Procedure_Name
In other words, he suggests that you first specify the name of the project, followed by the name of the module and the name of the actual VBA Sub procedure.
You’ll notice that whenever you open an Excel workbook that references another workbook, the latter is opened automatically. Additionally, you won’t be able to close the referenced Excel workbook without closing the one that you originally opened. If you try to do this, Excel warns you that the workbook is currently referenced by another workbook and cannot be closed.
Method #2: Use The Application.Run Method.
You can use the Application.Run method to execute a VBA Sub procedure.
If you choose to apply this method, you don’t need to create any reference (as explained above). However, the Excel workbook that contains the VBA Sub procedure that you want to execute must be open.
You can see an example of this method being applied in the above-cited Excel 2013 Power Programming with VBA.
Option #6: How To Execute A VBA Sub Procedure Using The Ribbon
You can customize the Ribbon in order to add a new button which is assigned to a particular VBA Sub procedure. Then, you can execute the relevant macro by simply clicking on its button.
I cover the topic of Ribbon customization (with code) in this Excel tutorial. In this particular post, I show you (in a slightly simplified manner) one of the ways in which you can add a button that allows you to execute a VBA Sub procedure from the Ribbon. As with the other sections throughout this VBA tutorial, I use the Delete_Blank_Rows_3 macro as an example.
As explained by Excel experts Bill Jelen and Tracy Syrstad in Excel 2013 VBA and Macros, this method of executing a VBA Sub procedure is most appropriate for macros that are in the personal macro workbook.
The personal macro workbook is a special workbook where you can store macros that later you can apply to any Excel workbook. In other words, the macros saved in the personal macro workbook are available when you use Excel in the same computer, regardless of whether you’re working on a different Excel workbook from the one you were when you created the macro.
Let’s check out these 5 easy steps to add a new button to the Ribbon.
Step #1: Access The Excel Options Dialog.
Right-click anywhere on the Ribbon to have Excel display a context menu. On the context menu, select “Customize the Ribbon…”.
Step #2: Choose To Work With Macros.
At the top left corner of the Customize Ribbon tab in the Excel Options dialog, you’ll see the Choose commands from drop-down menu.
This drop-down menu allows you to choose from several sub-sets of commands to browse when adding commands to the Ribbon. Click on it and select “Macros”.
Once you’ve done this, Excel displays all the Macros that you can currently add to the Ribbon on the Choose commands from list. This is the list that appears just below the Choose commands from drop-down menu, as shown in the image below.
Step #3: Select The Tab And Group Of Commands To Which You Want To Add The Macro.
The Customize the Ribbon list is located on the right side of the Excel Options dialog. Here is where you find all the commands that are currently in the Ribbon. These commands are organized by tabs and groups of commands.
For example, the screenshot below shows how, within the Developer tab, there are 5 group of commands: Code, Add-Ins, Controls, XML and Modify.
In the Customize the Ribbon list is where you’ll be able to choose the location of the button that you’re about to add to the Ribbon. You can expand and contract any tab or group of commands by clicking on the “+” and “-” signs that appear on the left side of the list.
You can also add new tabs or new command groups (and rename them) using the buttons that appear below the Customize the Ribbon list.
Therefore, you can either select a pre-existing command group or create a new one for purposes of adding a macro to the Ribbon. Below I show you how you can add a new tab and group of commands to the Ribbon.
In this example, and for purposes of organization, I add a new tab just after the Developer tab by clicking on “Developer” and the New Tab button.
I rename the tab by selecting the newly added tab and clicking on the Rename button.
Excel displays the Rename dialog. I enter the new display name (Macro Collection) and click the OK button.
I repeat the process with the command group. First, I select “New Group (Custom)” and click on the Rename button.
Excel displays a slightly different Rename dialog, which provides you the opportunity to choose a symbol that represents the new group of commands. I choose an icon, enter the new display name for the command group (Delete Blank Rows) and click the OK button.
Once everything is in order, I select the group of commands to which I want to add the macro. In this example, that command group is the newly created Delete Blank Rows group.
Step #4: Add VBA Sub Procedure To The Ribbon.
To add a macro to the Ribbon, simply select the relevant item in the Choose commands from list and click the Add button that appears in the middle of the Excel Options dialog.
The following screenshot shows how this works for the Delete_Blank_Rows_3 macro:
Step #5: Finish The Process.
Click on the OK button at the lower right corner of the Excel Options dialog to finish the process.
Excel closes the Excel Options dialog and implements the changes you’ve made. Notice how, in the case of the example, Excel has added a new tab (Macro Collection), group of commands (Delete Blank Rows) and button (Delete_Blank_Rows_3) to the Ribbon.
Once you’ve completed the process described above for any VBA Sub procedure, you’ll be able to execute it by simply clicking on the relevant button in the Ribbon. This icon is enabled even if the Excel workbook that is holding the macro is closed. If this is the case, Excel opens the relevant Excel workbook that contains the macro before actually running it.
Option #7: How To Execute A VBA Sub Procedure Using The Quick Access Toolbar
The Quick Access Toolbar is the small toolbar located on the upper left corner of Excel.
Just as with the Ribbon, you can customize the Quick Access Toolbar in order to add a button that is assigned to a VBA Sub procedure. Afterwards, you can execute the macro by clicking that button.
Also, just as with the method of executing VBA Sub procedures using the Ribbon, this method is most appropriate when the macro you want to add to the Quick Access Toolbar is stored in the personal macro workbook. However, as explained in Excel 2013 VBA and Macros, if the VBA Sub procedure you want to add to the Quick Access Toolbar is stored in the Excel workbook you’re currently working on, you can indicate that Excel should only show the button when that particular workbook is open.
I’ll cover how to customize the Quick Access Toolbar more in detail in future tutorials. For the moment, let’s take a look at how you can add a macro button to the Quick Access Toolbar in 5 easy steps.
Step #1: Access The Excel Options Dialog.
You already know one of the ways you can access the options dialog. I will be covering additional methods of doing this in future Excel tutorials.
However, for this particular case, the fastest way to access the Quick Access Toolbar tab (which is the one we need) of the Excel Options dialog is the following:
Right-click on the Quick Access Toolbar and select “Customize Quick Access Toolbar…”.
Once you’ve completed this step, Excel opens the Options dialog.
Step #2: Choose For Which Excel Workbooks The Customized Quick Access Toolbar Applies.
At the top right corner of the Excel Options dialog, you can see the Customize Quick Access Toolbar drop-down menu. This is the section that allows you to determine to which workbooks does the customized Quick Access Toolbar with the macro button applies.
Click on the Customize Quick Access drop-down menu and select your preferred option.
- If you want the macro button to appear in all Excel workbooks, select “For all documents (default)”. As implied by the description, this is the default setting.
- If the macro button should only appear in a particular Excel workbook, select that particular workbook.
The screenshot below shows the rough look of the options above when the Customize Quick Access Toolbar drop-down menu is expanded. In this particular case, the only Excel workbook that is open is called “Book 1”:
For this example, I simply leave the default option. Therefore, the customization applies to all Excel workbooks.
Step #3: Choose To Work With Macros.
At the top left corner of the Quick Access Toolbar tab in the Excel Options dialog you can find the Choose commands from drop-down menu.
Click on this drop-down menu and select “Macros”.
Step #4: Add Macro To Quick Access Toolbar.
After you’ve completed step #3 above, the Excel Options dialog displays a list of macros that you can add to the Quick Access Toolbar. You can find these macros in the Choose commands from list box which appears on the left side of the Quick Access Toolbar tab of the dialog box.
Choose the macro you want to add from the Choose commands from list box and click on the Add button that appears in the middle of the Excel Options dialog. The following screenshot shows how to add the Delete_Blank_Rows_3 macro:
Step #5: Click The OK Button.
Once you’ve completed the 4 steps above, Excel adds the relevant macro button to the Quick Access Toolbar. Notice how it appears in the Customize Quick Access Toolbar list on the right side of the Excel Options dialog:
To complete the process and implement the changes, simply press the OK button on the lower right corner of the Excel Options dialog.
Once you’re back in Excel, notice how the relevant macro button has been added to the Quick Access Toolbar.
Now you can execute the relevant VBA Sub procedure by simply clicking on the button that you’ve just added to the Quick Access Toolbar.
Option #8: How To Execute A VBA Sub Procedure When A Particular Event Occurs
Excel allows you to determine that a particular VBA Sub procedure is to be executed whenever a certain event occurs. I cover this particular topic in more detail here.
In Excel 2013 Power Programming with VBA, John Walkenbach provides several examples of events, such as the following:
- Opening an Excel workbook.
- Entering data in a worksheet.
- Saving a file.
- Clicking a CommandButton ActiveX control.
The name for VBA Sub procedures that are executed when a particular event occurs is “event handler procedure”. These procedures have 2 main characteristics that distinguish them from other types of VBA Sub procedures:
- Their names have a different structures than usual. More particularly, their name syntax is “object_EventName”. In other words, these names are composed of 3 elements:
Element #1: An object.
Element #2: An underscore.
Element #3: The name of the relevant event.
- The VBA module in which they’re stored is the module for the relevant object.
Event handler procedures are different topic that requires its own VBA tutorial. If you’re interested in learning more about this topic, please refer to Chapter 17 of the above cited Excel 2013 Power Programming with VBA.
Option #9: How To Execute A VBA Sub Procedure From The Immediate Window Of The Visual Basic Editor
Executing a VBA Sub procedure from the Immediate Window of the VBE is useful, in particular, if you’re in the middle of the developing a particular procedure within the Visual Basic Editor environment.
When displayed, the Immediate Window usually appears at the bottom of the Visual Basic Editor.
You can check out my introduction to the Immediate Window by checking my post about the Visual Basic Editor. You can find this, along with all other VBA tutorials within Power Spreadsheets, in the Archives.
In order to execute a VBA Sub procedure using the Immediate Window, simply type the name of the relevant procedure in the Immediate Window and press the Enter key.
Conclusion
The concept of procedures is frequently used in the books and blogs that cover the topic of macros and Visual Basic for Applications. If you don’t understand what Excel authorities are talking about when using this term, you’ll have a very hard time learning VBA.
Perhaps most importantly, once you reach a certain expertise level with Excel you must work with VBA Sub procedures.
Therefore, if your purpose is becoming a powerful Excel user, understanding VBA Sub procedures and mastering how to work with them is not optional. However, after reading this VBA tutorial you have a good understanding of the concept itself. Additionally, you probably also have a basic understanding of how to work with Sub procedures in practice, including the following topics:
- What is the syntax you should use when creating VBA Sub procedures.
- What rules and suggestions to bear in mind when naming a VBA Sub procedure.
- What are the different scopes that a VBA Sub procedure can have, and how you can (and whether should) limit that scope.
- What are some of the most common ways to execute a VBA Sub procedure.
Books Referenced In This Excel Tutorial
- Jelen, Bill and Syrstad, Tracy (2013). Excel 2013 VBA and Macros. United States of America: Pearson Education, Inc.
- Walkenbach, John (2013). Excel VBA Programming for Dummies. Hoboken, NJ: John Wiley & Sons Inc.
- Walkenbach, John (2013). Excel 2013 Power Programming with VBA. Hoboken, NJ: John Wiley & Sons Inc.