Поиск…


замечания

Операторы оцениваются в следующем порядке:

  • Математические операторы
  • Побитовые операторы
  • Операторы конкатенации
  • Операторы сравнения
  • Логические операторы

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

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

Перечислено в порядке очередности:

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow