Поиск…
замечания
Операторы оцениваются в следующем порядке:
- Математические операторы
- Побитовые операторы
- Операторы конкатенации
- Операторы сравнения
- Логические операторы
Операторы с совпадающим приоритетом оцениваются слева направо. Порядок по умолчанию можно переопределить, используя круглые скобки (
и )
для группировки выражений.
Математические операторы
Перечислено в порядке очередности:
знак | название | Описание |
---|---|---|
^ | Возведение | Верните результат подъема левого операнда в силу правого операнда. Обратите внимание, что значение, возвращаемое экспоненциацией, всегда равно 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
очень редко используется. Хорошим правилом является то, что если вы не можете объяснить, что это значит, вы должны использовать другую конструкцию.