Операторы VBA: арифметические, логические, сравнения, присвоения
Оператор — это наименьшая способная выполняться единица кода VBA. Оператор может объявлять или определять переменную, устанавливать параметр компилятора VBA или выполнять какое-либо действие в программе.
Арифметических операторов в VBA всего 7. Четыре стандартных: сложение (+), вычитание (-), умножение (*), деление (/) и еще три:
- возведение в степень (^), например 2^3 = 8;
- целочисленное деление (). Делит первое число на второе, отбрасывая (не округляя) дробную часть. Например, 52 = 2;
- деление по модулю (Mod). Делит первое число на второе, возвращая только остаток от деления. Например, 5 Mod 2 = 1.
Оператор присвоения в VBA — знак равенства. Можно записывать так: Let nVar = 10
а можно еще проще: nVar = 10
Во втором случае не путайте знак равенства с оператором равенства.
Выражение nVar = 10 значит «присвоить переменной nVar значение 10», а если строка выглядит так:
If (nVar = 10) то это значит «если значение переменной nVar равно 10».
Если переменной нужно назначить объект, то делается это другими способами.
Операторов сравнения в VBA всего 8:
- равенство (=), например, If (nVar = 10);
- больше, чем и меньше, чем (> и <), например, If (nVar > 10) ;
- больше или равно и меньше или равно (>= и ≤), например, If (nVar >= 10) ;
- не равно (<>), например, If (nVar<>10) ;
- сравнение объектов (Is). Определяет, ссылаются объектные переменные на тот же объект или на разные, например, If (obj1 is obj2) ;
- подобие (Like). Сравнивает строковый объект с шаблоном и определяет, подходит ли шаблон.
Операторы сравнения всегда возвращают true или false — true, если утверждение истинно, и false, если ложно.
Немного про сравнение строковых значений:
- при сравнении строковых значений регистр учитывается;
- пробелы в строковых значениях также учитываются;
- при сравнении текстовых строк на больше/меньше по умолчанию сравниваются просто двоичные коды символов — какие больше или меньше. Если нужно использовать тот порядок, который идет в алфавите, то можно воспользоваться командой
Option Compare Text
Чуть подробнее про оператор Like. Общий его синтаксис выглядит как
Выражение1 Like Выражение2
При этом Выражение1 — любое текстовое выражение VBA, а Выражение2 — шаблон, который передается оператору Like. В этом шаблоне можно использовать специальные подстановочные символы
Подстановочные символы для оператора LIKE
Подстановочный символ |
Значение |
# |
Любая цифра (только одна) от 0 до 9 |
* |
Любое количество любых символов (включая нулевое) |
? |
Любой символ (только один) |
[a,b,c] |
Любой символ (только один) из приведенного списка |
[!a,b,c] |
Любой символ (только один), кроме приведенных в списке |
Очень часто при проверке нескольких условий используются логические операторы:
- 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.
Возможно вам это будет интересно!
2020-11-30
На чтение 6 мин Опубликовано 15.12.2015
Содержание
- Операторы Excel VBA
- Математические операторы
- Строковые операторы
- Операторы сравнения
- Логические операторы
- Встроенные функции
Операторы Excel VBA
При написании кода VBA в Excel набор встроенных операторов используют на каждом шагу. Эти операторы делятся на математические, строковые, операторы сравнения и логические. Далее мы подробно рассмотрим каждую группу операторов.
Математические операторы
Основные математические операторы VBA перечислены в таблице ниже.
В правом столбце таблицы указан приоритет операторов, принятый по умолчанию при отсутствии скобок. Добавляя в выражение скобки, можно изменять порядок выполнения операторов VBA по своему желанию.
Оператор | Действие | Приоритет (1 — высший; 5 — низший) |
---|---|---|
^ | Оператор возведения в степень | 1 |
* | Оператор умножения | 2 |
/ | Оператор деления | 2 |
Оператор деления без остатка – возвращает результат деления двух чисел без остатка. Например, 74 возвратит результат 1 | 3 | |
Mod | Оператор модуля (остатка) – возвращает остаток от деления двух чисел. Например, 8 Mod 3 возвратит результат 2. | 4 |
+ | Оператор сложения | 5 |
— | Оператор вычитания | 5 |
Строковые операторы
Основной строковый оператор в Excel VBA – это оператор конкатенации & (слияние):
Оператор | Действие |
---|---|
& | Оператор конкатенации. К примеру, выражение «A» & «B» возвратит результат AB. |
Операторы сравнения
Операторы сравнения используются для сравнения двух чисел или строк и возвращают логическое значение типа Boolean (True или False). Основные операторы сравнения Excel VBA перечислены в этой таблице:
Оператор | Действие |
---|---|
= | Равно |
<> | Не равно |
< | Меньше |
> | Больше |
<= | Меньше либо равно |
>= | Больше либо равно |
Логические операторы
Логические операторы, как и операторы сравнения, возвращают логическое значение типа Boolean (True или False). Основные логические операторы Excel VBA перечислены в таблице ниже:
Оператор | Действие |
---|---|
And | Операция конъюнкции, логический оператор И. Например, выражение A And B возвратит True, если A и B оба равны True, в противном случае возвратит False. |
Or | Операция дизъюнкции, логический оператор ИЛИ. Например, выражение A Or B возвратит True, если A или B равны True, и возвратит False, если A и B оба равны False. |
Not | Операция отрицания, логический оператор НЕ. Например, выражение Not A возвратит True, если A равно False, или возвратит False, если A равно True. |
В приведённой выше таблице перечислены не все логические операторы, доступные в VBA. Полный список логических операторов можно найти на сайте Visual Basic Developer Center.
Встроенные функции
В VBA доступно множество встроенных функций, которые могут быть использованы при написании кода. Ниже перечислены некоторые из наиболее часто используемых:
Функция | Действие | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Abs | Возвращает абсолютную величину заданного числа.
Пример:
|
||||||||||||||||||||||
Chr | Возвращает символ ANSI, соответствующий числовому значению параметра.
Пример:
|
||||||||||||||||||||||
Date | Возвращает текущую системную дату. | ||||||||||||||||||||||
DateAdd | Добавляет определённый временной интервал к заданной дате. Синтаксис функции:
Где аргумент интервал определяет тип временного интервала, добавляемого к заданной дате в количестве, указанном в аргументе число. Аргумент интервал может принимать одно из следующих значений:
Пример:
|
||||||||||||||||||||||
DateDiff | Вычисляет количество определённых временных интервалов между двумя заданными датами.
Пример:
|
||||||||||||||||||||||
Day | Возвращает целое число, соответствующее дню месяца в заданной дате.
Пример: Day(«29/01/2015») возвращает число 29. |
||||||||||||||||||||||
Hour | Возвращает целое число, соответствующее количеству часов в заданном времени.
Пример: Hour(«22:45:00») возвращает число 22. |
||||||||||||||||||||||
InStr | Принимает в качестве аргументов целое число и две строки. Возвращает позицию вхождения второй строки внутри первой, начиная поиск с позиции, заданной целым числом.
Пример:
Примечание: Аргумент-число может быть не задан, в таком случае поиск начинается с первого символа строки, заданной во втором аргументе функции. |
||||||||||||||||||||||
Int | Возвращает целую часть заданного числа.
Пример: Int(5.79) возвращает результат 5. |
||||||||||||||||||||||
Isdate | Возвращает True, если заданное значение является датой, или False – если датой не является.
Пример:
|
||||||||||||||||||||||
IsError | Возвращает True, если заданное значение является ошибкой, или False – если ошибкой не является. | ||||||||||||||||||||||
IsMissing | В качестве аргумента функции передаётся имя необязательного аргумента процедуры. IsMissing возвращает True, если для рассматриваемого аргумента процедуры не передано значение. | ||||||||||||||||||||||
IsNumeric | Возвращает True, если заданное значение может быть рассмотрено как число, в противном случае возвращает False. | ||||||||||||||||||||||
Left | Возвращает заданное количество символов от начала переданной строки. Синтаксис функции вот такой:
где строка – это исходная строка, а длина – количество возвращаемых символов, считая от начала строки. Пример:
|
||||||||||||||||||||||
Len | Возвращает количество символов в строке.
Пример: Len(«абвгдеж») возвращает число 7. |
||||||||||||||||||||||
Month | Возвращает целое число, соответствующее месяцу в заданной дате.
Пример: Month(«29/01/2015») возвращает значение 1. |
||||||||||||||||||||||
Mid | Возвращает заданное количество символов из середины переданной строки. Синтаксис функции:
Mid(строка, начало, длина) где строка – это исходная строка, начало – позиция начала извлекаемой строки, длина – количество символов, которые требуется извлечь. Пример:
|
||||||||||||||||||||||
Minute | Возвращает целое число, соответствующее количеству минут в заданном времени.Пример: Minute(«22:45:15») возвращает значение 45. | ||||||||||||||||||||||
Now | Возвращает текущую системную дату и время. | ||||||||||||||||||||||
Right | Возвращает заданное количество символов от конца переданной строки. Синтаксис функции:
Right(строка, длина) Где строка – это исходная строка, а длина – это количество символов, которые надо извлечь, считая от конца заданной строки. Пример:
|
||||||||||||||||||||||
Second | Возвращает целое число, соответствующее количеству секунд в заданном времени.
Пример: Second(«22:45:15») возвращает значение 15. |
||||||||||||||||||||||
Sqr | Возвращает квадратный корень числовой величины, переданной в аргументе.
Пример:
|
||||||||||||||||||||||
Time | Возвращает текущее системное время. | ||||||||||||||||||||||
Ubound | Возвращает верхний индекс измерения заданного массива.
Примечание: Для многомерных массивов в качестве необязательного аргумента может быть указано, индекс какого именно измерения нужо возвратить. Если не указано, то по умолчанию равно 1. |
||||||||||||||||||||||
Year | Возвращает целое число, соответствующее году в заданной дате.Пример: Year(«29/01/2015») возвращает значение 2015. |
Данный список включает в себя только избранные наиболее часто употребляемые встроенные функции Excel Visual Basic. Исчерпывающий список функций VBA, доступных для использования в макросах Excel, можно найти на сайте Visual Basic Developer Center.
Оцените качество статьи. Нам важно ваше мнение:
Работа с текстом в коде VBA Excel. Функции, оператор &
и другие ключевые слова для работы с текстом. Примеры использования некоторых функций и ключевых слов.
Функции для работы с текстом
Основные функции для работы с текстом в VBA Excel:
Функция | Описание |
---|---|
Asc(строка) | Возвращает числовой код символа, соответствующий первому символу строки. Например: MsgBox Asc(«/Stop»). Ответ: 47, что соответствует символу «/». |
Chr(код символа) | Возвращает строковый символ по указанному коду. Например: MsgBox Chr(47). Ответ: «/». |
Format(Expression, [FormatExpression], [FirstDayOfWeek], [FirstWeekOfYear]) | Преобразует число, дату, время в строку (тип данных Variant (String)), отформатированную в соответствии с инструкциями, включенными в выражение формата. Подробнее… |
InStr([начало], строка1, строка2, [сравнение]) | Возвращает порядковый номер символа, соответствующий первому вхождению одной строки (строка2) в другую (строка1) с начала строки. Подробнее… |
InstrRev(строка1, строка2, [начало, [сравнение]]) | Возвращает порядковый номер символа, соответствующий первому вхождению одной строки (строка2) в другую (строка1) с конца строки. Подробнее… |
Join(SourceArray,[Delimiter]) | Возвращает строку, созданную путем объединения нескольких подстрок из массива. Подробнее… |
LCase(строка) | Преобразует буквенные символы строки в нижний регистр. |
Left(строка, длина) | Возвращает левую часть строки с заданным количеством символов. Подробнее… |
Len(строка) | Возвращает число символов, содержащихся в строке. |
LTrim(строка) | Возвращает строку без начальных пробелов (слева). Подробнее… |
Mid(строка, начало, [длина]) | Возвращает часть строки с заданным количеством символов, начиная с указанного символа (по номеру). Подробнее… |
Replace(expression, find, replace, [start], [count], [compare]) | Возвращает строку, полученную в результате замены одной подстроки в исходном строковом выражении другой подстрокой указанное количество раз. Подробнее… |
Right(строка, длина) | Возвращает правую часть строки с заданным количеством символов. Подробнее… |
RTrim(строка) | Возвращает строку без конечных пробелов (справа). Подробнее… |
Space(число) | Возвращает строку, состоящую из указанного числа пробелов. Подробнее… |
Split(Expression,[Delimiter],[Limit],[Compare]) | Возвращает одномерный массив подстрок, извлеченных из указанной строки с разделителями. Подробнее… |
StrComp(строка1, строка2, [сравнение]) | Возвращает числовое значение Variant (Integer), показывающее результат сравнения двух строк. Подробнее… |
StrConv(string, conversion) | Изменяет регистр символов исходной строки в соответствии с заданным параметром «conversion». Подробнее… |
String(число, символ) | Возвращает строку, состоящую из указанного числа символов. В выражении «символ» может быть указан кодом символа или строкой, первый символ которой будет использован в качестве параметра «символ». Подробнее… |
StrReverse(строка) | Возвращает строку с обратным порядком следования знаков по сравнению с исходной строкой. Подробнее… |
Trim(строка) | Возвращает строку без начальных (слева) и конечных (справа) пробелов. Подробнее… |
UCase(строка) | Преобразует буквенные символы строки в верхний регистр. |
Val(строка) | Возвращает символы, распознанные как цифры с начала строки и до первого нецифрового символа, в виде числового значения соответствующего типа. Подробнее… |
WorksheetFunction.Trim(строка) | Функция рабочего листа, которая удаляет все лишние пробелы (начальные, конечные и внутренние), оставляя внутри строки одиночные пробелы. |
В таблице перечислены основные функции VBA Excel для работы с текстом. С полным списком всевозможных функций вы можете ознакомиться на сайте разработчика.
Ключевые слова для работы с текстом
Ключевое слово | Описание |
---|---|
& | Оператор & объединяет два выражения (результат = выражение1 & выражение2). Если выражение не является строкой, оно преобразуется в Variant (String), и результат возвращает значение Variant (String). Если оба выражения возвращают строку, результат возвращает значение String. |
vbCrLf | Константа vbCrLf сочетает в себе возврат каретки и перевод строки (Chr(13) + Chr(10)) и переносит последующий текст на новую строку (результат = строка1 & vbCrLf & строка2). |
vbNewLine | Константа vbNewLine в VBA Excel аналогична константе vbCrLf, также сочетает в себе возврат каретки и перевод строки (Chr(13) + Chr(10)) и переносит текст на новую строку (результат = строка1 & vbNewLine & строка2). |
Примеры
Вывод прямых парных кавычек
Прямые парные кавычки в VBA Excel являются спецсимволами и вывести их, заключив в самих себя или в одинарные кавычки (апострофы), невозможно. Для этого подойдет функция Chr:
Sub Primer1() ‘Вывод одной прямой парной кавычки MsgBox Chr(34) ‘Отображение текста в прямых кавычках MsgBox Chr(34) & «Волга» & Chr(34) ‘Вывод 10 прямых парных кавычек подряд MsgBox String(10, Chr(34)) End Sub |
Смотрите интересное решение по выводу прямых кавычек с помощью прямых кавычек в первом комментарии.
Отображение слов наоборот
Преобразование слова «налим» в «Милан»:
Sub Primer2() Dim stroka stroka = «налим» stroka = StrReverse(stroka) ‘милан stroka = StrConv(stroka, 3) ‘Милан MsgBox stroka End Sub |
или одной строкой:
Sub Primer3() MsgBox StrConv(StrReverse(«налим»), 3) End Sub |
Преобразование слова «лето» в «отель»:
Sub Primer4() Dim stroka stroka = «лето» stroka = StrReverse(stroka) ‘отел stroka = stroka & «ь» ‘отель MsgBox stroka End Sub |
или одной строкой:
Sub Primer5() MsgBox StrReverse(«лето») & «ь» End Sub |
Печатная машинка
Следующий код VBA Excel в замедленном режиме посимвольно печатает указанную строку на пользовательской форме, имитируя печатную машинку.
Для реализации этого примера понадобится пользовательская форма (UserForm1) с надписью (Label1) и кнопкой (CommandButton1):
Код имитации печатной машинки состоит из двух процедур, первая из которых замедляет выполнение второй, создавая паузу перед отображением очередного символа, что и создает эффект печатающей машинки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub StopSub(Pause As Single) Dim Start As Single Start = Timer Do While Timer < Start + Pause DoEvents Loop End Sub Private Sub CommandButton1_Click() Dim stroka As String, i As Byte stroka = «Печатная машинка!» Label1.Caption = «» For i = 1 To Len(stroka) Call StopSub(0.25) ‘пауза в секундах ‘следующая строка кода добавляет очередную букву Label1.Caption = Label1.Caption & Mid(stroka, i, 1) Next End Sub |
Обе процедуры размещаются в модуле формы. Нажатие кнопки CommandButton1 запустит замедленную печать символов в поле надписи, имитируя печатную машинку.
замечания
Операторы оцениваются в следующем порядке:
- Математические операторы
- Побитовые операторы
- Операторы конкатенации
- Операторы сравнения
- Логические операторы
Операторы с совпадающим приоритетом оцениваются слева направо. Порядок по умолчанию можно переопределить, используя круглые скобки (
и )
для группировки выражений.
Математические операторы
Перечислено в порядке очередности:
знак | название | Описание |
---|---|---|
^ |
Возведение | Верните результат подъема левого операнда в силу правого операнда. Обратите внимание, что значение, возвращаемое экспоненциацией, всегда равно Double , независимо от того, какие типы значений делятся. Любое принуждение результата к переменному типу происходит после выполнения вычисления. |
/ |
Раздел 1 | Возвращает результат деления левого операнда на правый операнд. Обратите внимание, что значение, возвращаемое делением, всегда равно Double , независимо от того, какие типы значений делятся. Любое принуждение результата к переменному типу происходит после выполнения вычисления. |
* |
Умножение 1 | Возвращает произведение двух операндов. |
|
Целостный отдел | Возвращает целочисленный результат деления левого операнда правым операндом после округления обеих сторон с округлением .5. Любое остальное подразделение игнорируется. Если правый операнд (делитель) равен 0 , это приведет к ошибке времени выполнения 11: деление на ноль. Обратите внимание, что это происходит после округления — выражения, такие как 3 0.4 , также приводят к делению на нулевую ошибку. |
Mod |
Модульное | Возвращает целочисленный остаток деления левого операнда на правый операнд. Операнд с каждой стороны округляется до целого числа до деления с округлением .5. Например, и 8.6 Mod 3 и 12 Mod 2.6 приводят к 0 . Если правый операнд (делитель) равен 0 , это приведет к ошибке времени выполнения 11: деление на ноль. Обратите внимание, что это выполняется после округления — выражения, такие как 3 Mod 0.4 , также приводят к делению на нулевую ошибку. |
- |
Вычитание 2 | Возвращает результат вычитания правого операнда из левого операнда. |
+ |
Добавление 2 | Возвращает сумму из двух операндов. Обратите внимание, что этот токен также рассматривается как оператор конкатенации, когда он применяется к String . См. Операторы конкатенации . |
1 Умножение и деление рассматриваются как имеющие тот же приоритет.
2 Сложение и вычитание рассматриваются как имеющие тот же приоритет.
Операторы конкатенации
VBA поддерживает 2 разных оператора конкатенации +
и &
и выполняет одну и ту же функцию при использовании со String
типами — правая String
добавляется к концу левой String
.
Если оператор &
используется с переменным типом, отличным от String
, он неявно передается в String
перед конкатенацией.
Обратите внимание, что оператор +
конкатенации является перегрузкой оператора +
сложения. Поведение +
определяется переменными типами операндов и приоритетом типов операторов. Если оба операнда напечатаны как String
или Variant
с Variant
String
, они объединяются:
Public Sub Example()
Dim left As String
Dim right As String
left = "5"
right = "5"
Debug.Print left + right 'Prints "55"
End Sub
Если какая- либо сторона является числовым типом, а другая сторона является String
которая может быть принудительно введена в число, приоритет типа математических операторов заставляет оператора обрабатываться как оператор сложения и добавляются числовые значения:
Public Sub Example()
Dim left As Variant
Dim right As String
left = 5
right = "5"
Debug.Print left + right 'Prints 10
End Sub
Такое поведение может привести к тонким, трудно отлаживающим ошибкам, особенно если используются типы Variant
, поэтому для конкатенации обычно следует использовать оператор &
.
Операторы сравнения
знак | название | Описание |
---|---|---|
= |
Равно | Возвращает True если левый и правый операнды равны. Обратите внимание, что это перегрузка оператора присваивания. |
<> |
Не равен | Возвращает True если левый и правый операнды не равны. |
> |
Лучше чем | Возвращает True если левый операнд больше правого операнда. |
< |
Меньше, чем | Возвращает True если левый операнд меньше правого операнда. |
>= |
Больше или равно | Возвращает True если если левый операнд больше или равен правому операнду. |
<= |
Меньше или равно | Возвращает True если левый операнд меньше или равен правому операнду. |
Is |
Справочный капитал | Возвращает значение True если ссылка на левый объект — это тот же экземпляр, что и ссылка на правый объект. Он также может использоваться с Nothing (ссылка на нулевой объект) с обеих сторон. Примечание. Оператор Is попытается принудить оба операнда к Object перед выполнением сравнения. Если какая-либо сторона является примитивным типом или Variant , который не содержит объект (либо не-объектный подтип, либо vtEmpty ), сравнение приведет к ошибке времени выполнения 424 — «Требуется объект». Если любой операнд принадлежит другому интерфейсу одного и того же объекта, сравнение вернет True . Если вам нужно проверить справедливость как экземпляра, так и интерфейса, ObjPtr(left) = ObjPtr(right) используйте ObjPtr(left) = ObjPtr(right) . |
Заметки
Синтаксис VBA позволяет «цепочки» операторов сравнения, но в целом эти конструкции следует избегать. Сравнение всегда выполняется слева направо только на 2 операндах за раз, и каждое сравнение приводит к Boolean
. Например, выражение …
a = 2: b = 1: c = 0
expr = a > b > c
… может быть прочитан в некоторых контекстах как проверка того, является ли b
между a
и c
. В VBA это оценивается следующим образом:
a = 2: b = 1: c = 0
expr = a > b > c
expr = (2 > 1) > 0
expr = True > 0
expr = -1 > 0 'CInt(True) = -1
expr = False
Любой оператор сравнения, кроме Is
использоваться с Object
в качестве операнда будет выполняться на возвращаемом значении Object
«s члена по умолчанию . Если объект не имеет члена по умолчанию, сравнение приведет к ошибке времени выполнения 438 — «Объект не поддерживает его свойство или метод».
Если Object
не инициализирован, сравнение приведет к ошибке времени выполнения 91 — «Объектная переменная или С заблокированной переменной блока».
Если литерал Nothing
используется с любым оператором сравнения, отличным от Is
, это приведет к ошибке компиляции — «Недопустимое использование объекта».
Если Object
по умолчанию Object
является другой Object
, VBA будет постоянно вызывать элемент по умолчанию каждого последующего возвращаемого значения до тех пор, пока не будет возвращен примитивный тип или не будет поднята ошибка. Например, предположим, что у SomeClass
есть член по умолчанию Value
, который является экземпляром ChildClass
с членом ChildValue
по ChildValue
. Сравнение…
Set x = New SomeClass
Debug.Print x > 42
… будет оцениваться как:
Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42
Если либо операнд является числовым, а другой операндом является String
или Variant
подтипа String
, будет выполнено числовое сравнение. В этом случае, если String
не может быть отнесено к числу, результатом сравнения будет ошибка времени выполнения 13 — «Несоответствие типа».
Если оба операнда представляют собой String
или Variant
подтипа String
, сравнение строк будет выполняться на основе параметра сравнения параметров модуля кода. Эти сравнения выполняются по характеру по характеру. Обратите внимание, что символьное представление String
содержащей число, не совпадает с сопоставлением числовых значений:
Public Sub Example()
Dim left As Variant
Dim right As Variant
left = "42"
right = "5"
Debug.Print left > right 'Prints False
Debug.Print Val(left) > Val(right) 'Prints True
End Sub
По этой причине убедитесь, что переменные String
или Variant
передаются в числа перед выполнением численных сравнений неравенства.
Если один из операндов — это Date
, то числовое сравнение по базовому двойному значению будет выполняться, если другой операнд является числовым или может быть преобразован в числовой тип.
Если другой операнд представляет собой String
или Variant
подтипа String
который может быть перенесен в Date
с использованием текущего языкового стандарта, String
будет передана в Date
. Если он не может быть применен к Date
в текущей локали, результатом сравнения будет ошибка времени выполнения 13 — «Несоответствие типа».
Следует соблюдать осторожность при сравнении значений Double
или Single
и Booleans . В отличие от других числовых типов ненулевые значения нельзя считать True
из-за поведения VBA в продвижении типа данных сравнения с использованием числа с плавающей точкой в Double
:
Public Sub Example()
Dim Test As Double
Test = 42 Debug.Print CBool(Test) 'Prints True.
'True is promoted to Double - Test is not cast to Boolean
Debug.Print Test = True 'Prints False
'With explicit casts:
Debug.Print CBool(Test) = True 'Prints True
Debug.Print CDbl(-1) = CDbl(True) 'Prints True
End Sub
Побитовые Логические операторы
Все логические операторы в VBA можно рассматривать как «переопределения» побитовых операторов с тем же именем. Технически они всегда рассматриваются как побитовые операторы. Все операторы сравнения в VBA возвращают логическое значение , которое всегда не будет содержать ни одного из его битов ( False
) или всех его битов ( True
). Но он будет обрабатывать значение с любым битом, установленным как True
. Это означает, что результат приведения побитового результата выражения в Boolean
(см. Операторы сравнения) всегда будет таким же, как рассматривать его как логическое выражение.
Присвоение результата выражения с использованием одного из этих операторов даст побитовый результат. Обратите внимание, что в таблицах истинности ниже 0
эквивалентно False
и 1
эквивалентно True
.
And
Возвращает True
если выражения с обеих сторон оцениваются как True
.
Левый Операнд | Правый операнд | Результат |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Or
Возвращает значение True
если любая из сторон выражения имеет значение True
.
Левый Операнд | Правый операнд | Результат |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Not
Возвращает True
если выражение оценивается как False
и False
если выражение оценивается как True
.
Правый операнд | Результат |
---|---|
0 | 1 |
1 | 0 |
Not
единственный операнд без левого операнда. Редактор Visual Basic автоматически упростит выражения с помощью аргумента левой руки. Если вы наберете …
Debug.Print x Not y
… VBE изменит линию на:
Debug.Print Not x
Аналогичные упрощения будут сделаны для любого выражения, содержащего левый операнд (включая выражения) для Not
.
Xor
Также известен как «эксклюзивный» или «эксклюзивный». Возвращает значение True
если оба выражения оцениваются по разным результатам.
Левый Операнд | Правый операнд | Результат |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Заметим, что хотя оператор Xor
можно использовать как логический оператор, нет абсолютно никаких оснований для этого, поскольку он дает тот же результат, что и оператор сравнения <>
.
Eqv
Также известен как «эквивалентность». Возвращает True
когда оба выражения оцениваются с одним и тем же результатом.
Левый Операнд | Правый операнд | Результат |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Обратите внимание, что функция Eqv
очень редко используется, поскольку x Eqv y
эквивалентно гораздо более читаемому Not (x Xor y)
.
Imp
Также известен как «импликация». Возвращает True
если оба операнда одинаковы или второй операнд имеет значение True
.
Левый Операнд | Правый операнд | Результат |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
Обратите внимание, что функция Imp
очень редко используется. Хорошим правилом является то, что если вы не можете объяснить, что это значит, вы должны использовать другую конструкцию.
Условные обозначения:
a|b — вводится одно из нескольких возможных значений, [x] — необязательные параметры,
<информация, которая должна быть введена пользователем или программой>.
Введение
Прежде чем вы приступите к чтению, мне хотелось изложить определенный взгляд на этапы продвижения большинства пользователей по пути освоения программирования на VBA, в первую очередь — в Word.
Считаю чрезвычайно важным тот аспект, что VBA — единственный известный мне язык, позволяющий последовательно двигаться в своем развитии от абсолютной примитивности,
но остающийся при этом прикладным.
Каждый, кто будет приобщаться к разработке, неизбежно пройдет определенные стадии.
- Изначальной предпосылкой всегда будет осознанная необходимость или принуждение в учебном процессе.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Поскольку любые подобные осмысления представляют собой многомерную сеть, их описание в последовательном текстовом виде категорически невозможно.
Каждый идет своей дорогой.
….
Операторы
Microsoft делит операторы в VBA на арифметические, объединения, сравнения и логические, что, в общем, сразу и нарушает.
Поэтому мы пойдем немного своим путем, что сути не изменит, но упростит понимание.
Первичная суть заключается в том, что с помощью операторов можно оценить данные или произвести их простейшие изменения.
Оператор | Название оператора | Пример операции | Результат |
= | Присваивание | с = с + 1 | Увеличение значения x на 1 |
+ | Сложение | x = 2 + 5 | x = 7 |
— | Вычитание | x = 2 — 5 | x = -3 |
* | Умножение | x = 2 * 5 | x = 10 |
^ | Возведение в степень | x = 2^3 | x = 8 |
/ | Деление | x = 2/5 | x = 0,4 |
Целая часть от деления | x = 125 | x = 2 | |
Mod | Остаток от деления (modulo of division) | x = 2 Mod 5 x = 10 Mod 4 |
x = 2 (5*0+2) x = 2 (4*2+2) |
&/+ | Конкатенация (слияние) выражений с преобразованием их к типу String. Может использоваться для соединения данных разного типа в символьный |
x = «2» & «5», либо x = «2» & 5, либо(!) x = «2» + «5» |
x = «25» |
В отличие от других операторов, присваивание может быть использовано в строке только один раз, в связи с чем во многих случаях для него используется
предварительное двоеточие: Unit:=wdCharacter.
В Visual Basic двоеточие служит для оформления нескольких строк в одну. Зачастую это не только делает текст более компактным, но и помогает быстрее его понять:
x(1,1) = «Иванов» : x(1,2) = «Иван» : x(1,3) = «Иванович» : x(1,4) = «01.01.1990»
Операторы сравнения
Возвращают значение True, False или NULL.
Оператор | Название оператора |
= | Тот же, что и присвоение |
< | Меньше |
> | Больше |
<= | Меньше или равно |
>= | Больше или равно |
<> | Не равно |
Is | Сравнение двух объектов |
Like | Сравнение двух строк с возможностью использования шаблона |
Eqv | Сравнение двух выражений |
Одной из наиболее серьезных проблем остается понимание, что сравнивать несравнимое тоже можно.
Только результат будет существенно отличаться от общечеловеческой логики.
Подробнее см. у Microsoft.
Логические операторы
Также можно изучить материал, посвященный алгебре логики.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Переменные и типы данных
Именование переменных
См. в материале по основам программирования.
Создание переменных
Если не задана обязательность объявления переменной (Option Explicit), то любая переменная может быть создана самим фактом ее использования.
То есть строка x = 1 создаст переменную x с типом Variant и присвоит ей числовое значение единицы.
При этом ничто не препятствует использовать команду создания с указанием типа (необязательным), например,
Dim x As Integer
Несколько переменных в одной строке указываются через запятую.
Dim x As Integer, y As String
Создание массивов см. в разделе Действия над массивами.
Область видимости переменных
Краткий смысл темы заключается в том, откуда можно обратиться к переменной, чтобы считать значение и/или изменить его: только из программы, любой программы модуля, из любого модуля.
По умолчанию действует следующая схема.
- Переменные, объявляемые на уровне процедуры переменные доступны только внутри соответствующей процедуры.
- Переменные, объявляемые на уровне модуля (в области общих задач), доступны всем процедурам внутри этого модуля, но имеют статус Private.
- Переменные, объявляемые на уровне модуля как глобальные (общие, Public), доступны для всех процедур в проекте.
- Константы являются частными (Private) по умолчанию. Внутри процедур константы всегда являются частными, их видимость изменить нельзя.
В стандартных модулях по умолчанию видимость констант уровня модуля(!) можно изменить с помощью ключевого слова Public.
Основные типы данных
Хотя типов данных (точнее программных переменных, в которых данные хранятся) довольно много, можно выделить и сгруппировать наиболее важные, имеющие общие правила обработки.
В квадратных скобках указан размер в байтах. Кроме указания на место, занимаемое в памяти, для многих типов это определяет
возможный диапазон значений. Так, 2 байта для целых чисел дают 22*8 (65536) значений. Но один бит используется для указания знака,
что ограничивает диапазон значений 215 (до ±32768).
- Логический (булевый, Boolean) [2]. Служит для хранения логической информации: True (истина) или False (ложь).
Для обозначения используются True и False, для функции «Write #» — #TRUE# и #FALSE#. - Символьный (String, text, character, строковый) [длина строки]. Понятно, что львиная доля информации хранится в виде символов.
Может содержать символы с кодами от 0 до 255!
Делится на две разновидности:- Строка фиксированной длины [1–216].
Объявляется командой типа (для 5 символов): Dim а As String * 5 - Строка переменной длины [1–231].
- Строка фиксированной длины [1–216].
- Числовой (Numeric). Один из наиболее разветвленных видов, что связано с множеством условий и возможностей для работы с числовой информацией,
а также её особой важностью для обработки программными средствами.- Целочисленный (integer, byte, long) [1–8]. Может хранить только целые числа.
- Целочисленный (Byte) [1]. Число от 0 до 255. Парадокс, но в этом типе выгоднее хранить логическую информацию, чем в Boolean.
- Целочисленный (Integer) [2]. Число от –32 768 до 32 767.
- Целочисленный (Long) [4]. Число от –2 147 483 648 до 2 147 483 647.
- Целочисленный (LongLong) [8]. Число от –9 223 372 036 854 775 807, до 9 223 372 036 854 775 807.
- С плавающей точкой (Float) в чистом виде в VBA отсутствует и делится на два конкретных подвида.
- Single [4]. Диапазоны:
от –3,402823E38 до –1,401298E-45 для отрицательных значений,
от 1,401298E-45 до 3,402823E38 для положительных значений. - Double [8]. Диапазоны:
от –1,79769313486231E308 до –4,94065645841247E-324 для отрицательных значений
от 4,94065645841247E-324 до 1,79769313486232E308 для положительных значений
- Single [4]. Диапазоны:
- Денежный (Currency) [8]. Точность указания чисел — с обязательными четырьмя десятичными разрядами.
Иногда называют банковским типом, хотя последний должен содержать 8 десятичных разрядов.
Может хранить число от –922 337 203 685 477,5808 до 922 337 203 685 477,5807. - Десятичный (Decimal) [12]. Диапазон хранимых данных зависит от точности (числа десятичных разрядов) и наличия знака.
- Целочисленный (integer, byte, long) [1–8]. Может хранить только целые числа.
- Даты (Date) [8] в виде чисел с плавающей запятой. Диапазон дат: от 1 января 100 до 31 декабря 9999 г. Нулю соответствует 1 января 1900 г.
Десятичная часть соответствует доле суток, то есть времени. - Время (Time) как описанный тип в VBA отсутствует, для него используется десятичная часть от Date.
При этом команда MyTime = #17:04:23# создаст переменную, содержащую время, есть функции для его обработки. Мда… - Для Visual Basic и VBA характерно наличие особого универсального типа переменной (Variant), которая может хранить значения большинства других типов.
- Другое. Collection, Dictionary, Object [4].
См. также сводку типов данных на сайте Microsoft.
Действия над данными
Если для числовых данных и, соответственно, переменных арифметические действия являются само собой разумеющимися, то для других типов обычно возникает некоторое непонимание.
Разрешить его вполне можно с помощью логических рассуждений.
Символьные данные обычно используются в операции сложения (объединения/конкатенации), когда нужно собрать из кусочков выражение.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Логические данные полностью подчиняются законам алгебры логики.
Хотя бояться этого точно не стоит: подобные дебри бесконечно редко возникают в программировании, все остается на уровне максимального примитива.
Три оператора (Or, And, Not) покрывают более 99% случаев и относятся к области одновременной оценки нескольких объектов или разных характеристик одного объекта.
Дата на самом деле хранится как число и может вычитаться из даты (разница в днях), либо к ней можно прибавить целое число (будущая дата), или вычесть целое число (дата в прошлом).
В связи с вышеизложенным, для того чтобы выполнить над данными определенные действия, во многих случаях необходимо произвести изменение (преобразование) их типа.
Действия над массивами
Массивом называется специфический вид переменной, содержащий некое множество структурированных данных (элементов).
Для восприятия удобно рассматривать массивы в виде таблицы. На этом же основана логика обращения к данным.
Соответственно, можно условно выделить три варианта:
- Одномерный массив, то есть состоящий из одной колонки.
- Двумерный массив представляет собой истинную простую таблицу (n колонок на m строк).
- Многомерный массив в VBA может содержать до 60 измерений.
Реально можно представить трехмерный массив, в виде набора простых двумерных таблиц, расположенных друг за другом.
Нумерация элементов массива в VBA по умолчанию начинается с нуля.
Это определяется директивой Option Base.
Вызов команды Option Base 1 сменит нижнюю границу нумерации на 1.
Материал, приведенный ниже рассматривает ситуацию по умолчанию (Option Base 0).
Функция Array позволяет создать одномерный массив путем перечисления его значений:
A_Arr = Array(1, 5, 15)
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Функции
Функции представляют собой подпрограммы, выполняющие некоторую обработку информации и всегда возвращающие результат этой обработки.
Функция — классический пример вспомогательного алгоритма. Именно функции обладают наиболее выраженным свойством массовости, так как многократно используются
при решении большого и разнообразного числа задач.
Вызов функций, как правило, одинаковый:
переменная = ИмяФункции([аргументы через запятую]).
Число аргументов может быть различным, что указывается в описании. Некоторые из них являются необязательными, и их приводят в конце списка для удобства использования.
Порядок указания аргументов задается строго. Менять их местами нельзя! Если значение среднего аргумента опускается, то должна быть поставлена пустая запятая:
MsgBox(«Сообщение», , «Заголовок»).
Но! В описании функции может быть указано, что первый аргумент необязательный, а его значение присваивается по умолчанию (см. InStr()).
Тип каждого аргумента также задается достаточно строго и в большинстве случаев не может быть изменен.
Вместе с тем, многие функции могут не иметь аргументов вообще, так как обрабатывают определенную заранее системную информацию.
Например, функция Date() во многих языках.
Ниже приведены некоторые наиболее важные функции с их разбивкой по принципу типа обрабатываемой информации (в алфавитном порядке).
Как показывает практика, подобное разделение наиболее эффективно.
Символьные (строковые) функции
Функция | Назначение |
Asc(<строка>) | Возвращает ASCII-код (0–255) первого символа строки |
Chr(<число>) | Преобразует ASCII-код (0–255) в символ (строку) |
InStr([начало, ]<строка, в которой ищем>, <искомая строка>) | Находит позицию первого вхождения одной строки внутри другой. InStr(3, «корова», «о») вернет значение 4. То есть, начиная с третьей буквы, «о» стоит на четвертой позиции в слове. (InstrRev работает также, но с конца строки.) |
LCase(<строка>), UCase(<строка>) | Возвращает строку, преобразованную в нижний и верхний регистры соответственно |
Left(<строка>, <число символов>) | Возвращает число первых (слева) символов строки. Если их меньше, чем запрошено, возвращается вся строка |
Len(<строка>) | Возвращает количество символов в строке (длину строки) |
Mid(<строка>, <номер начального символа>[, <число символов>]) | Выделяет фрагмент из строки. Mid(«корова», 2, 3) вернет «оро»: три символа, начиная со второго |
Replace(<строка>, <что>, <на что>) | Возвращает строку, заменив в ней одни фрагменты на другие |
Right(<строка>, <число символов>) | Возвращает указанное число последних (справа/концевых) символов строки |
Space(<число>) | Возвращает строку, состоящую из «числа» пробелов (специализированный String) |
StrReverse(<строка>) | Возвращает строку со знаками в обратном порядке |
String(число, символ) | Возвращает строку, состоящую из «числа» повторяющихся символов |
Trim(<строка>), LTrim(<строка>) и RTrim(<строка>) | Удаляют из строки пробелы слева (LTrim), справа (RTrim), или с обеих сторон (Trim) |
Val(<строка>) | Преобразует строку в число. Правильно обрабатываются только строки с десятичным разделителем точкой! |
Коды (Asc/Chr) некоторых важных символов.
Символ | ASCII-код |
Табулятор | 9 |
Enter | 13 |
Esc | 27 |
Пробел | 32 (первый неслужебный знак) |
! | 33 (первый знак, который выводится на экран и на печать) |
Цифры (0–9) | 48–57 |
Английские буквы (A–Z) | 65–90 |
Английские буквы (a–z) | 97–122 |
Русские буквы (А–Я) | 192–223 |
Русские буквы (а–я) | 224–255 |
Функции даты и времени
Функция | Назначение |
DateAdd(интервал, число, дата) | Прибавляет к дате «число» интервалов (лет, месяцев, недель и т.д.). Интервал задается символьным шаблоном |
DateSerial(год, месяц, день) | Возвращает значение даты. Каждый из числовых аргументов может быть математическим выражением |
TimeSerial(час, минута, секунда) | Возвращает значение времени. Каждый из числовых аргументов может быть математическим выражением |
TimeValue(<строка времени>) | Извлекает значение времени (Time) из его строкового представления в любом варианте, основанном на шаблоне разделения двоеточием («0:00:00») |
Hour(<время>) | Выделяет из строки времени (тип Time) часы (тип Integer) |
Minute(<время>) | Выделяет из строки времени (тип Time) минуты (тип Integer) |
Second(<время>) | Выделяет из строки времени (тип Time) секунды (тип Integer) |
Time | Возвращает системное время компьютера. Тип — Time. В VBA используется без скобок (то есть MyTime = Time) |
Date | Возвращает системную дату компьютера. Тип — Date. В VBA используется без скобок (то есть MyDate = Date) |
Now | Возвращает системную дату и время компьютера. Today = Now |
Timer | Возвращает количество секунд (с дробной частью), прошедших после полуночи |
Weekday(<дата>, [номер первого дня недели]) | Возвращает номер дня недели указанной даты. По умолчанию, первый день недели — воскресенье. Чтобы получить в привычном нам порядке, следует задать второй аргумент — двойку: Weekday(«01.01.2009», 2) |
Числовые и математические функции
Функция | Назначение |
Abs(x) | абсолютное значение (модуль) числа x |
Atn(x) | арктангенс угла x в радианах (от –π/2 до π/2) |
Cos(x) | косинус угла x в радианах |
Exp(x) | константа e (основание натурального логарифма ~2.718282) в степени x |
Log(x) | натуральный логарифм от числа |
Rnd([x]) | генерация случайного числа от 0 до 1. Аргумент x может задавать правила выбора значения |
Round(x, [десятичных знаков]) | округляет числа с заданной точностью |
Sgn(x) | знак числа, равно -1 для отрицательных чисел; 1 — для положительных и 0 для x = 0 |
Sin(x) | синус угла x в радианах |
Sqr(x) | квадратный корень из x |
Str(x) | преобразует число x в строку. Для положительных чисел в начало добавляется пробел |
Tan(x) | тангенс угла x в радианах |
Fix(x) | Отбрасывает дробную часть числа и возвращает целое значение. В отличие от Int(), для отрицательных значений дает ближайшее большее целое (Fix(-3,3) = –3) |
Int(x) | Отбрасывает дробную часть числа и возвращает целое значение. В отличие от Fix(), для отрицательных значений дает ближайшее меньшее целое (Int(-3,3) = –4) |
Производные тригонометрические функции (арксинус…) можно посмотреть здесь.
Чтобы преобразовать градусы в радианы, умножьте градусы на π/180 (π ≈ 3,1415926535897932).
Также имеется множество финансовых функций, не входящих в наш курс обучения.
Функции, задаваемые (или определяемые) пользователем (UDF)
Использование UDF (User Defined Function) позволяет многократно расширить возможности языка программирования и, в гораздо большей степени, уменьшить трудозатраты на разработку.
Серьезная постановка вопроса неизбежно приведет к тому, что начинающий программист не видит необходимости в UDF и не в состоянии правильно определить, что требует выноса в функцию.
К этому следует относиться как к аксиоме. Данный навык формируется постепенно, и лично я не вижу никакого смысла его форсировать, так как насмотрелся на негативные последствия.
Искушенный программист не так уж и часто создает новые функции с нуля, так как за годы работы сформирован основной багаж для решения тех или иных типовых ситуаций.
Скорее происходит доработка личных библиотек.
Вместе с тем, необходимым является понимание как самой идеи, так и технологии ее реализации. Дальнейшее использование неизбежно связано с методом проб и ошибок.
Основания для написания UDF:
- Очевидные. Необходимость одинаковых действий, осуществляемых из разных процедур и, особенно, для разных проектов.
Начинающему программисту это очевидным не кажется, пока не нарастет критическая масса знаний и опыта. - Неочевидные. Необходимость одинаковых действий из одной процедуры. Часто это может быть решено программно (всегда сложнее) и без создания функции.
- Скрытые. Уменьшение кода основной программы, очень сходное с рассуждениями на первых этапах устного описания бытовых алгоритмов:
создается своего рода «черный ящик», обращение к которому и результат такового очевиден, но скрыт.
Более сложным будет видение возможной перспективы выделения функции, когда, с большой вероятностью, ее удастся применить позже.
Может быть с существенной переработкой, но первый шаг простимулирует обдумывание решения.
При определении функции вместо Sub используется Function, а для завершения — End Function.
Область видимости. Данный вопрос не обсуждается в литературе.
Сразу отметим, что ни одна функция не видна в списке макросов, так как ее запуск пользователем не подразумевается.
Вызвать функцию можно только обращением из программы.
При обычном определении, функция доступна из любого модуля проекта.
При определении Private Function, к ней можно обратиться только из текущего модуля.
Наоборот, Public Function доступна из любого модуля любого открытого проекта.
Нормой следует считать ситуацию, когда функции передается какая-то информация, подвергающаяся анализу или обработке.
В первом случае возвращается результат анализа, чаще всего логического типа (True или False). Во втором — обработанные данные.
Чтобы использовать возвращаемое значение функции, следует назначить ее переменной, а аргументы заключить в скобки. То есть так же, как для встроенной функции.
Например, для вызова функции без аргументов с ожиданием возврата целого числа в диапазоне 0–255:
Dim Var As Byte Var = MyFunc()
Значение, которое возвращается функцией, должно быть присвоено в процессе обработки переменной с именем функции.
Function MyFunc() [As Byte] 'Необязательное добавление типа при объявлении позволит проверять тип возвращаемого значения Код функции... MyFunc = 1 'Возвращаемое значение равно единице End Function
Преобразование типов данных
Во всех языках программирования существует большое число функций, предназначенных для преобразования одного типа данных в другой.
Необходимость этого связана с тем, что многие действия можно производить только над данными одного типа. Например, нельзя сложить число 10 и строку из двух цифр: «20»
(в VBA — можно).
Если первое превратить в строку, то результат будет представлять собой четырехсимвольную строку «1020».
Наоборот, преобразовав «20» в число и опять сложив их, получим число 30.
В других ситуациях просто предполагаются разнообразные математические операции над числами, а результат нужно вывести в виде строки, снабженной поясняющими словами.
Например, обработали число 5 и получили число 120. Чтобы собрать строку: «Из числа 5 получен результат 120!», нужно провести преобразование чисел и их сложение с текстом:
«Из числа» + Str(5) + «получен результат» + Str(120) + «!»
Для Word, который мы обсуждаем в первую очередь, это особенно актуально: все фрагменты текста, взятые из документа, представляют собой строку.
Для проверки типа данных (точнее, их анализа) можно воспользоваться одной из функций в формате Функция(<переменная>):
IsArray, IsDate,
IsEmpty, IsError,
IsMissing, IsNull,
IsNumeric, IsObject.
Также можно применить общую функцию TypeName(имя_переменной), возвращающую название типа данных словом из списка:
Byte, Integer, Long, Single, Double, Currency, Decimal, Date, String, Boolean, Error, Empty, Null, Object.
Весьма небесполезна в этом плане также VarType(имя_переменной), возвращающая идентичную информацию, но числом.
Преобразования числа в строку: Str(<число>)
В большинстве языков программирования для положительных чисел мы получим строку, в начале которой стоит пробел, а для отрицательных — дефис.
Для того, чтобы избавиться от этого пробела, можно использовать одну из двух функций Trim(<строка>) или Ltrim(<строка>).
Важно! В качестве десятичного разделителя распознается исключительно точка!
В более сложных случаях, связанных с преобразованием в дату или пользовательский формат, можно использовать и другую функцию:
Format(Expression, [ Format ], [ FirstDayOfWeek ], [ FirstWeekOfYear ])
Ее побочным эффектом будет строка из числа без ведущего пробела. Синтаксис довольно сложный, так что приведем простейший пример:
Format(x, «General Number»)
Следующий вариант выведет число с отделением разрядов (классов) пробелами:
Format(x, «Standard»)
Преобразования строки в число: Val(<строка>)
Следует четко понимать, что любой текст, взятый из документа, изначально будет набором символов, даже если они представляют собой числа.
Для того, чтобы произвести с ним математические операции и, зачастую, корректное сравнение, требуется превратить их в число.
- Функция обработает любую строку и, если она содержит в качестве первого знака цифру, производится преобразование для последующих цифр.
- При этом игнорируются пробелы, а первая(!) точка воспринимается как десятичный разделитель. Вторая точка прервет процесс.
- Анализ продолжается, пока выполняются пп.1 и 2.
- Если значащая цифра в начале не обнаружена, будет возвращен ноль.
Важно! В качестве десятичного разделителя распознается исключительно точка!
Если вам нужно обработать десятичную запятую, воспользуйтесь функцией
Replace(x, «,», «.»)
где x — строковая переменная, содержащая число с десятичной запятой.
Ветвление программ (условные операторы)
Для осуществления ветвления программ используются два основных оператора: If… Else… End If и Case…
Оператор If… Else… End If
По существу, оператор следует переводить как Если… Иначе… Конец Если.
1. Первичным следует считать использование так называемого неполного If. В этом случае не используется часть Else.
If <условие> Then ...[блок команд] End If
Таким образом, блок команд будет выполнен только когда будет истинным условие, заданное на входе оператора.
Пример, в котором переменная памяти x будет уменьшена в 10 раз, только если она превысила значение 10:
If x > 10 Then x = x/10 End If
2. Часто встречается случай, когда нужно обработать данные одним из двух способов в зависимости от условия:
If <условие> Then ...[блок команд 1] Else ...[блок команд 2] End If
Пример, в котором переменная памяти x возводится в квадрат, если она отрицательна, а иначе — в куб (ноль также будет возводиться в куб):
If x < 0 Then x = x^2 Else x = x^3 End If
3. Наконец, ряд языков (как и VBA) позволяет составлять многоуровневую конструкцию без использования вложения If.
If a = 1 Then ...[блок команд 1] ElseIf a = 2 Then ...[блок команд 2] ElseIf b > 0 Then ...[блок команд 3] Else ...[блок команд 4] End If
Функция IIf()
Так как чрезвычайно часто встречается ситуация, когда единственное назначение условного оператора — изменение переменной памяти по условию, все развитые языки содержат функцию IIf().
Она решает названную задачу в гораздо более компактном виде.
Пример, в котором переменной х присуждается нулевое значение, если она отрицательна и единица во всех остальных случаях:
x = IIf(x < 0, 0, 1)
Недостаток функции заключается в том, что она всегда вычисляет оба значения (и для истинного, и для ложного случая), а, значит, работает сравнительно медленнее.
Также, в некоторых случаях подобные вычисления могут приводить к делению на ноль, если программист не предусмотрит этого заранее.
Оператор Case
В начале конструкции производится вычисление какого-либо выражения, значение которого проверяется на соответствие несколько раз:
Select Case <проверяемое выражение> Case значение1 [действия1] [Case значение2 [действия2]] ... [Case Else [действия для любых других случаев]] End Select
Циклы
Организация циклов в программах встречается довольно часто и применяется для двух основных случаев: когда нужно повторить фрагмент программы
определенное количество раз и когда это повторение осуществляется до тех пор, пока выполняется некое условие.
Цикл For…
Классический образец цикла для случаев, когда известно, сколько раз он должен быть повторен, либо это можно вычислить.
Общий синтаксис:
For счетчик = start To end [Step шаг] [программа] [Exit For] [программа] Next [счетчик]
В приводимом далее примере находится произведение четных чисел (шаг = 2) от 2 до введенного пользователем значения y.
Если произведение превысит 1 трлн, то произойдет выход из цикла. Нетрудно убедиться, что i достигнет только 24, а y будет равен 1,961,990,553,600.
Dim i As Byte, x As Double, y As Integer x = 1 y = InputBox() For i = 2 To y Step 2 x = x * i If x > 1000000000000 Then Exit For End If Next i
Программа не содержит никаких проверок и вывода результата, но, если пользователь введет не то, цикл просто не будет выполняться.
Далее — важный для начинающих момент.
Строка «x = x * i» означает, что переменной x будет присвоен результат ее текущего значения, умноженный на четное i.
После этого производится сравнение.
Запись триллиона в явном виде, а не как 10^9 экономит ресурсы, так как иначе производилось бы возведение в степень на каждом повторении цикла.
For Each In…Next
Объектно-ориентированное программирование предполагает наличие объектов, состоящих из «кучи» элементов.
Результатом стал специализированный цикл For без счетчика, но с перебором каждого (Each) элемента, спрятанного внутри какого-то объекта (In).
Общий синтаксис:
For Each элемент In имя_объекта(массива) [программа] [Exit For] [программа] Next [элемент]
Современная модель приложений MS Office во многом не позволяет обратиться к необходимым сведениям другим способом.
Цикл While…Wend
Один из важнейших в программировании циклов, завершение которого определяется выполненностью условия.
Таким образом, число итераций цикла может быть от нуля до бесконечности.
Общий синтаксис:
While <условие> [тело цикла] Wend
Условие является обязательным и может представлять собой символьное или числовое выражение, анализ которого возвращает истинное или ложное значение (то есть логическое).
Если результатом вычисления будет значение Null, то оно расценивается как ложное.
Тело цикла выполняется при истинном значении условия, вплоть до оператора Wend, а затем вновь возвращается на строку While для повторной оценки условия.
Если оно истинно, то происходит повтор тела цикла.
Иначе происходит завершение цикла и исполнение программы продолжается со строки, идущей после Wend.
Цикл While может быть вложенным.
Обратите внимание, что принудительного выхода из цикла нет: только анализ исходного условия!
Для того, чтобы его реализовать, следует воспользоваться циклом Do…Loop.
Эта реализация цикла лучше всего подходит для так называемого «зацикливания» программы, когда он повторяется бесконечно.
Ремарка: прервать ситуацию можно клавишами Esc (если разработчик ее не заблокировал) и Ctrl+C.
Цикл Do (While…|Until…)… Loop
Данный цикл в том или ином виде используется в большинстве языков программирования и исполняется, пока (While) истинно условие или пока условие не будет достигнуто (Until).
Общий синтаксис:
Do {While|Until} <условие> [тело цикла] [Exit Do] [продолжение тела цикла] Loop
или
Do [тело цикла] [Exit Do] [продолжение тела цикла] Loop {While|Until} <условие>
Из синтаксиса следует, что условие можно задать в конце. Тогда цикл будет обязательно исполнен хотя бы один раз.
Во многих языках, чтобы добиться этого, приходится предпринимать дополнительные усилия.
Число команд Exit Do внутри тела не ограничено и обычно реализуется через ветвление с использованием If…Then.
При таком завершении, исполнение программы продолжается со строки, идущей после Loop.
Конструкция With…End With
Не являясь циклом, данная конструкция позволяет существенно сократить исходный код, повысив его читабельность или скорость нахождения в нем нужного элемента.
Она предназначена для случаев, когда объектные выражения с одинаковым началом (нередко довольно длинным) повторяются много раз.
Макрорекордер использует эту конструкцию слишком часто, что приводит к необходимости обратного действия — сборке конструкции в одну строку.
Понятно, что в следующем примере речь идет о поиске — всё, что внутри конструкции — строки которого не нужно выискивать в программе.
Фраза «Selection.Find» записана только один раз. Все строки, которые должны получить её в начало, следует начинать с точки.
With Selection.Find .ClearFormatting .Replacement.ClearFormatting .Text = "?" .Replacement.Text = "!" ... End With
Без With это выглядело бы так:
Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Text = "?" Selection.Find.Replacement.Text = "!" ...
Цвет
Далеко не все возможности работы с цветом однозначны, особенно учитывая отсутствие у многих объектов свойства Color в среде разработки (хотя оно есть).
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Некоторые мысли по оптимизации программного кода
«Идеальное» написание программы всегда было «идолом». Недостижимым даже теоретически.
Первичной проблемой является противоречие между быстродействием и использованием памяти.
Никуда также не девается читабельность кода и прямолинейность рассуждений программиста, почти всегда создающие не совсем правильный результат при первичной реализации.
То есть, всегда найдется, что поправить.
К сожалению, так как не существует решения для многих противоречий, невозможно создание наилучшего программного кода для многих ситуаций.
Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
1. Студент I/II курса ВХК РАН. 2. Бывший студент ВХК РАН. 3. Подготовка к ОГЭ. 4. Подготовка к ЕГЭ.
Работа с закладками (Bookmarks)
Закладки могут оказаться весьма востребованными при разработки программы,
так как обеспечивают однозначное перемещение в определенную точку документа, включая выделение фрагмента текста.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
Перенос текста программ из модулей
Примитивная задача, ведь все умеют копировать!
Попробуйте. Желаю успеха.
Я вижу два примитивных способа, основанные на одинаковом исходном действии.
Рассказ — на занятии. (PS! Чуйка говорит, что многие в 2021 году этого не услышат.)