Операторы и встроенные функции VBA. Операторы VBA Vba синтаксис меньше или равно

24.06.2020

Инструкции (или операторы) языка – это программные единицы, выполняющие какие-то действия или описывающие данные.

В состав оператора входят одно или несколько ключевых слов, а также, возможно, параметры. Несколько операторов, расположенных в одной программной строке, отделяются друг от друга двоеточием. Если оператор слишком длинный, можно разбить его на несколько строк, используя для переноса символ подчеркивания _.

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

Оператор присвоения используется для присвоения нового значения переменной в ходе выполнения программы. Знак присвоения «=».

Например , оператор:

x = Sqr(5 + Tan(1.8) ^ 2)

присваивает переменной х значение выражения . В результате вычисления выражения, записанного в правой части, получим вещественное число. Но значение, которое будет присвоено переменной х, зависит от того, как был описан тип этой переменной. Так, если переменная х имеет тип Single, ей будет присвоен результат 4,834464 , если Double, то 4,83446368725481, а если Integer, то 5.

Тип данных переменной х должен быть совместим с типом данных этого выражения. Кроме неявного преобразования из одного типа в другой при присвоении, в языке Visual Basic предусмотрена возможность преобразования типов с помощью функций. Например, функция CDbl преобразует данные к типу Double, CInt – к типу Integer, Clng – к типу Long, CSng – к типу Single, CStr – к типу String и т. д.

Функции CInt и Clng выполняют округление результата. При этом если дробная часть числа равна 0,5, округление производится до ближайшего четного числа.

Оператор присвоения позволяет не только присвоить значение переменной, но и задать значения свойств объектов VBA. Например, оператор

Rows("1:1").Font. Bold = True

делает полужирным шрифт в первой строке рабочего листа.

ПЕРЕНОС СТРОКИ

Комбинация <Пробел> + <Знак подчеркивания> в конце строки обеспечивает то, что последующая строка является продолжением предыдущей. При этом надо помнить что:

§ Нельзя разбивать переносом строковые константы

§ Допустимо не более семи продолжений одной и той же строки

§ Сама строка не может содержать более 1024 символов

Пример.

Некорректный перенос Корректный перенос

Строка = "Visual Basic for _ Строка = "Visual Basic" _

Applications" & "for Applications "

КОММЕНТАРИИ

Текст, следующий в программе за символом (") вплоть до конца строки игнорируется компилятором и является комментарием. С помощью комментариев добавляются пояснения и описания к программе. Комментарии полезны при отладке программы: они позволяют временно отключить строки программы при отладке.

Условный оператор

Условный оператор выполняет определенные инструкции (операторы) в зависимости от значения выражения условия. Блок-схема проверки условия имеет вид:

Рис. 1. Ветвление может быть неполным (такую структуру называют еще обход).

Рис. 2. Условный оператор имеет две формы синтаксиса: строчную и блочную.

Строчная форма

If условие Then [операторы­_если_истина ]

Алгоритм, представленный на рис. 1, в строчной форме будет записан в виде

If условие Then операторы­_если_истина Else операторы­_если_ложь

Рисунку 2 соответствует запись

If условие Then операторы­_если_истина

Рисунку 3 соответствует запись

If условие Then Else операторы­_если_ложь

Блочная форма

If условие-1 Then

[операторы­_если условие–1_истина ]

[операторы­_если_ все_условия_ложь ]]

Условия, перечисленные в частях If и ElseIf, представляют собой выражения отношения или логические выражения. При выполнении одного из условий выполняются инструкции, следующие за соответствующим ему ключевым словом Then, а остальные инструкции игнорируются (т. е. дальнейшие проверки не выполняются и управление передается оператору, следующему за End If). Если ни одно из логических условий не равно истине, то выполняются операторы­_если_ все_предыдущие_условия_ложь , либо, если эта часть опущена, управление передается строке программы, следующей после условного оператора.

Блочная форма оператора If более предпочтительна, если:

При выполнении или невыполнении условия выполняется несколько операторов (строчную форму в этом случае тоже можно использовать, но строка будет слишком длинной, а программа – менее понятной);

Последовательно проверяется несколько условий, и при выполнении очередного условия проверять последующие условия нецелесообразно (для этого и используется ключевое слово ElseIf).

Пример

Фирма предоставляет скидки оптовым покупателям.

По известному объему заказа надо определить его стоимость.

Для вычисления стоимости заказа используем функцию:

Public Function Стоимость_заказа(Количество As Long) As Double

If Количество <= 999 Then

Стоимость_заказа = Количество * 5

ElseIf Количество <= 1999 Then

Стоимость_заказа = Количество * 4.8

Стоимость_заказа = Количество * 4.75

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

Public Function Стоимость_заказа1(Количество As Long) As Double

If Количество <= 999 Then Стоимость_заказа1 = Количество * 5

If Количество >= 1000 And Количество <= 1999 Then Стоимость_­ заказа1 = Количество * 4.8

If Количество >= 2000 Then Стоимость_заказа1 = Количество * 4.75

Если не считать недостатками то, что строки длинноваты, и при любом объеме заказа последовательно выполняются все проверки (первая процедура при малых объемах заказа работает быстрее), то программа написана верно и, может быть, даже более наглядна.

Однако можно привести примеры, когда при выполнении (или невыполнении) одного из условий другие проверять просто нельзя.

Например , некоторые операторы должны выполняться при совместном выполнении условий: http://po-teme.com.ua/images/adIIIin/image014_e652e49476c6f0eb9cf40b68cc090828.gif" alt="" width="56" height="27 src=">. Если для проверки использовать оператор

If x>0 and y

то при отрицательном значении х возникнет ошибка при вызове функции sqr (под корнем отрицательное число).

Этой ошибки можно избежать, если использовать конструкцию

If x > 0 Then If y < Sqr(x) Then

В последней форме записи если есть ключевое слово Else, то оно относится к последнему оператору If.

Оператор выбора

Select Case выражение

[инструкции_ else ]]

Параметр выражение – любое числовое или строковое выражение. Вместо вычисления логического условия выполняется сравнение значения выражения с каждой из величин, заданных параметром список_выражений- n .

Величины для сравнения, входящие в список_выражений-n , могут быть заданы в виде:

– значения;

– диапазона значений в виде начальное_значение To конечное_значение ;

– выражения сравнения в виде Is оператор_сравнения значение ;

– списка любых из перечисленных видов выражений (разделитель – запятая).

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

Например, если условием является оценка выше тройки, то это условие можно записать: Case 4, 5 или Case Is >3 или Case Is >= 4 или Case 4 To 5.

Примечание. Ключевое слово Is можно не вводить, оно добавится само.

Пример

Рассмотренный выше пример с дисконтируемой ценой с помощью конструкции Select Case можно решить так:

Public Function Стоимость_заказа2(Количество As Long) As Double

Select Case Количество

Стоимость_заказа2 = Количество * 5

Case 1000 To 1999

Стоимость_заказа2 = Количество * 4.8

Case Is >= 2000

Стоимость_заказа2 = Количество * 4.75

Основные операторы языка VBA

Комментарии (0)

3.1. Правила записи операторов

При записи операторов необходимо придерживаться следующих правил:

Каждый новый оператор записывается с новой строки.

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

Если оператор не помещается в одной строке, то необходимо поставить в конце строки пробел и знак подчеркивания (_), а затем продолжить не поместившуюся часть на следующей строке.

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

Оператор присваивания используется, если какой-то переменной нужно присвоить новое значение. Он имеет следующий синтаксис:

ИМЯ_ПЕРЕМЕННОЙ = ВЫРАЖЕНИЕ

Сначала вычисляется выражение в правой части, а затем результат присваивается переменной, стоящей в левой части.

Например . Записать с помощью оператора присваивания следующее математическое выражение:

На VВА это выражение можно записать в виде следующего оператора:

Y = a^(1/3)+(a^2+Exp(-b))/(Sin(a)^2-Log(b))

3 .3. Операторы ввода-вывода

3 .3.1. Оператор и функция MsgBox

Оператор MsgBox осуществляет вывод информации в диалоговом окне и устанавливает режим ожидания нажатия кнопки пользователем.

Он имеет следующий синтаксис:

MsgBox Сообщение[,Кнопки][, Заголовок]

Аргументы:

Сообщение - обязательный аргумент, задающий в окне выводимое информационное сообщение. Может состоять из нескольких текстовых строк, объединенных знаком & . Использование в этом аргументе Chr(13) приводит к переходу на новую строку при выводе информации.

Кнопки - значение этого аргумента определяет категории появляющихся в окне кнопок. От значения аргумента кнопкизависит также, появляется ли в окне какой-либо значок. Если не указано, какие кнопки необходимо отображать в окне сообщений, то используется значение по умолчанию, соответствующее кнопке ОК. В табл. 3.1 приведены возможные комбинации кнопок и значков в окне сообщений.

Заголовок - задает заголовок окна.

Функция MsgBox возвращает значение типа Integer, указывающее, какая кнопка была нажата в диалоговом окне.

Таблица 3.1. Допустимые значения переменной кнопки

Отображение

Аргумент

Кнопка ОК

Кнопки ОК и Отмена

Кнопки Да и Нет

Кнопки Да, Нет и Отмена

Кнопки Прекратить, Повторить и Игнорировать

VbAbortRetryIgnore

Кнопки Повторить и Отмена.

Информационный знак

Знак вопроса

Знак восклицания

Например . Вывести сообщение о текущей дате.

MsgBox "Сегодня на календаре" & Date , "Внимание"

В результате будет выведено следующее окно (рис.3.1).

После щелчка по кнопке ОК окно сообщения закроется, и выполнение программы возобновится с оператора, стоящего непосредственно за вызовом MsgBox.

3.3.2. Функция InputBox

Функция InputBox осуществляет ввод значений переменных с помощью окна ввода и имеет следующий синтаксис:

Имя_Переменной = InputBox(Сообщение[, Заголовок ] )

Аргументы:

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

Заголовок - задает заголовок окна.

Например , Ввести значение переменной N с клавиатуры, предусмотрев значение по умолчанию равное 10.

Для этого можно использовать следующий оператор:

N = InputBox("Введите N", "Ввод исходных данных",10)

В результате будет выведено следующее окно для ввода значения переменной N (рис.3.2).

Если значение по умолчанию подходит пользователю, то после щелчка кнопки ОК окно ввода закроется, переменной N присвоится значение 10 и выполнение программы возобновится с оператора, стоящего непосредственно за вызовом InputBox .

Если же значение по умолчанию не подходит пользователю, то перед щелчком по кнопке ОК необходимо ввести нужное значение переменной N.

3 .4. Условный оператор IF

Для реализации разветвляющегося вычислительного процесса в VBA используется оператор If…Then…Else, который представляет собой простейшую форму проверки условий. Он имеет следующий синтаксис:

If УСЛОВИЕ Then ОПЕРАТОР_1 E lse ОПЕРАТОР_2

ОПЕРАТОР_1 выполняется, если УСЛОВИЕ истинно, в противном случае выполняется ОПЕРАТОР_2 . При этом оператор If…Then…Else записывается в одну строку.

УСЛОВИЕ - это выражение логического типа. Результат выражения всегда имеет булевский тип. Выражение может быть простым и сложным. При записи простых условий могут использоваться все возможные операции отношения, указанные в табл. 3.2.

Таблица 3 .2. Логические отношения

Операция

Название

Выражение

Результат

True, если А равно В

True, если А не равно В

True, если А,больше В

True, если А меньше В

Больше или равно

True, если А больше или равно В

Меньше или равно

True, если А меньше или равно В

Сложные условия образуются из простых путем применения логических операций и круглых скобок. Список логических операций приведен в табл. 3.3.

Таблица 3 .3. Логические операции

Название

Выражение

Результат

Логическое
отрицание

Логическое И

Логическое ИЛИ

В условном операторе допустимо использование блока операторов вместо любого из операторов. В этом случае условный оператор имеет вид:

If УСЛОВИЕ Then

БЛОК_ОПЕРАТОРОВ_1

БЛОК_ОПЕРАТОРОВ_2

End I f

В условном операторе может проверяться несколько условий. В этом случае условный оператор имеет вид:

If УСЛОВИЕ_1 Then

БЛОК_ОПЕРАТОРОВ_1

ElseIf УСЛОВИЕ_2 Then

БЛОК_ОПЕРАТОРОВ_2

Else

End If

Пример 1 . Написать часть программы для алгоритма на рис. 3.3.

Пример 2. Написать часть программы для алгоритма на рис. 3.4.

3.5. Оператор выбора Select Case

Оператор Select Case удобно использовать, когда в зависимости от значения некоторого выражения, имеющего конечное множество допустимых значений, необходимо выполнить разные действия. Он также относится к условным операторам, но имеет другой вид:

Select Case ПРОВЕРЯЕМОЕ_ВЫРАЖЕНИЕ

Case ЗНАЧЕНИЯ_1

ОПЕРАТОРЫ_1

Case ЗНАЧЕНИЯ _ 2

ОПЕРАТОРЫ _ 2

. . .

Case ЗНАЧЕНИЯ_N

ОПЕРАТОРЫ _N

[ Case Else

ИНАЧЕ _ ОПЕРАТОРЫ]

End Select

ПРОВЕРЯЕМОЕ_ВЫРАЖЕНИЕ может иметь любой скалярный тип, кроме вещественного. ЗНАЧЕНИЯ состоят из произвольного количества значений или диапазонов, отделенных друг от друга запятыми.

Тип ЗНАЧЕНИЙ должен совпадать с типом ПРОВЕРЯЕМОГО_ВЫРАЖЕНИЯ .

Сначала вычисляется ПРОВЕРЯЕМОЕ_ВЫРАЖЕНИЕ . Если его значение совпадает с одним из значений ЗНАЧЕНИЯ_I , то выполнятся ОПЕРАТОРЫ_I End Select . Если его значение не совпадает ни с одним из значений ЗНАЧЕНИЯ_I , то выполнятся ИНАЧЕ_ОПЕРАТОРЫ и управление передается оператору, стоящему после End Select

Например. Написать часть программы для алгоритма на рис. 3.5, определяющего значение переменной S в зависимости от значения переменной n.

3.6. Операторы цикла

Для реализации циклического вычислительного процесса, т. е. многократного выполнения одного или нескольких операторов, служит оператор цикла For…Next , который имеет следующий синтаксис:

For СЧЕТЧИК=НАЧ_ЗНАЧЕНИЕ Т o КОН_ЗНАЧЕНИЕ Step ШАГ

БЛОК_ОПЕРАТОРОВ

БЛОК_ОПЕРАТОРОВ

Next СЧЕТЧИК

Цикл For…Next перебирает значения переменной СЧЕТЧИК , которая является параметром цикла, от начального до конечного значения с указанным шагом изменения. При этом обеспечивается выполнение блока операторов тела цикла при каждом новом значении счетчика. Если Step ШАГ в конструкции отсутствует, то по умолчанию считается, что шаг равен 1. По оператору Exit For можно выйти из оператора цикла до того, как СЧЕТЧИК достигнет последнего значения.*

Для перебора объектов из группы подобных объектов, например, ячеек из диапазона или элементов массива, удобно использовать оператор цикла For… Each…Next .

For Each Элемент In Группа

БЛОК _ ОПЕРАТОРОВ

БЛОК_ОПЕРАТОРОВ

Next Элемент

В VBA для организации циклов с неизвестным заранее числом повторений используются и другие операторы цикла:

циклы с предусловием - Do While Loop ,

Do Until Loop ;

циклы с постусловием - Do Loop While ,

Do Loop Until .

Ниже приведен синтаксис этих операторов цикла:

" Цикл с предусловием Do While Loop

Do While УСЛОВИЕ

БЛОК_ОПЕРАТОРОВ

БЛОК_ОПЕРАТОРОВ

" Цикл с предусловием Do Until Loop

Do Until УСЛОВИЕ

БЛОК_ОПЕРАТОРОВ

БЛОК_ОПЕРАТОРОВ

" Цикл с постусловием Do Loop While

БЛОК _ ОПЕРАТОРОВ

БЛОК_ОПЕРАТОРОВ

Loop While УСЛОВИЕ

" Цикл с постусловием Do Loop Until

БЛОК _ ОПЕРАТОРОВ

БЛОК_ОПЕРАТОРОВ

Loop Until УСЛОВИЕ

Оператор Do W hile…Loop обеспечивает многократное повторение блока операторов до тех пор, пока УСЛОВИЕ соблюдается, а оператор



Другие новости

Здесь подробно описаны все арифметические операторы, операторы сравнения, логические, а также операторы конкатенации. Я попытался собрать всё то, что необходимо знать об этих операторах. Каждый оператор снабжён примером. Описания переведены мной со стандартного Help"a VB5.

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

оператор ^ (возведение в степень)

Этот оператор предназначен для возведения числа в степень.

Синтаксис:

результат = число ^ степень

Параметры:

результат
число
степень - обязателена; любое числовое выражение

Замечания :

число может быть отрицательное, только в том случае, когда степень - целое число. Если в одном выражении используется несколько операторов ^, то вычисление происходит слева направо. Обычно тип результата - Double. Однако, если или степень , или число - Null выражение, то результат тоже Null.

Пример:

Dim MyValue
MyValue = 2 ^ 2 " Возвратит 4.
MyValue = 2 ^ 3 ^ 3 " Возвратит 512 (2^3=8, 8^3=512)
MyValue = (-5) ^ 3 " Возвратит -125.

Советы:

Если вам необходимо возвести число в постоянную степень, то лучше использовать несколько операторов - умножений, чем один - возведение в степерь, судите сами, цикл в миллион проходов с вычислением выражения проходил:

test1 = 2 ^ 8 " 893мс
test1 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 " 130мс!

оператор * (умножение)

Используется для перемножения двух чисел.

Синтаксис:

результат = число1 * число2

Параметры:

результат - обязателен; любая числовая переменная
число1 - обязательно; любое числовое выражение
число2 - обязательно; любое числовое выражение

Замечания:

Тип данных результата обычно такой же, как и самый точный тип из двух чисел. Порядок точности, от большего к меньшему - Byte, Integer, Long, Single, Currency, Double, Decimal. Правда, есть исключения:

  • Если перемножаются Single и Long, то результат - Double
  • Если тип данных результата - Long Single или Date, в который не помещается сам результат выражения, то результат конвертируется в Variant, содержащий Double.

Если число1 или число2

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

Пример:

Dim MyValue
MyValue = 2 * 2 " Возвратит 4.
MyValue = 459.35 * MyValue " Возвратит 495.35 * 4

оператор / (деление)

Используется для деления двух чисел и получить результат с плавающей точкой.

Синтаксис:

результат = число1 / число2

Параметры:

результат - обязателен; любая числовая переменная
число1 - обязательно; любое числовое выражение
число2 - обязательно; любое числовое выражение

Замечания:

Результат обычно имеет тип Double. Правда, есть исключения:

  • Если оба выражения выражения имеют тип Byte, Integer, Single, то результат Single. Однако, если размеры выражения не вписываются в рамки Single, происходит ошибка.
  • Если оба выражения выражения имеют тип Variant, содержащий Byte, Integer или Single, то результат Single Variant. Однако, если размеры выражения не вписываются в рамки Single, то Double Variant.
  • Если одно из чисел имеет тип Decimal, то и результат - Decimal.

Если число1 или число2 - Null, то оно интерпретируется просто как обычный 0.

Примеры:

Dim MyValue
MyValue = 10 / 4 " Возвратит 2.5.
MyValue = 10 / 3 " Возвратит 3.333333.

оператор \ (целочисленное деление)

Используется для деления двух чисел и получить целочисленный результат.

Синтаксис:

результат = число1 \ число2

Параметры:

результат - обязателен; любая числовая переменная
число1 - обязательно; любое числовое выражение
число2 - обязательно; любое числовое выражение

Замечания:

Перед тем, как происходит такое деление, выражения округляются до Byte, Integer или Long выражений. Обычно тип данных результата Byte, Byte variant, Integer, Integer variant, Long, or Long variant. Любая дробная часть обрезается.

Однако, если любое из выражений Null, то и результат Null. Любое выражение, содержащее Empty интерпретируется как 0.

Примеры:

Dim MyValue
MyValue = 11 \ 4 " Возвратит 2.
MyValue = 9 \ 3 " Возвратит 3.
MyValue = 100 \ 3 " Возвратит 33.

оператор Mod (остаток от деления)

Используется для деления двух чисел и получение остатка от их деления.

Синтаксис:

результат = число1 Mod число2

Параметры:

результат - обязателен; любая числовая переменная
число1 - обязательно; любое числовое выражение
число2 - обязательно; любое числовое выражение

Замечания:

При делении числа с правающей точкой округляются. Например, результат следующего выражения равен 5:

A = 19 Mod 6.7

Что здесь происходит? Сначала округляется число 6.7 до 7. Затем происходит деление, получаем 2.7.... Остаток от деления = 5. (2 * 7 = 14, 19 - 14 = 5).

Результат обычно имеет тип Byte, Byte variant, Integer, Integer variant, Long, или Variant содержащий Long.

Если любое из выражений Null, то и результат Null. Любое выражение, содержащее Empty интерпретируется как 0.

Примеры:

Dim MyResult
MyResult = 10 Mod 5 " Возвратит 0.
MyResult = 10 Mod 3 " Возвратит 1.
MyResult = 12 Mod 4.3 " Возвратит 0.
MyResult = 12.6 Mod 5 " Возвратит 3.

оператор + (сложение)

Используется для сложения двух чисел.

Синтаксис:

результат = выражение1 + выражение2

Параметры:

результат - обязателен; любая числовая переменная
выражение1
выражение2 - обязательно; любое выражение

Замечания:

Когда вы используете оператор +, вы не можете определить что произойдёт, сложение или конкатенация строк. Для конкатенации используйте оператор &, чтобы избежать недоразумений и сделать код более читабельным.

Если одно из выражений не Variant, то применяются следующие правила:

  • Если оба выражения имеют численный тип (Byte, Boolean, Integer, Long, Single, Double, Date, Currency, или Decimal) - то происходит их сложение.
  • Если оба выражения строки - конкатенация.
  • Если одно из выражений имеет численный тип, а другое любое Variant значение, включая Null, то происходит сложение.
  • Если одно из выражений строка, а другое любое Variant значение, то происходит конкатенация.
  • Если одно из выражений содержит Empty, то возвращается второе, не изменённое выражение.
  • Если одно из выражений имеет численный тип, а другое - строка, происходит ошибка несовпадения типов (Type mismatch).
  • Если любое выражение Null - тогда и результат тоже Null.

Если оба выражения Variant, то применяются следующие правила:

  • Если оба выражения числа - то они складываются.
  • Если оба выражения строки - то они конкатенируются.
  • Если одно из выражений число, а другое строка - происходит сложение.

Для обычного сложения тип данных результата обычно такой же, как и самый точный тип из двух чисел. Порядок точности следующий - Byte, Integer, Long, Single, Double, Currency, и Decimal. Есть исключения:

  • Если складываются Single и Long, то результат - Double
  • Если складываются выражение с типом Date, с любым другим выражением, то результат - Date.

Если одно или оба выражения Null, то результат тоже Null. Если оба из выражений содержат Empty, результат Integer. Если только одно, то в качестве результата возвращается не изменённое второе выражение.

Примеры:

Dim MyNumber, Var1, Var2
MyNumber = 2 + 2 " Возвратит 4.
MyNumber = 4257.04 + 98112 " Возвратит 102369.04.

Var1 = "34"
Var2 = 6 " Инициализируем смешанные переменные
MyNumber = Var1 + Var2 " Возвратит 40.

Var1 = "34"
Var2 = "6" " Инициализируем переменные со строками
MyNumber = Var1 + Var2 " Возвратит "346" (произошла
" конкатенация, а не сложение!).

Советы:

Оператор сложение (+) можно использовать для сложения дат, т.е. переменных типа Date:

Dim d As Date
d = DateSerial(2002, 8, 15) " иниализация даты 15.08.2002
d = d + 15 " теперь d содержит дату 30.08.2002
" т.е. мы прибавили 15 дней

оператор - (вычитание, смена знака)

Используется для нахождения разницы между двумя числами, или, также, для изменения знака выражения.

Синтаксис:

результат = выражение1 - выражение2

-выражение

Параметры:

результат - обязателен; любая числовая переменная
выражение - обязательно; любое выражение
выражение1 - обязательно; любое выражение
выражение2 - обязательно; любое выражение

Замечания :

В первом синтаксисе, оператор "-" необходим для нахождения разницы между двумя числами. Во втором синтаксисе, "-" используется для смены знака у выражения .

Тип данных результата обычно такой же, как и самый точный тип из двух чисел. Порядок точности следующий - Byte, Integer, Long, Single, Double, Currency, и Decimal. Есть исключения:

  • Если в вычитании участвуют типы Single и Long, то результат - Double
  • Если в вычитании используется выражение с типом Date,
    то результат - Date.
  • Вычитание двух дат, даёт в результате Double.

Если одно или оба выражения Null, то результат тоже Null. Если одно из выражений Empty, то оно интерпретируется как 0.

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

Примеры:

Dim MyResult
MyResult = 4 - 2 " Возвратит 2.
MyResult = 459.35 - 334.90 " Возвратит 124.45.

Советы:

Как и оператор сложение, оператор вычитание может быть применён для вычисления разницы (в днях) между двумя датами:

Dim d1 As Date
Dim d2 As Date
Dim razn As Long
d1 = DateSerial(1983, 10, 14)
d2 = DateSerial(2002, 8, 15)
razn = d2 - d1 " разница в днях (6880).

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

Используются для сравнения некоторых выражений. Имеют 3 синтаксиса:

Синтаксис:

результат = выражение1 операторсравнения выражение2
результат = объект1 Is объект2
результат = строка Like образец

Параметры:

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

Замечания:

Следующая таблица содержит список операторов сравнения и условия, по которым определяется результат выражения (True или False).

Оператор

True, если

False, если

Null, если

< (меньше чем) выражение1 <
выражение2
выражение1 >=
выражение2

одно
из
выражений содержит Null

<= (меньше или равно) выражение1 <=
выражение2
выражение1 >
выражение2
> (больше чем) выражение1 >
выражение2
выражение1 <=
выражение2
>= (больше или равно) выражение1 >=
выражение2
выражение1 <
выражение2
= (равно) выражение1 =
выражение2
выражение1 <>
выражение2
<> (не равно) выражение1 <>
выражение2
выражение1 =
выражение2

Операторы Is и Like выполняют специфические функции, и их таблица сравнения отличается от приведённой (их мы рассмотрим ниже).

Когда сравниваются два выражения, не всегда можно определить, что будет сравниваться, числа или строки. Ниже показано, как будет вычислятся результат, если оба выражения имею тип, отличный от Variant:

  • Если оба выражения числа (Byte, Boolean, Integer, Long, Single, Double, Date, Currency, или Decimal), то происходит сравнение чисел.
  • Если оба выражения строки, то происходит сравнение строк. (меньшая строка та, первая и последующие буквы которой имею меньший ascii код).
  • Если одно из выражений число, а другое Variant, который может быть трактован как число, то происходит сравнение чисел.
  • Если одно из выражений число, а другое Variant строка, которая не может быть трактована как число, то происходит ошибка (Type mismatch).
  • Если одно из выражений строка, а другое любое Variant значение (даже Null), то происходит строковое сравнение.
  • Если одно из выражений Empty, а другое число, то происходит сравнение чисел, где Empty рассматривается как 0.
  • Если одно из выражений Empty, а другое строка, то происходит сравнение строк, где Empty рассматривается как пустая строка "".

Если и первое выражение и второе имеют тип Variant, то выражения сравниваются, согласно тем типам данных, которые содержит Variant:

  • Если оба Variant выражения содержат числа, то происходит сравнение чисел.
  • Если оба Variant выражения содержат строки, то происходит сравнение строк.
  • Если одно из Variant выражений содержит число, а другое строку, то числовое выражение меньше строкового.
  • Если одно из Variant выражений Empty, а другое число, то Empty рассматривается как 0.
  • Если одно из Variant выражений Empty, а другое строка, то Empty рассматривается как пустая строка "".
  • Если оба выражения Empty, то они рассматриваются как равные.

Когда Single переменная сравнивается с Double, то Double округляется до точности Single.

Если Currency сравнивается с Single или Double, то Single или Double конвертируются в Currency. Точно так же, при сравнении Decimal с Single или Double, то Single или Double конвертируются в Decimal. Для Currency любая дробная часть меньшая, чем.0001, может быть утеряна. Для Decimal это значение 1E-28, или может произойти ошибка. Таким образом, при потере дробной части, выражения могут интерпретироваться как равные, хотя на самом деле, одно от другого будет отличаться. (хоть и на маленькое значение).

Примеры:

Dim MyResult, Var1, Var2
MyResult = (45 < 35) " Возвратит False.
MyResult = (45 = 45) " Возвратит True.
MyResult = (4 <> 3) " Возвратит True.
MyResult = ("5" > "4") " Возвратит True.

Var1 = "5": Var2 = 4 " в VB можно использовать двоеточие,
" для разделения операторов.

MyResult = (Var1 > Var2) " Возвратит True.

Var1 = 5: Var2 = Empty
MyResult = (Var1 > Var2) " Возвратит True.

Var1 = 0: Var2 = Empty
MyResult = (Var1 = Var2) " Возвратит True.

оператор сравнения Is

Этот оператор используется для сравнения объктных переменных.

Синтаксис этого оператора приведён выше.

Замечания:

Если объект1 и объект1 ссылаются на один и тот же объект, то результат - True, если нет, то False. Две переменные могут ссылается на один и тот же объект несколькими путями. В следующем примере, A ссылается на тот же объект, что и B:

Set A = B

Следующий пример делает так, что переменные A и B ссылаются на один и тот же объект - C:

Set A = C
Set B = C

Примеры:

Dim MyObject, YourObject, ThisObject, _
OtherObject, ThatObject, MyCheck

Set YourObject = MyObject " создаём ссылки на объекты
Set ThisObject = MyObject
Set ThatObject = OtherObject
MyCheck = YourObject Is ThisObject " Возвратит True.
MyCheck = ThatObject Is ThisObject " Возвратит False.
" Предполагаем, что MyObject <> OtherObject
MyCheck = MyObject Is ThatObject " Возвратит False.

оператор сравнения строк - Like

Оператор сравнения строк Like используется для сравнения строк.

Синтаксис этого оператора уже рассмотрен выше.

Замечание:

Этот оператор можно использовать для проверки строки String на маску Pattern. Это очень мощный оператор, почти аналог регулярных выражений в Perl.

Итак, работает этот ператор следующим образом. Если строка подходит под маску, то результат True. Если нет - False. Если одно из выражений Null - результат тоже Null.

Поведение оператора Like зависит от установленного по умолчанию типа сравнения строк. (оператор Option Compare).

Если установлен тип Binary (т.е. двоичное сравнение), то строки сравниваются согласно их Ascii кодам (в разных кодировках она разная). Обычно используется такая последовательность:

A < B < E < Z < a < b < e < z < А < К < Я < а < к < я

Если установлен тип Text (текстовое сравнение). При таком сравнении последовательность отличается от предыдущей, здесь большие и маленькие буквы - равны:

(A=a) < (А=а) < (B=b) < (E=e) < (К=к) < (Z=z) < (Я=я)

Самое главная функция оператора Like - это проверка на принадлежность строки какой-нибудь маске. В маске можно использовать следующие спец. символы:

Любой отдельный символ
* Ноли или более символов
# Любая цифра (0–9).
Любой отдельный символ, попадающий в список charlist
[!charlist] Любой отдельный символ, непопадающий в список charlist

Здесь небольшое замечание. Для того чтобы проверить принадлежность строки на маске, содержащую спец. симолы (т.е. проверить, к примеру, есть ли в строке симолы [,?,#,],*), то нужно заключить из в квадратные скобки . Просто так ставить отдельную скобку [ или ], нельзя.

При указании списка символов, можно использовать тире (–). Например, чтобы задать последовательность от A до Z, нужно использовать маску . Всё, что находится в скобках не должно содержать никаких разделителей (пробелов, запятых и т.д.), иначе они тоже будут включены в последовательность.

Есть и другие важные правила при проверки по маске:

  • (!) знак в начале списка символов говорит о том, что нужно искать символы, не входящие в этот список. Если вам необходимо найти сам знак!, то нужно поставить скобки [!].
  • (–) используется для задания диапазона символов.
  • Когда задаётся диапазон символов, то он должен быть возрастающим по ASCII кодам. Т.е. правильная маска, а нет.
  • Последовательность интерпретируется как пустая строка "".

Примеры:

Dim MyCheck
MyCheck = "aBBBa" Like "a*a" " Возвратит True.
MyCheck = "F" Like "" " Возвратит True.
MyCheck = "F" Like "[!A-Z]" " Возвратит False.
MyCheck = "a2a" Like "a#a" " Возвратит True.
MyCheck = "aM5b" Like "a#[!c-e]" " Возвратит True.
MyCheck = "BAT123khg" Like "B?T*" " Возвратит True.
MyCheck = "CAT123khg" Like "B?T*" " Возвратит False.

myString = "312T-87GD-8922"

If myString Like "###-##-####" Then ...

Операторы конкатенации строк

Вообще-то, чтобы соединить строки в Visual Basic, можно использовать всего 2 оператора. Это & и +. Оператор + описан выше. Поговорим об операторе &.

оператор конкатенации строк - &

Используется для конкатенации двух выражений.

Синтаксис:

результат = выражение1 & выражение2

результат обязателен; Любая String или Variant переменная
выражение1 обязательно; Любое выражение
выражение2 обязательно; Любое выражение

Замечания:

Если в выражение не строка, то она конвертируется в String Variant. Тип данных результата - String только тогда, когда оба выражения имеют тип String. Иначе результат String Variant. Если оба выражения Null, то результат тоже Null. Однако, если только одно из выражений содержит Null значение, то оно интерпретируется как пустая строка "". Empty также интерпретируется как пустая строка "".

Примеры:

Dim MyStr
MyStr = "Hello" & " World"
" Возвратит строку "Hello World".
MyStr = "ПроВерКА" & 123 & " ПроВерка"
" Возвратит строку "ПроВерКА 123 ПроВерка".

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

Это самая интересная группа оператором. При программировании вы обязаны знать их работу и применение (причём не только на Visual Basic).

В Visual Basic их 6 штук. Рассмотрим каждый оператор подробно.

оператор And

Используется для совершения логичкого умножения над двумя выражениями.

Синтаксис:

результат = выражение1 And выражение2

результат
выражение1 обязательно; Любое выражение
выражение2 обязательно; Любое выражение

Замечания:

Следующая таблица показывает как работает оператор And:

Если выражение1 =

, а выражение2 =

То результат =

True True True
True False False
True Null Null
False True False
False False False
False Null False
Null True Null
Null False False
Null Null Null

Оператор And также используется для проверки битов числа. Для битов оператор And работает следующим образом (смотреть слева направо)

0 0 0
0 1 0
1 0 0
1 1 1

Примеры:

Dim A, B, C, D, MyCheck
MyCheck = A > B And B > C " Возвратит True.
MyCheck = B > A And B > C " Возвратит False.
MyCheck = A > B And B > D " Возвратит Null.
MyCheck = A And B " Возвратит 8 (битовое сравнение).

Последний пример рассмотрим подробнее. Число 10 представляется в виде битов следущим образом (как тетрада, т.е. 4 бита):

А число 8 вот так:

В результате работы оператора And, согласно вышеприведённой таблице мы получим:

Т.е. 8. Для чего мы это делали? Мы делали это для того, чтобы проверить, установлен ли четвёртый бит у числа A? Получив B, мы убедились в том, что этот бит установлен.

оператор Or

Используется для совершения логичкого сложения двух выражений.

Синтаксис:

результат = выражение1 Or выражение2

результат обязателен; Любая числовая (включая Boolean) переменная
выражение1 обязательно; Любое выражение
выражение2 обязательно; Любое выражение

Замечания:

Следующая таблица показывает как работает оператор Or:

Если выражение1 =

, а выражение2 =

То результат =

True True True
True False True
True Null True
False True True
False False False
False Null Null
Null True True
Null False Null
Null Null Null

Оператор Or используется для установки определённых битов числа. Для битов оператор Or работает следующим образом (смотреть слева направо)

0 0 0
0 1 1
1 0 1
1 1 1

Результат выделен жирным шрифтом.

Примеры:

Dim A, B, C, D, MyCheck
MyCheck = A > B Or B > C " Возвратит True.
MyCheck = B > A Or B > C " Возвратит True.
MyCheck = A > B Or B > D " Возвратит True.
MyCheck = B > D Or B > A " Возвратит Null.
MyCheck = A Or 5 " Возвратит 15:

Давайте последний пример рассмотрим подробнее. Число 10 представляется в виде битов следущим образом (как тетрада, т.е. 4 бита):

А число 5:

В результате работы оператора Or, согласно вышеприведённой таблице мы получим:

Т.е. 15. Как видите, оператор Or очень легко и удобно использовать не только в выражениях сравнения, но и для установки определённых битов числа.

оператор Xor

Используется для совершения логичкого отрицания двух выражений.

Синтаксис:

результат = выражение1 Xor выражение2

результат обязателен; Любая числовая (включая Boolean) переменная
выражение1 обязательно; Любое выражение
выражение2 обязательно; Любое выражение

Замечания:

Следующая таблица показывает как работает оператор Xor:

Оператор Xor используется для инвертирования определённых битов числа. Для битов оператор Xor работает следующим образом (смотреть слева направо)

0 0 0
0 1 1
1 0 1
1 1 0

Результат выделен жирным шрифтом. Xor отличается от Or, только тем, что когда оба бита единицы, Xor выдаёт 0. Оператор Xor интересен тем свойством, то при его двойном применении он выдаёт то же число. Это часто используют в криптографии.

Примеры:

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null
MyCheck = A > B Xor B > C " Возвратит False.
MyCheck = B > A Xor B > C " Возвратит True.
MyCheck = B > A Xor C > B " Возвратит False.
MyCheck = B > D Xor A > B " Возвратит Null.
MyCheck = A Xor B " Возвратит 2

Интересным примером использования оператора Xor является обмен значениями двух численных переменны:

Dim a As Long , b As Long
a = 4
b = 7
a = a Xor b
b = a Xor b
a = a Xor b

Теперь переменная a содержит значение переменной b, и наоборот.

оператор Not

Используется для совершения логичкого инвертирования двух выражений.

Синтаксис:

результат = Not выражение

результат обязателен; Любая числовая (включая Boolean) переменная
выражение обязательно; Любое выражение

Замечания:

Следующая таблица показывает как работает оператор Not:

Оператор Not инвертирует все биты выражения. Для битов оператор Not работает следующим образом (смотреть слева направо):

0 1
1 0

Результат выделен жирным шрифтом.

Примеры:

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null
MyCheck = Not (A > B) " Возвратит False.
MyCheck = Not (B > A) " Возвратит True.
MyCheck = Not (C > D) " Возвратит Null.
MyCheck = Not A " Возвратит -11 (все биты инвертированы)

Рассмотрим подробнее последний пример. Число 10 представляется в виде битов следущим образом (как байт, т.е. 8 битов):

После инвертирования всех битов получим:

А это и есть -11.

оператор Eqv

Используется для совершения логической эквивалентности двух выражений.

Синтаксис:

результат = выражение1 Eqv выражение2

результат обязателен; Любая числовая (включая Boolean) переменная
выражение1 обязательно; Любое выражение
выражение2 обязательно; Любое выражение

Замечания:

Следующая таблица показывает как работает оператор Eqv:

Для битов оператор Eqv работает следующим образом (смотреть слева направо)

0 0 1
0 1 0
1 0 0
1 1 1

Примеры:

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null
MyCheck = A > B Eqv B > C " Возвратит True.
MyCheck = B > A Eqv B > C " Возвратит False.
MyCheck = A > B Eqv B > D " Возвратит Null.
MyCheck = A Eqv B " Возвратит -3

оператор Imp

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

Синтаксис:

результат = выражение1 Imp выражение2

результат обязателен; Любая числовая (включая Boolean) переменная
выражение1 обязательно; Любое выражение
выражение2 обязательно; Любое выражение

Замечания:

Следующая таблица показывает как работает оператор Imp:

Если выражение1 =

, а выражение2 =

То результат =

True True True
True False False
True Null Null
False True True
False False True
False Null True
Null True True
Null False Null
Null Null Null

Для битов оператор Imp работает следующим образом (смотреть слева направо)

0 0 1
0 1 1
1 0 0
1 1 1

Примеры:

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null
MyCheck = A > B Imp B > C " Возвратит True.
MyCheck = A > B Imp C > B " Возвратит False.
MyCheck = B > A Imp C > B " Возвратит True.
MyCheck = B > A Imp C > D " Возвратит True.
MyCheck = C > D Imp B > A " Возвратит Null.
MyCheck = B Imp A " Возвратит -1

Операторы VBA: арифметические, логические, сравнения, присвоения

Оператор -- это наименьшая способная выполняться единица кода VBA. Оператор может объявлять или определять переменную, устанавливать параметр компилятора VBA или выполнять какое-либо действие в программе.

Арифметических операторов в VBA всего 7. Четыре стандартных: сложение (+), вычитание (-), умножение (*), деление (/) и еще три:

  • · возведение в степень (^), например 2^3 = 8;
  • · целочисленное деление (). Делит первое число на второе, отбрасывая (не округляя) дробную часть. Например, 52 = 2;
  • · деление по модулю (Mod). Делит первое число на второе, возвращая только остаток от деления. Например, 5 Mod 2 = 1.

Оператор присвоения в VBA -- знак равенства. Можно записывать так:

а можно еще проще:

Во втором случае не путайте знак равенства с оператором равенства.

Выражение

значит "присвоить переменной nVar значение 10", а если строка выглядит так:

то это значит "если значение переменной nVar равно 10".

Если переменной нужно назначить объект, то делается это другими способами.

Операторов сравнения в VBA всего 8:

  • · равенство (=), например, If (nVar = 10);
  • · больше, чем и меньше, чем (> и
  • · больше или равно и меньше или равно (>= и
  • · не равно (
  • · сравнение объектов (Is). Определяет, ссылаются объектные переменные на тот же объект или на разные, например, If(obj1 is obj2);
  • · подобие (Like). Сравнивает строковый объект с шаблоном и определяет, подходит ли шаблон.

Операторы сравнения всегда возвращают true или false -- true, если утверждение истинно, и false, если ложно.

Немного про сравнение строковых значений:

  • · при сравнении строковых значений регистр учитывается;
  • · пробелы в строковых значениях также учитываются;
  • · при сравнении текстовых строк на больше/меньше по умолчанию сравниваются просто двоичные коды символов -- какие больше или меньше. Если нужно использовать тот порядок, который идет в алфавите, то можно воспользоваться командой Option Compare Text

Чуть подробнее про оператор Like. Общий его синтаксис выглядит как

Выражение1 Like Выражение2

При этом Выражение1 -- любое текстовое выражение VBA, а Выражение2 -- шаблон, который передается оператору Like. В этом шаблоне можно использовать специальные подстановочные символы (см. Табл. 1)

Табл. 1 Подстановочные символы для оператора LIKE

Очень часто при проверке нескольких условий используются логические операторы:

  • · AND -- логическое И, должны быть истинными оба условия;
  • · OR -- логическое ИЛИ, должно быть истинным хотя бы одно из условий;
  • · NOT -- логическое отрицание, возвращает TRUE, если условие ложно;
  • · XOR -- логическое исключение. В выражении E1 XOR E2 возвращает TRUE, если только E1 = TRUE или только E2 = TRUE, иначе -- FALSE;
  • · EQV -- эквивалентность двух выражений, возвращает TRUE, если они имеют одинаковое значение;
  • · IMP -- импликация, возвращает FALSE, если E1 = TRUE и E2 = FALSE, иначе -- TRUE.

Помнить нужно про AND, OR, NOT, остальные логические операторы используются редко.

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

  • · при использовании & производится автоматическое преобразование числовых значений в строковые -- нет опасности допустить ошибку;
  • · при использовании оператора + сложение строкового значения со значением типа Null дает Null. Пример:

MsgBox "Сообщение пользователю" & vUserName

Порядок применения операторов можно регулировать при помощи круглых скобок.

3 . Переменные и типы данных

Переменные VBA, объявление переменных, Option Explicit, правила именования, типы данных VBA, исходные значения переменных

Переменные -- контейнеры для хранения изменяемых данных. Без них не обходится практически ни одна программа. Для простоты переменную можно сравнить с номерком в гардеробе -- вы сдаете в "гардероб" какие-то данные, в ответ вам выдается номерок. Когда вам опять потребовались эти данные, вы "предъявляете номерок" и получаете их. Пример работы с переменными в VBA может выглядеть так:

Dim nMyAge As Integer

nMyAge = nMyAge + 10

Dim nMyAge As Integer

Как расшифровать эту строку:

Dim -- это область видимости переменной. В VBA предусмотрено 4 ключевых слова для определения области видимости переменных:

  • · Dim -- используется в большинстве случаев. Если переменная объявлена как Dim в области объявлений модуля, она будет доступна во всем модуле, если в процедуре -- только на время работы этой процедуры;
  • · Private -- при объявлении переменных в VBA значит то же, что и Dim;
  • · Public -- такая переменная будет доступна всем процедурам во всех модулях данного проекта, если вы объявили ее в области объявлений модуля. Если вы объявили ее внутри процедуры, она будет вести себя как Dim/Private;
  • · Static -- такие переменные можно использовать только внутри процедуры. Эти переменные видны только внутри процедуры, в которой они объявлены, зато они сохраняют свое значение между разными вызовами этой процедуры. Обычно используются для накопления каких-либо значений. Например:

Static nVar1 As Integer

nVar1 = nVar1 + 1

Если нет никаких особых требований, то есть смысл всегда выбирать область видимости Dim.

Второе слово в нашем объявление (nMyAge) -- это идентификатор (проще говоря, имя) переменной. Правила выбора имен в VBA едины для многих элементов (переменные, константы, функции и процедуры и т.п.). Имя:

  • · должно начинаться с буквы;
  • · не должно содержать пробелов и символов пунктуации (исключение -- символ подчеркивания);
  • · максимальная длина -- 255 символов;
  • · должно быть уникальным в текущей области видимости (подробнее -- далее);
  • · зарезервированные слова (те, которые подсвечиваются другим цветом в окне редактора кода) использовать нельзя.

При создании программ VBA настоятельно рекомендуется определиться с правилами, по которым будут присваиваться имена объектам -- соглашение об именовании. Чаще всего используется так называемое венгерское соглашение (в честь одного из программистов Microsoft, Charles Simonyi, венгра по национальности):

  • · имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой переменной:
    • o str (или s) -- String, символьное значение;
    • o fn (или f) -- функция;
    • o c (или сделать все буквы заглавными) -- константа;
    • o b -- Boolean, логическое значение (true или false);
    • o d -- дата;
    • o obj (или o) -- ссылка на объект;
    • o n -- числовое значение.
  • · имена функций, методов и каждое слово в составном слове должно начинаться с заглавной буквы:

MsgBox objMyDocument.Name

Sub CheckDateSub()

· в ранних версиях VB не было слова Const -- все константы определялись как переменные, а для отличия их записывали заглавными буквами, между словами ставили подчеркивания: COMPANY_NAME

Многие программисты используют такой подход для обозначения констант и сейчас (но использование ключевого слова Const теперь обязательно -- об этом будет рассказано в следующем разделе).

Третья часть нашего объявления -- As Integer -- это указание на тип данных нашей переменной. Тип данных определяет, данные какого вида можно будет хранить в нашей переменной.

В VBA предусмотрены следующие типы данных:

· числовые (byte -- целое число от 0 до 255, integer -- целое число от -32768 до 32767, long -- большое целое число, currency (большое десятичное число с 19 позициями, включая 4 позиции после запятой), decimal (еще большее десятичное число с 29 позициями), single и double -- значение с плавающей запятой (double в два раза больше));

Внимание! Попытка объявить переменную с типом Decimal (например, Dim n As Decimal) приведет к синтаксической ошибке. Чтобы получить возможность работать с типом Decimal, переменную нужно изначально объявить как Variant или вообще объявить без типа (Dim n), поскольку тип данных Variant используется в VBA по умолчанию.

  • · строковые (string переменной длины (до примерно 2 млрд символов) и фиксированной длины (до примерно 65400 символов);
  • · дата и время (date -- от 01.01.100 до 31.12.9999);
  • · логический (boolean -- может хранить только значения True и False);
  • · объектный (object -- хранит ссылку на любой объект в памяти);
  • · Variant -- специальный тип данных, который может хранить любые другие типы данных.

Можно еще использовать пользовательские типы данных, но их вначале нужно определить при помощи выражения Type. Обычно пользовательские типы данных используются как дополнительное средство проверки вводимых пользователем значений (классический пример -- почтовый индекс).

Некоторые моменты, связанные с выбором типов данных для переменных:

  • · общий принцип -- выбирайте наименьший тип данных, который может вместить выбранные вами значения. Если есть какие-то сомнения -- выбирайте больший тип данных во избежание возникновения ошибок;
  • · если есть возможность, лучше не использовать типы данных с плавающей запятой (single и double). Работа с такими типами данных производится медленнее, кроме того, могут быть проблемы при сравнениях за счет округлений;
  • · если есть возможность, лучше не пользоваться типом Variant. Этот тип все равно приводится VBA к одному из других типов, но памяти для него требуется больше. Кроме того, в ходе такого неявного образования могут возникнуть ошибки;
  • · при определении переменных можно использовать так называемые символы определения типа (% -- integer, $ -- String и т.п.). Например, в нашем примере нужно закомментировать строку Dim nVar 1 As Integer, а во второй строке написать:

nVar1% = nVar1% + 1

Такой подход является устаревшим и к использованию не рекомендуется.

При объявлении переменных можно и не указывать ее тип. Например, наше объявление может выглядеть так: Dim nVar1

В этом случае переменная будет автоматически объявлена с типом Variant.

В принципе, в VBA можно работать и без объявления переменных. Например, такой код

nVar1 = nVar1 + 1

будет вполне работоспособным. Если мы используем переменную в программе без ее объявления, то будет автоматически создана новая переменная типа Variant. Однако объявлять переменные нужно обязательно! И при этом желательно явно указывать нужный тип данных. Почему:

  • · сокращается количество ошибок: программа с самого начала откажется принимать в переменную значение неправильно типа (например, строковое вместо числового);
  • · при работе с объектами подсказка по свойствам и методам действует только тогда, когда мы изначально объявили объектную переменную с нужным типом. Например, в Excel два варианта кода будут работать одинаково:

первый вариант:

Dim oWbk As Workbook

Set oWbk = Workbooks.Add()

второй вариант:

Set oWbk = Workbooks.Add()

Но подсказка по свойствам и методам объекта oWbk будет работать только во втором случае.

Все опытные разработчики вообще запрещают использование переменных без явного их объявления. Для этого можно воспользоваться специальной командой компилятора (она помещается только в раздел объявлений модуля) Option Explicit

а можно вставлять эту команду во все модули при их создании автоматически -- установив в окне редактора кода флажок Require Variable Declarations (меню Tools -> Options, вкладка Editor).

Проиллюстрировать, зачем они это делают, можно на простом примере:

С виду код не должен вызывать никаких проблем и просто выводить в окне сообщения единицу. На самом деле он выведет пустое окно сообщения. Причина спрятана очень коварно: в третьей строке n -- это вовсе не английская буква N, а русская П. На вид в окне редактора кода отличить их очень сложно. В то же время компилятор VBA, встретив такой код, просто создаст новую переменную с типом данных Variant, у которой будет пустое значение. На выявление такой ошибки может потребоваться определенное время.

Хорошее правило -- объявлять переменные заблаговременно, а не когда они потребовались. Это позволяет сделать программу более читаемой и четко спланированной.

Можно объявить несколько переменных в одной строке, например, так:

Dim n1 As Integer, s1 As String

Присвоение значений переменным выглядит так:

Если нужно увеличить уже существующее значение переменной, то команда может выглядеть так:

nVar1 = nVar1 + 1

В обоих примерах знак равенства означает не "равно", а присвоить.

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

· строковые значения всегда заключаются в двойные кавычки:

sVar1 = "Hello";

значение даты/времени заключаются в "решетки" -- символы фунта:

dVar1 = #05/06/2004#

Обратите внимание, что при присвоении значения даты/времени таким "явным способом" нам придется использовать принятые в США стандарты: 05 в данном случае -- это месяц, 06 -- день. Отображение же этого значения (например, в окне сообщения) будет зависеть от региональных настроек на компьютере пользователя.

Если нужно передать шестнадцатеричное значение, то перед ним ставятся символы &H:

Что содержится в переменных до присвоения им значений?

  • · В переменных всех числовых типов данных -- 0.
  • · В строковых переменных переменной длины -- "" (строка нулевой длины).
  • · В строковых переменных фиксированной длины -- строка данной длины с символами ASCII 0 (эти символы на экран не выводятся).
  • · В Variant -- пустое значение.
  • · В Object -- ничто (нет ссылки ни на один из объектов).

Эти операторы сравнивают два выражения для определения равны ли они, и если нет то, как они отличаются. Is , IsNot и Like детально обсуждаются на отдельных страницах справки. Отношения операторов сравнения обсуждаются на этой странице.

Result = expression1 comparisonoperator expression2 result = object1 object2 result = string Like pattern

result
Обязательный. Результатом является значение Boolean , представляющее результат сравнения.

expression
Обязательный. Произвольное выражение.

comparisonoperator
Обязательный. Любой оператор сравнения отношения.

object1 , object2
Обязательный. Имя любого ссылочного объекта.

string
Обязательный. Произвольное выражение типа String .

pattern
Обязательный. Любое выражение String или диапазон символов.

В следующей таблице приводится список операторов сравнения и условий, определяющих, является ли result True или False .

Примечание

При сравнении строк строковые выражения вычисляются на основе их алфавитного порядка сортировки, который зависит от параметра Option Compare .

Option Compare Binary задает метод сравнения строк на основе порядка сортировки, определяемого внутренним двоичным представлением символов. Порядок сортировки определяется кодовой страницей. В следующем примере показан типичный порядок двоичной сортировки.

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Option Compare Text задает метод сравнения строк на основе порядка сортировки текста (без учета регистра), определяемого региональными установками приложения. При установке Option Compare Text и сортировке символов в предыдущем примере применяется следующий текстовый порядок сортировки:

(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Зависимость от языкового стандарта

При установке Option Compare Text результат сравнения строк может зависеть от языкового стандарта, в котором выполняется приложение. Два символа в одном языковом стандарте могут считаться равными, а в другом нет. При использовании сравнения строк для принятия важных решений, например разрешить ли попытку входа в систему, следует учитывать чувствительность к языковым стандартам. Рассмотрите возможность установки Option Compare Binary или вызова , который учитывает языковой стандарт.

Использование операторов сравнения с выражениями Object не допускается при Option Strict On . При Option Strict Off и либо выражение expression1 , либо expression2 является Object , типы времени выполнения определяют, как они будут сравниваться. В следующей таблице показано сравнение выражений и результаты сравнения в зависимости от типа операндов, определяемых во время выполнения:

При числовом сравнении Nothing приравнивается к 0. При сравнении строк Nothing обрабатывается как "" (пустая строка).

Операторы сравнения (< . <= , > , >= , = , <>) могут быть перегружены ; это означает, что класс или структура могут переопределить их поведение, когда операнд имеет тип этого класса или структуры. Если ваш код использует эти операторы для такого класса или структуры, убедитесь, что вы понимаете его переопределенное поведение. Дополнительные сведения см. в разделе

Похожие статьи