Если ты уже пробовал писать макросы в Excel на VBA, то наверняка встречал слова Sub и Function. Оба они вроде как запускают код — но ведут себя по-разному. И вот тут многие путаются: «А что использовать — Sub или Function?»
Разберёмся по-человечески, без занудства.

Процедура и функция
Когда ты пишешь Sub, ты создаёшь процедуру — кусок кода, который что-то делает, но ничего не возвращает. Например, выделяет диапазон, форматирует таблицу, выводит сообщение на экран. Это как «повар, который готовит ужин, но не приносит его на стол» — делает работу, но не возвращает результат.
Sub Привет()
MsgBox «Привет, мир!»
End Sub
Вот классическая процедура: запускаешь — появляется окно с текстом. Всё. Результата, который можно «использовать» дальше, нет.
А вот Function — это уже функция. Она делает что-то похожее, но возвращает значение.
То есть она не просто выполняет действия, а выдаёт результат, который можно сохранить в переменную, вывести в ячейку, использовать в формулах Excel.
Пример простой, как утренний кофе:
Function Квадрат(число As Double) As Double
Квадрат = число * число
End Function
Теперь можно в Excel прямо в ячейке написать:
=Квадрат(5)
и получить 25.
Видишь разницу? Процедура — делает, функция — возвращает.

Немного философии из Excel-жизни
Если Sub — это исполнитель («сделай отчёт, напиши письмо»),
то Function — советчик («посчитай, сколько нужно»).
- Sub хороша для действий: создать таблицу, скопировать, удалить, форматировать.
- Function нужна для расчётов: посчитать процент, сумму, среднее, проверить условие.
Вот пример, где обе встречаются в одном файле — и работают вместе:
Function Скидка_1(сумма As Double) As Double
If сумма > 10000 Then
Скидка_1 = сумма * 0.1
Else
Скидка_1 = 0
End If
End Function
Sub ПоказатьСкидку_1()
Dim итог As Double
итог = Скидка_1(12000)
MsgBox «Размер скидки: » & итог
End Sub
Расчет скидки в Excel

Функция считает, процедура VBA показывает результат. Красиво и логично!
А можно свои функции вставлять прямо в Excel?
Да! И в этом кайф VBA.
Любую функцию, которую ты создашь, можно использовать прямо как встроенную — в ячейке, среди обычных формул.
Например, создал Function СуммаВДолларах(рубли As Double), а потом пишешь в ячейке:
=СуммаВДолларах(A1)
и получаешь пересчитанное значение.
Главное правило, чтобы не путаться
- Если тебе нужно что-то посчитать и вернуть результат, используй Function.
- Если тебе нужно что-то сделать (отформатировать, показать, вставить) — пиши Sub.
И знаешь, что самое интересное? Когда начинаешь понимать эту разницу, VBA перестаёт казаться громоздким.
Он становится понятным инструментом, где всё подчинено здравому смыслу: одни модули работают, другие считают.
Факт напоследок:
Почти все современные языки программирования — от Python до JavaScript — тоже делятся на процедуры и функции. Просто называются они по-другому. А идея всё та же, что и в BASIC шестидесятых: делай что-то — или возвращай результат.
Первоначально опубликовано на моем канале в Дзене.