Возвращает строку, преобразованную к нижнему регистру
UCase(строка)
Возвращает строку, преобразованную к верхнему регистру
Left(строка, длина)
Возвращает строку, содержащую указанное число первых символов исходной строки
Right(строка, длина)
Возвращает строку, содержащую указанное число последних символов исходной строки
Mid(строка, позиция [, длина])
Возвращает подстроку, начинающуюся в указанной позиции исходной строки и содержащую указанное число символов. Если длина подстроки не задана, то возвращаются все символы с указанной позиции до конца строки
LTrim(строка)
Возвращает копию строки, из которой удалены пробелы, находившиеся в начале строки
RTrim(строка)
Возвращает копию строки, из которой удалены пробелы, находившиеся в конце строки
Trim(строка)
Возвращает копию строки, из которой удалены пробелы, находившиеся в начале и конце строки
Len(строка)
Возвращает число символов в строке
InStr([позиция,] строка1, строка2 [, 0/1])
Возвращает позицию первого вхождения второй строки внутри первой строки. Поиск начинается с указанной позиции, а если она не задана, то с начала строки. Последний аргумент задает способ сравнения строк: 0 – двоичное сравнение (по умолчанию), 1 – посимвольное сравнение без учета регистра
StrComp(строка1, строка2 [, 0/1])
Возвращает: –1, если строка1 < строка2; 0, если строка1 = строка2; 1, если строка1 > строка2. Последний аргумент задает способ сравнения строк (см. InStr)
String(длина, символ)
Возвращает строку указанной длины, состоящую из указанного символа. Для задания символа можно использовать код или строковое выражение, первый символ которого используется при создании строки
Space(число)
Возвращает строку, содержащую указанное число пробелов
Из переменных, констант, функций с помощью знаков операций и скобок можно конструировать выражения.
Операции, имеющиеся в VBA для различных типов данных:
· арифметические операции: сложение (+), вычитание (-), изменение знака (-), умножение (*), деление (/), целочисленное деление (\), получение остатка от деления (mod), возведение в степень (^);
· операции над строками: конкатенация (&);
· операции сравнения: меньше (<), больше (>), меньше или равно (<=), больше или равно (>=), равно (=), не равно (<>), соответствие строки маске (Like), сравнение объектов (Is);
Значение выражения может быть сохранено в переменной соответствующего типа. Для этого используется инструкция присваивания. В VBA присваивание обозначается знаком равно (=). Например:
N = "Иванов Иван Иванович"
S = "Уважаемый " & Mid(N, InStr(1, N, " ") + 1) & "!"
После выполнения этих инструкций значением S будет строка "Уважаемый Иван Иванович!", значением D – дата #01/04/2012#, значением LD – строка "31-янв-12".
Массив – это группа элементов одного типа. У всех этих элементов одно имя (имя массива), но разные порядковые номера (индексы). Для доступа к конкретному элементу нужно указать индекс элемента в массиве. Если индексов несколько, то они перечисляются через запятую.
Инструкция объявления массива имеет вид:
DimИмяМассива ( [Размер] ) [AsИмяТипа]
Кроме Dim можно использовать Public. Если тип не указан, элементы будут иметь тип Variant. Количество индексов и их возможные значения (размер массива) определяются внутри скобок в виде списка:
[НомПерв1То] НомПосл1, [НомПерв2То] НомПосл2, ...
Выражение НомПерв То НомПосл устанавливает диапазон изменения значений индекса. Нижняя и верхняя граница диапазона – это любые целые числа, в том числе и отрицательные. Обязательно указывается только верхняя граница индекса, нижняя граница по умолчанию равна нулю. После выполнения инструкции Option Base 1 в качестве значения нижней границы по умолчанию будет использоваться единица. Инструкцию нужно поместить перед первой процедурой модуля.
Если вы хотите объявить динамический массив, т. е. массив у которого границы индексов зависят от переменных, то в объявлении массива размер не указывается (в скобках пусто). Для таких массивов размер определяется с помощью специальной инструкции Redim позднее, но сделать это нужно до первого обращения к его элементу:
ReDim [Preserve] ИмяМассива (Размер)
Инструкцию ReDim для массива можно выполнять несколько раз, изменяя его размер по мере необходимости. При переопределении содержимое элементов массива будет теряться. Если нужно сохранить эти значения, используйте ключевое слово Preserve.
Во время выполнения программы текущие значения границ индекса массива можно узнать с помощью функций Lbound и Ubound:
Lbound (ИмяМассива, НомерИндекса)
Ubound (ИмяМассива, НомерИндекса)
Параметр НомерИндекса по умолчанию равен единице, поэтому для первого индекса его можно не указывать.
Примеры объявления массивов:
Dim A(20) As Integer 'массив из 21 элемента, индекс изменяется с нуля
Dim B(-10 To 10) As Double 'тоже массив из 21 элемента
Dim C(1 To 10, 1 To 5) 'двумерный массив типа variant
Dim D() As Integer 'динамический массив
ReDim D(1 To n) 'определяем размер динамического массива
ReDim Preserve D(1 To n+10) 'изменяем размер массива, сохраняя данные
В VBA можно создавать составные пользовательские типы (аналоги записей Pascal или структур C), используя инструкцию Type:
[Private | Public] TypeимяТипа
имяЭлемента [(размер)] Asтип
[имяЭлемента [(размер)] Asтип]
. . .
End Type
Инструкцию Type можно использовать только на уровне модуля (перед процедурами). Аргумент размер указывается в том случае, если элемент является массивом.
После того как тип определен, на него ссылаются так же, как на стандартный тип. Если объявлена переменная пользовательского типа, то к любой ее составляющей можно обратиться следующим образом:
ИмяПеременной.имяЭлементаВОбъявленииТипа
В качестве примера рассмотрим новый тип BirthDayType. В начале модуля нужно поместить следующее описание:
Type BirthDayType
BName As String * 20
BDay As Date
End Type
Каждая переменная это типа будет содержать имя (BName) и дату рождения (BDay). Объявить переменную пользовательского типа BirthDayType и присвоить ей значение можно так:
Dim X As BirthDayType
X.BName = "Иван Иванович"
X.BDay = #10/20/1965#
Разветвленные алгоритмы предусматривают выполнение различных инструкций в зависимости от выполнения или невыполнения некоторых условий. Для реализации таких алгоритмов в программах на VBA используются инструкции IF и Select Case.
Существуют две разновидности инструкции IF: линейная и блочная. Линейная форма IF предполагает, что вся конструкция размещается на одной строке. Инструкция имеет следующий синтаксис:
IfусловиеThenинструкции [Elseинструкции]
Здесь под условием понимается любое логическое выражение, в частном случае – это просто операция сравнения. Если выражение имеет значение True, то выполняются инструкции, указанные после Then, в противном случае – инструкции, указанные после Else. Секция Else может отсутствовать, в этом случае при невыполнении условия ничего не делается. Если после Then или Else нужно написать несколько инструкций (но все в одной строке), то они разделяются двоеточием. Примеры линейной инструкции If:
If X > Y Then Max = X Else Max = Y
If A(i) >= 0 Then k = k + 1: B(k) = A(i)
Линейная форма IF используется для программирования простых ветвлений. В более сложных случаях удобнее пользоваться блочной разновидностью инструкции IF:
IfусловиеThen
инструкции
[ElseIfусловиеThen
инструкции ]
[Else
инструкции]
End If
Выполнение инструкции начинается с проверки первого условия. Если оно истинно, то выполняется первая группа инструкций, после чего программа перейдет к выполнению инструкций, следующих за End If. Если первое условие ложно, то проверяется второе условие и так далее. Количество секций ElseIf может быть любым. Инструкции в секции Else выполняются в том случае, если все условия оказались ложными. Секции ElseIf и Else могут отсутствовать. Заканчивается блочный IF всегда конструкцией End If в отдельной строке. Такая форма инструкции IF позволяет запрограммировать любые ветвления. Среди инструкций, использующихся внутри IF, могут быть другие инструкции IF или циклы.
Пусть переменные a, b, c содержат коэффициенты квадратного уравнения . Напишем программу, которая находит решение этого уравнения. Ответ помещается в переменную Ans в виде текстовой строки:
В данном примере использованы вложенные инструкции IF.
Для реализации выбора из нескольких вариантов также применяется инструкция Select Case, которая позволяет выполнять одну из нескольких групп инструкций в зависимости от значения выражения:
Select Caseвыражение
[CaseсписокВыражений
инструкции] ...
[Case Else
инструкции]
End Select
Анализируемое выражение указывается в первой строке после Select Case, в частном случае это может быть просто переменная. Тип выражения должен быть совместим с типом значений в строках Case. Управление получит та Case-строка, чье значение совпадет со значением анализируемого выражения. Значения в строках Case можно указывать явно (в том числе в виде списка через запятую), можно задать диапазон (используется ключевое слово To), можно использовать операторы сравнения (значение анализируемого выражения в этом случае обозначается словом Is). Секция Case Else используется для всех остальных значений.
Рассмотрим, как с помощью Select Case можно для текущей даты определить время года. Значением выражения в данном случае является номер месяца. В каждой секции Case указываются месяцы, относящиеся к одному времени года. Значения специально заданы по-разному, чтобы продемонстрировать возможности языка:
Select Case Month(Date)
Case Is < 3, 12
S = "Зима"
Case 3 To 5
S = "Весна"
Case 6, 7, 8
S = "Лето"
Case Else
S = "Осень"
End Select
Многократное автоматическое выполнение некоторых действий (инструкций) в программировании называют циклом. Повторяемые инструкции называются телом цикла. VBA, как и большинство современных языков программирования, поддерживает несколько видов циклов.
Цикл For … Next применяют в тех случаях, когда заранее известно, сколько раз нужно выполнить инструкции:
ForСчетчикЦикла = СтартТоСтоп [StepШаг]
Инструкции
Next [СчетчикЦикла]
Счетчик цикла – это обычная переменная. В начале выполнения цикла ее значение равно Старт. После выполнения тела цикла Next изменяет счетчик цикла на величину Шаг. Если после изменения счетчик меньше или равен Стоп, то тело цикла выполняется еще раз. Шаг по умолчанию равен единице, но можно сделать его любым, в том числе отрицательным. Если шаг отрицательный, то цикл выполняется до тех пор, пока значение счетчика больше или равно Стоп. В случае вложенных циклов рекомендуется после Next указывать имя переменной цикла. Для досрочного выхода из цикла используется инструкция Exit For.
В качестве примера применения цикла For … Next рассмотрим вычисление максимального элемента массива A:
Max = A(1)
For i = 2 To n
If A(i) > Max Then Max = A(i)
Next
Циклы с условиями (While и Until) предназначены для ситуаций, когда количество проходов заранее неизвестно, но известно условие завершения цикла. Синтаксис инструкций:
Do While УсловиеИнструкции
Loop
Do
Инструкции
Loop While Условие
Do Until УсловиеИнструкции
Loop
Do
Инструкции
Loop Until Условие
Особенностью VBA является то, что в обоих случаях вы можете проверить условие и перед выполнением тела цикла, и после, как вам удобно. Разница между циклами While и Until состоит в том, цикл While выполняется до тех пор, пока условие остается истинным, а цикл Until – до тех пор, пока условие в строке Until ложно. Для досрочного выхода из циклов используется инструкция Exit Do.
Большинство задач можно решить с помощью любой разновидности цикла. Приведем три различные реализации вычисления суммы чисел от 1 до n, в которых использованы разные типы циклов:
s = 0
For i = 1 To n
s = s + i
Next
s = 0
i = 1
Do While i <= n
s = s + i
i = i + 1
Loop
s = 0
i = 1
Do
s = s + i
i = i + 1
Loop Until i > n
В VBA имеются два типа процедур: процедуры Sub (подпрограммы) и процедуры Function. Для краткости процедуры Sub обычно называют просто процедурами, а процедуры Function – просто функциями. Синтаксис процедуры:
С помощью слова Public объявляют процедуру или функцию, которая будет доступна во всех модулях. Если требуется, чтобы процедура или функция была доступна только в пределах того модуля, где она объявлена, используют Private. Если при объявлении процедуры или функции использовано Static, то все объявленные внутри нее переменные сохраняются между вызовами этой процедуры.
В теле функции обязательно должна быть хотя бы одна инструкция присваивания значения имени функции. Так определяется возвращаемое функцией значение.
Для досрочного выхода из процедуры используется инструкция Exit Sub, для досрочного выхода из функции– Exit Function.
Процедуры и функции не могут быть вложенными, то есть нельзя объявить процедуру или функцию внутри процедуры или функции.
Процедуры и функции могут иметь параметры. Параметры, которые указываются при определении функции, называются формальными, а параметры, подставляемые на место формальных при вызове, – фактическими. Параметры перечисляются через запятую. Каждый формальный параметр представляет собой следующую конструкцию:
ByVal указывает, что параметр передается по значению,ByRef– по ссылке. По умолчанию параметры передаются по ссылке. При использовании ByVal в процедурупередается только значение фактической переменной. У процедуры нет доступа к самой переменной, поэтому изменить ее внутри процедуры невозможно. При использовании ByRef в процедуру передается адрес фактической переменной, поэтому процедура может изменить значение этой переменной.
Optional указывает, что параметр не является обязательным. Необязательные параметры должны располагаться в конце списка. Для них можно задать значения по умолчанию.
Вызвать процедуру Sub можно, указав ее имя и фактические значения параметров или применив оператор Call. Если используется оператор Call, список параметров следует заключить в круглые скобки. Если Call опускается, скобки вокруг списка параметров не нужны.
Фактические параметры перечисляются через запятую. Необязательные параметры можно не указывать, но необходимые запятые нужно писать. В списке фактических параметров можно использовать имена параметров. В этом случае именованными должны быть все параметры, причем каждый из них имеет вид:
ИмяПараметра := Значение
Такие параметры можно перечислять в любом порядке. В этом случае запятые для обозначения отсутствующих необязательных параметров не нужны.
Пусть, например, у нас имеется две процедуры Proc1 и Proc2:
Sub Proc1()
'тело процедуры
End Sub
Sub Proc2(P As Integer, Optional W As Integer = 0)
'тело процедуры
End Sub
Тогда мы можем вызвать их следующим образом:
Proc1
Proc2 12, 25 'параметры без скобок
Proc2 12 'второй параметр по умолчанию равен нулю
Call Proc2(12, 25) 'вызов с помощью Call, параметры в скобках
Функции обычно используют в выражениях. Чтобы получить возвращаемое функцией значение, надо указать имя функции и значения параметров. Параметры заключаются в скобки. Если возвращаемое значение функции не требуется, можно вызвать функцию так же, как процедуру Sub: опустить скобки и указать список параметров. Параметры функций и процедур задаются одинаково.
Так, например, можно вызвать стандартную функцию MsgBox, у которой второй и третий параметры (Buttons и Title) необязательные. В первых двух случаях возвращаемое значение присваивается переменной Ans, в трех остальных оно не используется, поэтому функция вызывается как процедура:
Ans = MsgBox("Закончить работу?", 4, "Пример")
Ans = MsgBox(Title:="Пример", Prompt:=" Закончить работу?", Buttons:=4)