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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow