Szukaj…
Uwagi
Operatory są oceniane w następującej kolejności:
- Operatory matematyczne
- Operatory bitowe
- Operatory konkatenacji
- Operatory porównania
- Operatory logiczne
Operatory z dopasowanym priorytetem są oceniane od lewej do prawej. Domyślną kolejność można zastąpić, używając nawiasów (
i )
do grupowania wyrażeń.
Operatory matematyczne
Wymienione w kolejności pierwszeństwa:
Znak | Nazwa | Opis |
---|---|---|
^ | Potęgowanie | Zwróć wynik podniesienia operandu po lewej stronie do mocy operandu po prawej stronie. Zauważ, że wartość zwracana przez potęgowanie jest zawsze Double , niezależnie od dzielonych typów wartości. Jakikolwiek przymus wyniku na typ zmiennej ma miejsce po przeprowadzeniu obliczeń. |
/ | Dywizja 1 | Zwraca wynik dzielenia operandu po lewej stronie przez operand po prawej stronie. Zauważ, że wartość zwracana przez dzielenie jest zawsze Double , niezależnie od dzielonych typów wartości. Jakikolwiek przymus wyniku na typ zmiennej ma miejsce po przeprowadzeniu obliczeń. |
* | Mnożenie 1 | Zwraca iloczyn 2 operandów. |
\ | Division Integer | Zwraca liczbę całkowitą dzielącą lewy operand przez prawy operand po zaokrągleniu obu stron za pomocą .5 zaokrąglenia w dół. Pozostała część podziału jest ignorowana. Jeśli operand po prawej stronie (dzielnik) ma wartość 0 , wystąpi błąd czasu działania 11: Dzielenie przez zero. Zauważ, że dzieje się tak po wykonaniu zaokrąglania - wyrażenia takie jak 3 \ 0.4 będą również powodować dzielenie przez błąd zerowy. |
Mod | Modulo | Zwraca pozostałą liczbę całkowitą dzielącą operand po lewej stronie przez operand po prawej stronie. Argument po każdej stronie jest zaokrąglany do liczby całkowitej przed podziałem, z .5 zaokrąglaniem w dół. Na przykład zarówno 8.6 Mod 3 i 12 Mod 2.6 dają 0 . Jeśli operand po prawej stronie (dzielnik) ma wartość 0 , wystąpi błąd czasu działania 11: Dzielenie przez zero. Zauważ, że dzieje się tak po wykonaniu zaokrąglenia - wyrażenia takie jak 3 Mod 0.4 również będą skutkowały dzieleniem przez błąd zerowy. |
- | Odejmowanie 2 | Zwraca wynik odejmowania operandu po prawej stronie od operandu po lewej stronie. |
+ | Dodatek 2 | Zwraca sumę 2 operandów. Zauważ, że ten token jest również traktowany jako operator konkatenacji, gdy jest stosowany do String . Zobacz Operatory konkatenacji . |
1 Mnożenie i dzielenie są traktowane jako mające taki sam priorytet.
2 Dodawanie i odejmowanie są traktowane jako mające taki sam priorytet.
Operatory konkatenacji
VBA obsługuje 2 różne operatory konkatenacji, +
i &
i oba wykonują dokładnie tę samą funkcję, gdy są używane z typami String
- prawy String
jest dołączany na końcu lewego String
.
Jeśli operator &
jest używany z typem zmiennej innym niż String
, jest on domyślnie rzutowany na String
przed konkatenacją.
Zauważ, że operator konkatenacji +
jest przeciążeniem operatora +
dodawania. Zachowanie +
zależy od zmiennych typów operandów i pierwszeństwa typów operatorów. Jeśli oba operandy są napisane jako String
lub Variant
z podtypem String
, są one łączone:
Public Sub Example()
Dim left As String
Dim right As String
left = "5"
right = "5"
Debug.Print left + right 'Prints "55"
End Sub
Jeśli jedna ze stron jest typem numerycznym, a druga strona jest String
który można przekształcić w liczbę, pierwszeństwo operatorów matematycznych powoduje, że operator jest traktowany jako operator dodawania, a wartości liczbowe są dodawane:
Public Sub Example()
Dim left As Variant
Dim right As String
left = 5
right = "5"
Debug.Print left + right 'Prints 10
End Sub
Takie zachowanie może prowadzić do subtelnych, trudnych do debugowania błędów - szczególnie, jeśli używane są typy Variant
, dlatego do łączenia należy zazwyczaj używać tylko operatora &
.
Operatory porównania
Znak | Nazwa | Opis |
---|---|---|
= | Równy | Zwraca wartość True jeśli operandy po lewej i prawej stronie są równe. Pamiętaj, że jest to przeciążenie operatora przypisania. |
<> | Nie równy | Zwraca wartość True jeśli operandy po lewej i po prawej stronie nie są równe. |
> | Lepszy niż | Zwraca wartość True jeśli operand po lewej stronie jest większy niż operand po prawej stronie. |
< | Mniej niż | Zwraca wartość True jeśli operand po lewej stronie jest mniejszy niż operand po prawej stronie. |
>= | Większy bądź równy | Zwraca wartość True jeśli operand po lewej stronie jest większy lub równy operandowi po prawej stronie. |
<= | Mniejszy lub równy | Zwraca wartość True jeśli operand po lewej stronie jest mniejszy lub równy operandowi po prawej stronie. |
Is | Kapitał referencyjny | Zwraca wartość True jeśli odwołanie do obiektu po lewej stronie jest tym samym wystąpieniem, co odwołanie do obiektu po prawej stronie. Może być również używany z Nothing (odwołanie do obiektu zerowego) po obu stronach. Uwaga: Operator Is spróbuje zmusić oba operandy do Object przed wykonaniem porównania. Jeśli którakolwiek ze stron jest typem pierwotnym lub Variant , który nie zawiera obiektu (podtypu innego niż obiekt lub vtEmpty ), porównanie spowoduje błąd wykonania 424 - „Wymagany obiekt”. Jeśli jeden z operandów należy do innego interfejsu tego samego obiektu, porównanie zwróci True . Jeśli chcesz przetestować ObjPtr(left) = ObjPtr(right) zarówno instancji, jak i interfejsu, użyj ObjPtr(left) = ObjPtr(right) . |
Notatki
Składnia VBA pozwala na „łańcuchy” operatorów porównania, ale ogólnie takich konstrukcji należy unikać. Porównania są zawsze wykonywane od lewej do prawej tylko na 2 operandach na raz, a każde porównanie daje wynik Boolean
. Na przykład wyrażenie ...
a = 2: b = 1: c = 0
expr = a > b > c
... może być odczytany w niektórych kontekstach jako test, czy b
jest między a
a c
. W VBA ocenia się to następująco:
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
Każdy operator porównania inne niż Is
używany z Object
jako argumentu będą wykonywane w wartości zwracanej z Object
„s domyślnego członka . Jeśli obiekt nie ma domyślnego elementu członkowskiego, porównanie spowoduje błąd w czasie wykonywania 438 - „Obiekt nie obsługuje swojej właściwości lub metody”.
Jeśli Object
zostanie zainicjowany, porównanie spowoduje błąd w czasie wykonywania 91 - „Zmienna obiektu lub zmienna bloku nie jest ustawiona”.
Jeśli dosłowne Nothing
zostanie użyte z żadnym operatorem porównania innym niż Is
, spowoduje to błąd kompilacji - „Niepoprawne użycie obiektu”.
Jeśli domyślnym elementem składowym Object
jest inny Object
, VBA będzie stale wywoływać domyślny element członkowski każdej kolejnej wartości zwracanej, dopóki nie zostanie zwrócony typ pierwotny lub wystąpi błąd. Załóżmy na przykład, że SomeClass
ma domyślny element członkowski Value
, który jest instancją ChildClass
z domyślnym elementem członkowskim ChildValue
. Porównanie...
Set x = New SomeClass
Debug.Print x > 42
... zostanie oceniony jako:
Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42
Jeśli jeden z operandów jest typem numerycznym, a drugi operandem jest String
lub Variant
podtypu String
, zostanie przeprowadzone porównanie numeryczne. W takim przypadku, jeśli String
nie może być rzutowany na liczbę, błąd porównania 13 - „Niezgodność typu” będzie wynikał z porównania.
Jeśli oba operandy są String
lub Variant
podtypu String
, porównanie ciąg zostanie przeprowadzone na podstawie Opcji Porównaj ustawienie modułu kodu. Te porównania są przeprowadzane dla poszczególnych postaci. Należy zauważyć, że reprezentacja charakter String
zawierający numer nie jest taki sam jak porównanie z wartościami liczbowymi:
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
Z tego powodu upewnij się, że zmienne String
lub Variant
są rzutowane na liczby przed wykonaniem na nich porównań nierówności numerycznych.
Jeśli jednym operandem jest Date
, porównanie numeryczne bazowej wartości Podwójnej zostanie wykonane, jeśli drugi operand jest liczbowy lub może być przypisany do typu liczbowego.
Jeśli drugim operandem jest String
lub Variant
podtypu String
który można rzutować na Date
przy użyciu bieżących ustawień narodowych, String
zostanie rzutowany na Date
. Jeśli nie można rzutować na Date
w bieżącym locale, błąd porównania 13 - „Niezgodność typu” będzie wynikał z porównania.
Należy zachować ostrożność przy porównywaniu wartości Double
lub Single
wartościami logicznymi . W przeciwieństwie do innych typów liczbowych nie można przyjąć, że wartości niezerowe są True
ponieważ VBA promuje typ danych porównania obejmujący liczbę zmiennoprzecinkową do 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
Operatory bitowe \ logiczne
Wszystkie operatory logiczne w VBA można traktować jako „zastępujące” operatory bitowe o tej samej nazwie. Technicznie są one zawsze traktowane jako operatory bitowe. Wszystkie operatory porównania w VBA zwracają wartość logiczną , która zawsze nie będzie miała ustawionego żadnego bitu ( False
) ani zestawu wszystkich bitów ( True
). Ale będzie traktować wartość z dowolnym bitem ustawionym na True
. Oznacza to, że wynik rzutowania wyniku bitowego wyrażenia na wartość Boolean
(patrz Operatory porównania) zawsze będzie taki sam, jak traktowanie go jako wyrażenia logicznego.
Przypisanie wyniku wyrażenia za pomocą jednego z tych operatorów da wynik bitowy. Zauważ, że w poniższych tabelach prawdy 0
jest równe False
a 1
jest równe True
.
And
Zwraca wartość True
jeśli wyrażenia po obu stronach mają wartość True
.
Operand po lewej stronie | Operand po prawej stronie | Wynik |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Or
Zwraca True
jeśli którakolwiek ze stron wyrażenia ma wartość True
.
Operand po lewej stronie | Operand po prawej stronie | Wynik |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Not
Zwraca True
jeśli wyrażenie ma wartość False
i False
jeśli wyrażenie ma wartość True
.
Operand po prawej stronie | Wynik |
---|---|
0 | 1 |
1 | 0 |
Not
jest to jedyny operand bez operandu po lewej stronie. Edytor Visual Basic automatycznie uprości wyrażenia za pomocą argumentu po lewej stronie. Jeśli wpiszesz ...
Debug.Print x Not y
... VBE zmieni linię na:
Debug.Print Not x
Podobne uproszczenia zostaną wprowadzone dla każdego wyrażenia zawierającego operand po lewej stronie (w tym wyrażeń) dla Not
.
Xor
Znany również jako „wyłączny lub”. Zwraca wartość True
jeśli oba wyrażenia mają różne wyniki.
Operand po lewej stronie | Operand po prawej stronie | Wynik |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Zauważ, że chociaż operator Xor
może być używany jak operator logiczny, nie ma absolutnie żadnego powodu, aby to robić, ponieważ daje taki sam wynik jak operator porównania <>
.
Eqv
Znany również jako „równoważność”. Zwraca wartość True
gdy oba wyrażenia mają ten sam wynik.
Operand po lewej stronie | Operand po prawej stronie | Wynik |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Zauważ, że funkcja Eqv
jest bardzo rzadko używana, ponieważ x Eqv y
jest równoważne znacznie bardziej czytelnemu Not (x Xor y)
.
Imp
Znany również jako „implikacja”. Zwraca True
jeśli oba operandy są takie same lub drugi operand ma wartość True
.
Operand po lewej stronie | Operand po prawej stronie | Wynik |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
Pamiętaj, że funkcja Imp
jest bardzo rzadko używana. Dobrą zasadą jest to, że jeśli nie potrafisz wyjaśnić, co to znaczy, powinieneś użyć innej konstrukcji.