Операторы и функции vba excel. Операторы и встроенные функции VBA

Dim nResult As Integer

nMult1 = CInt(InputBox("Введите первое число: ")) nMult2 = CInt(InputBox("Введите второе число: ")) nResult = fMultiply(nMult1, nMult2)

Selection.InsertAfter nResult Selection.Collapse wdCollapseEnd

4. Для того чтобы закомментировать код AutoNew() , выделите весь код этой процедуры (включая Public Sub AutoNew() и End Sub ) и нажмите кнопку Comment Block на панели инструментов Edit .

3.9. Встроенные функции языка VBA

3.9.1. Что такое встроенные функции

В языке программирования VBA предусмотрено несколько десятков встроенных функций . Они доступны в любой программе на языке VBA, при этом безразлично, в среде какого программного продукта мы находимся - Excel, Word, Access или, к примеру, AutoCAD. Используются они очень активно, и во многих ситуациях без них не обойтись. Профессиональные программисты применяют их совершенно автоматически, а обычным пользователям хочется посоветовать потратить несколько часов на знакомство с ними, потому что без знания этих функций эффективно работать в VBA не получится. Дополнительным аргументом в пользу их изучения является то, что практически идентичный набор функций есть в обычном Visual Basic и VBScript, а многие из этих функций с теми же названиями и синтаксисом встречаются и в других языках программирования - C++, Delphi, Java, JavaScript и т. п.

В справке по VBA встроенные функции сгруппированы по буквам (рис. 3.2).

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

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

Рис. 3.2. Справка по встроенным функциям

3.9.2. Функции преобразования и проверки типов данных

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

преобразование из строкового значения в числовое при приеме значения от пользователя через InputBox() ;

преобразование значения даты/времени в строковое, когда нам нужно отобразить дату или время единообразно вне зависимости от региональных настроек на компьютерах пользователей;

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

Чаще всего для конвертации типов данных используются функции, имя которых складывается из префикса "C" (от слова Convert ) и имени типа данных. Перечень этих функций следующий: CBool() , CByte() , CCur() , CDate() ,

CDbl(), CDec(), CInt(), CLng(), CSng(), CStr(), CVar(), CVDate(), CVErr().

Просмотреть, что в итоге получилось, можно при помощи функции TypeName() , которая возвращает имя используемого типа данных, например:

nVar1 = CInt(InputBox("Введите значение")) MsgBox TypeName(nVar1)

В данном случае эта функция вернет "Integer" .

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

Str() - позволяет перевести числовое значение в строковое. Делает почти то же самое, что и CStr() , но при этом вставляет пробел перед положительными числами.

Val() - "вытаскивает" из смеси цифр и букв только числовое значение. При этом функция читает данные слева направо и останавливается на первом нечисловом значении (допускается единственное нечисловое значение - точка, которая будет отделять целую часть от дробной). Очень удобно, когда у нас вперемежку с числовыми данными прописываются единицы измерения или валюта.

IsNumeric() и IsDate() - проверяют значения на соответствие, чтобы не возникло ошибок при конвертации. Для проверки на соответствие специальным значениям можно использовать функции IsArray() , IsEmpty() ,

IsError(), IsMissing(), IsNull() и IsObject(). Все эти функции возвраща-

ют True или False в зависимости от результатов проверки переданного им значения.

Hex() и Oct() - преобразовывают десятичные данные в строковое представление шестнадцатеричных и восьмеричных значений.

3.9.3. Строковые функции

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

Asc() - эта функция позволяет вернуть числовой код для переданного символа. Например, Asc("D") вернет 68. Эту функцию удобно использовать для того, чтобы определить следующую или предыдущую букву. Обычно она используется вместе с функцией Chr() , которая производит обратную операцию - возвращает символ по переданному его числовому коду. Например, такой код в Excel позволяет написать в ячейки с A1 по A20 последовательно буквы русского алфавита от A до У:

Dim n, nCharCode As Integer n = 1

nCharCode = Asc("А") Do While n <= 20

ActiveWorkbook.ActiveSheet.Range("A" & n).Value = Chr(nCharCode)

Синтаксис и программные конструкции VBA

nCharCode = nCharCode + 1 Loop

Варианты этой функции - AscB() и AscW() . AscB() возвращает только первый байт числового кода для символа, а AscW() возвращает код для символа в кодировке Unicode.

Chr() - возвращает символ по его числовому коду. Помимо того, что используется в паре с функцией Asc() (см. предыдущий пример), без нее не обойтись еще в одной ситуации: когда нужно вывести служебный символ. Например, нам нужно напечатать в Word значение "Газпром" (в кавычках). Кавычка - это служебный символ, и попытка использовать строку вида:

Selection.Text = ""Газпром""

приведет к синтаксической ошибке. А вот так все будет в порядке:

Selection.Text = Chr(34) & "Газпром" & Chr(34)

Есть варианты этой функции - ChrB() и ChrW() . Работают аналогично таким же вариантам для функции Asc() .

InStr() и InStrRev() - одни из самых популярных функций. Позволяют обнаружить в теле строковой переменной последовательность символов и вернуть ее позицию. Если последовательность не обнаружена, то возвращается 0. Функция InStr() ищет с начала строки, а InStrRev() - с конца.

Left() , Right() , Mid() - позволяют взять указанное вами количество символов из существующей строковой переменной слева, справа или из середины соответственно.

Len() - возвращает число символов в строке (длину строки). Часто используется с циклами, операциями замены и т. п.

LCase() и UCase() - переводят строку в нижний и верхний регистры соответственно. Часто используются для подготовки значения к сравнению, когда регистр не важен (фамилии, названия фирм, городов и т. п.).

LSet() и RSet() - заполняют одну переменную символами другой без изменения ее длины (соответственно слева и справа). Лишние символы обрезаются, на место недостающих подставляются пробелы.

LTrim() , RTrim() , Trim() - убирают пробелы соответственно слева, справа или и слева, и справа.

Replace() - заменяет в строке одну последовательность символов на другую.

Space() и String() - возвращают строку из указанного вами количества пробелов или символов соответственно. Обычно используются для форма-

Функция написанная на VBA - это код, который выполняет вычисления и возвращает значение (или массив значений). Создав функцию вы можете использовать ее тремя способами:

  1. В качестве формулы на листе, где она может принимать аргументы и возвращать значения.
  2. Как часть вашей подпрограммы VBA. В процедуре Sub или внутри других функций.
  3. В правилах условного форматирования.

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

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

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

В чем отличие процедуры (Sub) от функции (Function)?

Основное отличие в том, что процедура (sub) используется для выполнения набора команд, и не призвана в отличие от функции (function) возвращать значение (или массив значений).

Для демонстрации приведем пример. Например есть ряд чисел от 1 до 100 и необходимо отделить четные от нечетных.

С помощью процедуры (sub) вы можете, к примеру, пройтись по ячейкам и выделить нечетные с помощью заливки. А функцию можно использовать в соседнем столбце и она вернет ИСТИНА или ЛОЖЬ в зависимости от того четное значение или нет. Т.е. вы не сможете изменить цвет заливки с помощью функции на листе.

Создание простой пользовательской функции в VBA

Давайте создадим простую пользовательскую функцию на VBA и посмотрим как там все работает.

Ниже представлен код функции, которая из текста оставляет только цифры, отбрасывая буквенные значения.

Function Цифры(Текст As String) As Long Dim i As Long Dim result As String For i = 1 To Len(Текст) If IsNumeric(Mid(Текст, i, 1)) Then result = result & Mid(Текст, i, 1) Next Цифры = CLng(result) End Function

Чтобы у вас все заработало, необходимо вставить данный код в модуль книги. Если вы не знаете как это сделать, то начните со статьи Как записать макрос в Excel .

Теперь посмотрим как функция работает, попробуем использовать ее на листе:

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

  • Она стала доступна, как и любая другая встроенная функция (как создать скрытую функцию, расскажем далее).
  • Когда вы ввели знак "=" и начинаете вводить имя функции, то Excel выводит все совпадения и показывает не только встроенные функции, но и пользовательские.

Разбираем функцию пошагово

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

Function Цифры(Текст As String) As Long

Слово Function говорит о начале функции, далее идет ее название, в нашем случае Цифры .

  • Имя функции не может содержать пробелов. Кроме того, вы не можете назвать функцию, если она сталкивается с именем ссылки на ячейку. Например, вы не можете назвать функцию ABC123, так как это имя также относится к ячейке в листе Excel.
  • Вы не должны указывать на свою функцию то же имя, что и у существующей функции. Если вы это сделаете, Excel будет отдавать предпочтение встроенной функции.
  • Вы можете использовать символ подчеркивания, если хотите разделить слова. Например, Сумма_Прописью является допустимым именем.

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

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

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

Dim i As Long Dim result As String

Переменную i мы буем использовать для перебора символов. А переменную result для хранения промежуточного результата функции.

Задача функции - пройти по всем символам переменной Текст и сохранить только те, что являются цифрами. Поэтому начнем цикл с 1 и до последнего символа.

For i = 1 To Len(Текст)

Len - функция, которая определяет количество символов.

Основная строка функции - это проверка является ли очередной символ текста цифрой и если да - то сохранение его в переменной result

If IsNumeric(Mid(Текст, i, 1)) Then result = result & Mid(Текст, i, 1)

Для этого нам потребуется функция IsNumeric - она возвращает True если текст - число и False в противном случае.

Функция Mid берет из аргумента Текст i -ый символ (значение 1 , указывает что функция Mid берет только 1 символ)/

Функция Next - закрывает цикл For тут все понятно.

Цифры = CLng(result)

Этой строкой мы преобразовываем текстовую переменную result , которая содержит все цифры аргумента Текст , в числовое значение. И говорим какой результат должна вывести наша функция Цифры .

Последняя строка кода - End Function . Это обязательная строка кода, которая сообщает VBA, что код функции заканчивается здесь.

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

Практически весь программный код модулей VBA содержится в процедурах двух типов Sub (подпрограммы) и Function (функции). Основная задача процедуры-функции Function - это вычисление некоторого значения и возвращение его в точку вызова процедуры-функции.

Синтаксис процедуры-функции Function:

Function Имя_Функции(аргументы As) As

Имя_Функции = Возвращаемое_Значение

End Function

Процедуры-функции Function могут быть использованы в различных выражениях.

Пример 1

Например, самая простая процедура-функция Function:

Function F1(x As Currency) As Currency

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

Пример 2

Например, Function F1(x) можно использовать в процедуре MySub (), присвоив переменной "у" имя F1(x).

Dim y As Single ‘Объявление переменной y

y = F1 (9) ‘Определяем F1 (x) для значения x=9

Debug.Print y ‘Вывод значений в окне Immediate

Function F1 (x As Single) As Single

F1 = x ^ 10 ‘Возвращаемое значение х в степени 10

Здесь Function F1(x)=$x^{10}$ для значения $ x=9$ возвращает в вызывающую процедуру MySub () значение $3,486785E+09$. Если для возвращаемого функцией значения или переменной, которая используется в процедуре VBA, не объявлен тип данных, то по умолчанию будет задан тип данных Variant.

В VBA используются как процедуры-функции Function, так и встроенные функции.

Встроенные функции состоят из двух частей: имени (идентификатора) и аргументов. Встроенные функции - это готовые формулы VBA, которые выполняют определенные действия над выражениями и возвращают некоторое значение в точку их вызова.

Функции возвращают результирующее значение вместо их имени, которое используется в дальнейших вычислениях. Как правило, функции требуют наличия аргументов, которые записываются в скобках через запятую. Но некоторые функции не требует аргументов. Например, функция Now(), которая не требует аргументов, возвращает текущую системную дату и время. Функции можно использовать для создания новых выражений или функций.

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

Sub MyDate ()

Dim TD ‘Объявление переменной TD

TD = Now ‘Определяем текущую системную дату и время

Debug.Print TD ‘Вывод значений в окне Immediate

Для вызова функции, требующей ввода одного или нескольких аргументов, необходимо ввести в правой части оператора присваивания ее имя с заключенными в скобках параметрами (значениями аргументов). Например, для вызова встроенной Function Log (N) с одной переменной N в процедуре типа Sub переменной Log_N присвоено имя функции Log (50) со значением аргумента равного 50.

Sub Натуральныйлогарифм ()

Dim LogN ‘Объявление переменной LogN

Debug.Print LogN ‘Вывод значений в окне Immediate

Замечание 1

Здесь встроенная функция Log (N) для значения аргумента равного 50 возвращает значение 3,91202300542815 в точку вызова Log (50) вызывающей процедуры "Sub Натуральный_логарифм ()". Функцию можно вызвать как с помощью отдельного оператора VBA, так и поместив ее имя со списком значений аргументов (параметров) в формулу или выражение в программе на VBA. В VBA для сокращения записи используется механизм вложения функций, который позволяет указывать вызов одной функции в качестве аргумента для другой функции. В этом случае возвращаемое первой функцией значение используется в качестве аргумента для следующей функции.

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

  • математические;
  • функции проверки типов;
  • функции обработки строк;
  • функция форматирования;
  • функции преобразования форматов;
  • функции даты и времени.

Математические функции

К математическим функциям относят:

  • Abs (x) - модуль аргумента $x$;
  • Cos(x) - косинус аргумента $x$;
  • Exp(x) - возведение основания натурального логарифма в степень $x$;
  • Log(x) - логарифм натуральный аргумента $x$;
  • Rnd - случайное число из интервала ;
  • Sin(x) - синус аргумента $x$;
  • Sqr(x) - квадратный корень из $x$;
  • Atn(x) - арктангенс от $x$;
  • Tan(x) – тангенс от $x$;
  • Sgn(x) – знак $x$.

Fix(x) и Int(x) обе функции отбрасывают дробную часть числа и возвращают целое значение. Разница между этими функциями состоит для отрицательных значений аргумента. Int(x) возвращает ближайшее отрицательное целое число, меньшее или равное х, а Fix(x) – ближайшее отрицательное целое число, большее или равное х.

Функции проверки типов

Приведем функции, определяющие каким типом является переменная:

  • IsArray(х) – функция проверяет является ли переменная массивом;
  • IsDate(х) определяет является ли переменная датой;
  • IsError(х) определяет является ли переменная кодом ошибки;
  • IsNull(х) определяет является ли переменная пустым значением;
  • IsNumeric(х) определяет является ли переменная числовым значением;
  • IsObject(х) определяет является ли переменная объектом.

Функция форматирования

Функция форматирования возвращает значение типа Variant (String), содержащее выражение, оформленное согласно синтаксиса функции:

Format(Выражение[,Формат [,Первый день недели[,Первая Неделя Года]]]),где:

  • Выражение – обязательный аргумент (любое допустимое выражение – комбинация ключевых слов, операторов, переменных и констант, результатом которой является строка, число или объект);
  • Формат – необязательный параметр (любое допустимое именованное или определенное пользователем выражение формата).

Если к имени функции добавляется знак $, то функция возвращает значение типа String., то функция возвращает значение типа String.

При создании собственного числового формата можно использовать следующие символы :

  • 0 – резервирует позицию цифрового разряда. Отображает цифру или нуль. Если у форматируемого числа есть какая-нибудь цифра в этой позиции разряда, где в строке формата находится 0, функция отображает эту цифру, если нет, то в этой позиции отображается нуль;
  • "#" - действие данного символа аналогично действию 0 с той лишь разницей, что незначащие нули не отображаются;
  • . – резервирует позицию десятичного разделителя, определяет, сколько разрядов необходимо отображать слева и справа от десятичной точки;
  • % - резервирует процентное отображение числа;
  • . – разделяет сотни от тысяч.

Функции преобразования форматов

К ним относят:

  • Val(строка) – возвращает числа, содержащиеся в строке, как числовое значение соответствующего типа.
  • Str(число) – возвращает значение типа Variant (String), являющееся строковым представлением числа.

Кроме функций Val и Str имеется ряд функций по преобразованию типов выражений.

Функции обработки строк

Среди множества функций можно выделить следующие:

  • Chr(код) – преобразует ASCII – код в строку. Например, Chr(10) осуществляет переход на новую строку, Chr(13) – возврат каретки;
  • Mid(string, pos[,length]) – возвращает подстроку строки, содержащую указанное число символов, где String – строковое выражение, из которого извлекается подстрока;
  • Pos – позиция символа в строке String, с которого начинается нужная подстрока;
  • Length – число возвращаемых символов подстроки;
  • Len(строка) – возвращает число символов строки.

Функции времени и даты

Возвращают значение типа Variant, содержащее системную дату, текущее время и т. д. Например функция Date возвращает значение, содержащее системную дату.

Перед тем, как приступить к созданию собственных функций 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 в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:

Помните, что аргументы в 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 , когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

Sub ... End 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 процедурам:

Помните о том, что если перед объявлением 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 , которая показывает пользователю всплывающее окно с предупреждением.

При написании кода VBA в Excel набор встроенных операторов используют на каждом шагу. Эти операторы делятся на математические, строковые, операторы сравнения и логические. Далее мы подробно рассмотрим каждую группу операторов.

Математические операторы

Основные математические операторы VBA перечислены в таблице ниже.

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

Строковые операторы

Основной строковый оператор в Excel VBA – это оператор конкатенации & (слияние):

Операторы сравнения

Операторы сравнения используются для сравнения двух чисел или строк и возвращают логическое значение типа Boolean (True или False). Основные операторы сравнения Excel VBA перечислены в этой таблице:

Логические операторы

Логические операторы, как и операторы сравнения, возвращают логическое значение типа Boolean (True или False). Основные логические операторы Excel VBA перечислены в таблице ниже:

В приведённой выше таблице перечислены не все логические операторы, доступные в VBA. Полный список логических операторов можно найти на сайте Visual Basic Developer Center .

Встроенные функции

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

Функция Действие
Abs Возвращает абсолютную величину заданного числа.
  • Abs(-20) возвращает значение 20;
  • Abs(20) возвращает значение 20.
Chr Возвращает символ ANSI, соответствующий числовому значению параметра.
  • Chr(10) возвращает перенос строки;
  • Chr(97) возвращает символ a .
Date Возвращает текущую системную дату.
DateAdd Добавляет определённый временной интервал к заданной дате. Синтаксис функции:

DateAdd(интервал , число , дата )

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

Аргумент интервал может принимать одно из следующих значений:

  • DateAdd(“d”, 32, “01/01/2015”) добавляет 32 дня к дате 01/01/2015 и, таким образом, возвращает дату 02/02/2015.
  • DateAdd(“ww”, 36, “01/01/2015”) добавляет 36 недель к дате 01/01/2015 и возвращает дату 09/09/2015.
DateDiff Вычисляет количество определённых временных интервалов между двумя заданными датами.
  • DateDiff(“d”, “01/01/2015”, “02/02/2015”) вычисляет количество дней между датами 01/01/2015 и 02/02/2015, возвращает результат 32.
  • DateDiff(“ww”, “01/01/2015”, “03/03/2016”) вычисляет количество недель между датами 01/01/2015 и 03/03/2016, возвращает результат 61.
Day Возвращает целое число, соответствующее дню месяца в заданной дате.

Пример: Day(“29/01/2015”) возвращает число 29.

Hour Возвращает целое число, соответствующее количеству часов в заданном времени.

Пример: Hour(“22:45:00”) возвращает число 22.

InStr Принимает в качестве аргументов целое число и две строки. Возвращает позицию вхождения второй строки внутри первой, начиная поиск с позиции, заданной целым числом.
  • InStr(1, “Вот искомое слово”, “слово”) возвращает число 13.
  • InStr(14, “Вот искомое слово, а вот еще искомое слово”, “слово”) возвращает число 38.

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

Int Возвращает целую часть заданного числа.

Пример: Int(5.79) возвращает результат 5.

Isdate Возвращает True , если заданное значение является датой, или False – если датой не является.
  • IsDate(“01/01/2015”) возвращает True ;
  • IsDate(100) возвращает False .
IsError Возвращает True , если заданное значение является ошибкой, или False – если ошибкой не является.
IsMissing В качестве аргумента функции передаётся имя необязательного аргумента процедуры. IsMissing возвращает True , если для рассматриваемого аргумента процедуры не передано значение.
IsNumeric Возвращает True , если заданное значение может быть рассмотрено как число, в противном случае возвращает False .
Left Возвращает заданное количество символов от начала переданной строки. Синтаксис функции вот такой:

Left(строка , длина )

где строка – это исходная строка, а длина – количество возвращаемых символов, считая от начала строки.

  • Left(“абвгдежзиклмн”, 4) возвращает строку “абвг”;
  • Left(“абвгдежзиклмн”, 1) возвращает строку “а”.
Len Возвращает количество символов в строке.

Пример: Len(“абвгдеж”) возвращает число 7.

Month Возвращает целое число, соответствующее месяцу в заданной дате.

Пример: Month(“29/01/2015”) возвращает значение 1.

Mid Возвращает заданное количество символов из середины переданной строки. Синтаксис функции:

Mid(строка , начало , длина )

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

  • Mid(“абвгдежзиклмн”, 4, 5) возвращает строку “гдежз”;
  • Mid(“абвгдежзиклмн”, 10, 2) возвращает строку “кл”.
Minute Возвращает целое число, соответствующее количеству минут в заданном времени.Пример: Minute(“22:45:15”) возвращает значение 45.
Now Возвращает текущую системную дату и время.
Right Возвращает заданное количество символов от конца переданной строки. Синтаксис функции:

Right(строка , длина )

Где строка – это исходная строка, а длина – это количество символов, которые надо извлечь, считая от конца заданной строки.

  • Right(“абвгдежзиклмн”, 4) возвращает строку “клмн”;
  • Right(“абвгдежзиклмн”, 1) возвращает строку “н”.
Second Возвращает целое число, соответствующее количеству секунд в заданном времени.

Пример: Second(“22:45:15”) возвращает значение 15.

Sqr Возвращает квадратный корень числовой величины, переданной в аргументе.
  • Sqr(4) возвращает значение 2;
  • Sqr(16) возвращает значение 4.
Time Возвращает текущее системное время.
Ubound Возвращает верхний индекс измерения заданного массива.

Примечание: Для многомерных массивов в качестве необязательного аргумента может быть указано, индекс какого именно измерения нужо возвратить. Если не указано, то по умолчанию равно 1.