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