Suche…
Bemerkungen
Operatoren werden in der folgenden Reihenfolge bewertet:
- Mathematische Operatoren
- Bitweise Operatoren
- Verkettungsoperatoren
- Vergleichsoperatoren
- Logische Operatoren
Operatoren mit übereinstimmender Priorität werden von links nach rechts ausgewertet. Die Standardreihenfolge kann durch Verwendung von Klammern (
und )
zum Gruppieren von Ausdrücken überschrieben werden.
Mathematische Operatoren
Nach Priorität sortiert:
Zeichen | Name | Beschreibung |
---|---|---|
^ | Potenzierung | Bringen Sie das Ergebnis des Anhebens des linken Operanden auf die Leistung des rechten Operanden zurück. Beachten Sie, dass der von der Exponentiation zurückgegebene Wert immer ein Double , unabhängig von den Wertetypen, die geteilt werden. Eine Erzwingung eines Ergebnisses in einen Variablentyp findet nach der Berechnung statt. |
/ | Abteilung 1 | Gibt das Ergebnis der Division des linken Operanden durch den rechten Operanden zurück. Beachten Sie, dass der von Division zurückgegebene Wert immer ein Double , unabhängig von den Wertetypen, die geteilt werden. Eine Erzwingung eines Ergebnisses in einen Variablentyp findet nach der Berechnung statt. |
* | Multiplikation 1 | Gibt das Produkt von 2 Operanden zurück. |
\ | Integer Division | Gibt das ganzzahlige Ergebnis der Division des linken Operanden durch den rechten Operanden zurück, nachdem beide Seiten mit 0,5 abgerundet wurden. Der Rest der Abteilung wird ignoriert. Wenn der rechte Operand (der Divisor) 0 , führt dies zu einem Laufzeitfehler 11: Division durch Null. Beachten Sie, dass dies der Fall ist, nachdem alle Rundungen ausgeführt wurden. Ausdrücke wie 3 \ 0.4 führen auch zu einem Fehler durch Division durch Null. |
Mod | Modulo | Gibt den ganzzahligen Rest der Division des linken Operanden durch den rechten Operanden zurück. Der Operand auf jeder Seite wird vor der Division auf eine ganze Zahl gerundet, 0,5 wird abgerundet. Beispielsweise führen sowohl 8.6 Mod 3 als auch 12 Mod 2.6 zu 0 . Wenn der rechte Operand (der Divisor) 0 , führt dies zu einem Laufzeitfehler 11: Division durch Null. Beachten Sie, dass dies der Fall ist, nachdem alle Rundungen ausgeführt wurden - Ausdrücke wie 3 Mod 0.4 führen auch zu einer Division durch Null Fehler. |
- | Subtraktion 2 | Gibt das Ergebnis der Subtraktion des rechten Operanden vom linken Operanden zurück. |
+ | Zusatz 2 | Gibt die Summe von 2 Operanden zurück. Beachten Sie, dass dieses Token auch als Verkettungsoperator behandelt wird, wenn es auf einen String angewendet wird. Siehe Verkettungsoperatoren . |
1 Multiplikation und Division werden als gleichrangig behandelt.
2 Addition und Subtraktion werden als gleichrangig behandelt.
Verkettungsoperatoren
VBA unterstützt 2 verschiedene Verknüpfungsoperatoren, +
und &
und beide führen die gleiche Funktion , wenn sie mit verwendet String
- Typen - der rechte String
wird an das Ende des linken beigefügten String
.
Wenn der Operator &
mit einem anderen Variablentyp als String
, wird er implizit in einen String
bevor er verkettet wird.
Beachten Sie, dass der +
Verkettungsoperator eine Überlastung des +
Additionsoperators ist. Das Verhalten von +
wird durch die Variablentypen der Operanden und die Rangfolge der Operatortypen bestimmt. Wenn beide Operanden als String
oder Variant
mit einem Untertyp von String
eingegeben werden, werden sie verkettet:
Public Sub Example()
Dim left As String
Dim right As String
left = "5"
right = "5"
Debug.Print left + right 'Prints "55"
End Sub
Wenn eine Seite ein numerischer Typ ist und die andere Seite eine String
, die in eine Zahl umgewandelt werden kann, führt der Typvorrang von mathematischen Operatoren dazu, dass der Operator als Additionsoperator behandelt wird und die numerischen Werte hinzugefügt werden:
Public Sub Example()
Dim left As Variant
Dim right As String
left = 5
right = "5"
Debug.Print left + right 'Prints 10
End Sub
Dieses Verhalten kann zu subtilen, schwer zu debuggenden Fehlern führen - insbesondere wenn Variant
Typen verwendet werden. Daher sollte normalerweise nur der Operator &
für die Verkettung verwendet werden.
Vergleichsoperatoren
Zeichen | Name | Beschreibung |
---|---|---|
= | Gleich | Gibt " True wenn die Operanden links und rechts gleich sind. Beachten Sie, dass dies eine Überlastung des Zuweisungsoperators ist. |
<> | Nicht gleichzusetzen mit | Gibt " True wenn die Operanden links und rechts nicht gleich sind. |
> | Größer als | Gibt True wenn der linke Operand größer ist als der rechte. |
< | Weniger als | Gibt True wenn der linke Operand kleiner als der rechte Operand ist. |
>= | Größer als oder gleich | Gibt True wenn der linke Operand größer oder gleich dem rechten Operanden ist. |
<= | Weniger als oder gleich | Gibt " True wenn der linke Operand kleiner oder gleich dem rechten Operanden ist. |
Is | Referenz-Eigenkapital | Gibt " True wenn die linke Objektreferenz dieselbe Instanz wie die rechte Objektreferenz ist. Sie kann auch mit Nothing (der Nullobjektreferenz) auf beiden Seiten verwendet werden. Hinweis: Der Is Operator versucht, beide Operanden in ein Object zu zwingen, bevor der Vergleich ausgeführt wird. Wenn eine Seite ein primitiver Typ oder eine Variant , die kein Objekt enthält (entweder ein Nicht-Objekt-Subtyp oder vtEmpty ), führt der Vergleich zu einem Laufzeitfehler 424 - "Objekt erforderlich". Wenn einer der Operanden zu einer anderen Schnittstelle desselben Objekts gehört, wird der Vergleich True . Wenn Sie sowohl für die Instanz als auch für die Schnittstelle auf Gerechtigkeit prüfen müssen, verwenden ObjPtr(left) = ObjPtr(right) stattdessen ObjPtr(left) = ObjPtr(right) . |
Anmerkungen
Die VBA-Syntax erlaubt "Ketten" von Vergleichsoperatoren, diese Konstrukte sollten jedoch generell vermieden werden. Vergleiche werden immer von links nach rechts an jeweils nur 2 Operanden durchgeführt, und jeder Vergleich führt zu einem Boolean
. Zum Beispiel der Ausdruck ...
a = 2: b = 1: c = 0
expr = a > b > c
... kann in einigen Zusammenhängen gelesen werden, um zu prüfen, ob b
zwischen a
und c
. In VBA wird dies wie folgt bewertet:
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
Jeder Vergleichsoperator andere als Is
mit einem verwendeten Object
als Operand wird auf dem Rückgabewert des durchgeführt wird Object
‚s Standardelement . Wenn das Objekt über kein Standardelement verfügt, führt der Vergleich zu einem Laufzeitfehler. 438 - "Objekt unterstützt nicht seine Eigenschaft oder Methode".
Wenn das Object
initialisiert ist, führt der Vergleich zu einem Laufzeitfehler 91 - "Objektvariable oder Mit nicht gesetzte Blockvariable".
Wenn das Literal Nothing
mit einem anderen Vergleichsoperator als " Is
, führt dies zu einem Kompilierungsfehler - "Ungültige Verwendung des Objekts".
Wenn das Standardmitglied des Object
ein anderes Object
, ruft VBA das Standardmitglied jedes nachfolgenden Rückgabewerts kontinuierlich auf, bis ein primitiver Typ zurückgegeben wird oder ein Fehler ausgegeben wird. SomeClass
, SomeClass
hat ein Standardmitglied von Value
, bei dem es sich um eine Instanz von ChildClass
mit einem Standardmitglied von ChildValue
. Der Vergleich...
Set x = New SomeClass
Debug.Print x > 42
... wird bewertet als:
Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42
Wenn einer der Operanden ein numerischer Typ ist und der andere Operand ein String
oder eine Variant
des Untertyps String
, wird ein numerischer Vergleich durchgeführt. Wenn der String
nicht in eine Zahl umgewandelt werden kann, führt dies zu einem Laufzeitfehler 13 - "Typenkonflikt".
Wenn beide Operanden ein String
oder eine Variant
des Subtyps String
, wird ein Stringvergleich basierend auf der Option Compare- Einstellung des Codemoduls durchgeführt. Diese Vergleiche werden zeichenweise durchgeführt. Beachten Sie, dass die Zeichendarstellung eines String
mit einer Zahl als Vergleich der numerischen Werte nicht gleich ist:
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
Stellen Sie daher sicher, dass String
oder Variant
Variablen in Zahlen umgewandelt werden, bevor Sie Vergleiche mit numerischen Ungleichungen durchführen.
Wenn ein Operand ein Date
, wird ein numerischer Vergleich des zugrunde liegenden Double- Werts durchgeführt, wenn der andere Operand numerisch ist oder in einen numerischen Typ umgewandelt werden kann.
Wenn der andere Operand ein String
oder eine Variant
des Subtyps String
, der mit dem aktuellen Gebietsschema in ein Date
werden kann, wird der String
in ein Date
. Wenn es im aktuellen Gebietsschema nicht in ein Date
, führt dies zu einem Laufzeitfehler 13 - "Typenkonflikt".
Beim Vergleich zwischen Double
oder Single
und Booleschen Werten ist Vorsicht geboten . Im Gegensatz zu anderen numerischen Typen, Nicht-Null - Werte können nicht angenommen werden True
aufgrund VBA das Verhalten von den Datentyp eines Vergleichs der Förderung einer Gleitkommazahl zu denen 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
Bitweise \ logische Operatoren
Alle logischen Operatoren in VBA können als "Überschreibungen" der bitweisen Operatoren desselben Namens betrachtet werden. Technisch werden sie immer als bitweise Operatoren behandelt. Alle Vergleichsoperatoren in VBA geben einen Booleschen Wert zurück, bei dem immer keines der Bits ( False
) oder alle Bits ( True
) gesetzt sind. Ein Wert wird jedoch mit einem als True
festgelegten Bit behandelt. Dies bedeutet, dass das Ergebnis der Umwandlung des bitweisen Ergebnisses eines Ausdrucks in einen Boolean
(siehe Vergleichsoperatoren) immer das gleiche ist, als würde er als logischer Ausdruck behandelt.
Wenn Sie das Ergebnis eines Ausdrucks mit einem dieser Operatoren zuweisen, erhalten Sie das bitweise Ergebnis. Beachten Sie, dass in den folgenden Wahrheitstabellen 0
gleich False
und 1
gleich True
.
And
Gibt True
wenn die Ausdrücke auf beiden Seiten als True
ausgewertet werden.
Linkshändiger Operand | Rechtshänder-Operand | Ergebnis |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Or
Gibt True
wenn eine Seite des Ausdrucks als True
ausgewertet wird.
Linkshändiger Operand | Rechtshänder-Operand | Ergebnis |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Not
Gibt " True
wenn der Ausdruck " False
und " False
ausgewertet wird, wenn der Ausdruck " True
.
Rechtshänder-Operand | Ergebnis |
---|---|
0 | 1 |
1 | 0 |
Not
ist der einzige Operand ohne einen linken Operanden. Der Visual Basic-Editor vereinfacht Ausdrücke automatisch mit einem Argument für die linke Hand. Wenn du schreibst ...
Debug.Print x Not y
... die VBE ändert die Zeile in:
Debug.Print Not x
Ähnliche Vereinfachungen gelten für alle Ausdrücke, die einen linken Operanden (einschließlich Ausdrücken) für Not
.
Xor
Auch als "exklusiv oder" bezeichnet. Gibt " True
wenn beide Ausdrücke unterschiedliche Ergebnisse ergeben.
Linkshändiger Operand | Rechtshänder-Operand | Ergebnis |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Beachten Sie, dass , obwohl der Xor
Bediener kann wie ein logischer Operator verwendet wird, gibt es absolut so zu tun , keinen Grund ist , wie es das gleiche Ergebnis wie der Vergleichsoperator gibt <>
.
Eqv
Auch als "Äquivalenz" bezeichnet. Gibt " True
wenn beide Ausdrücke dasselbe Ergebnis ergeben.
Linkshändiger Operand | Rechtshänder-Operand | Ergebnis |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Beachten Sie, dass die Eqv
Funktion sehr selten verwendet wird, da x Eqv y
dem viel besser lesbaren Not (x Xor y)
.
Imp
Auch als "Implikation" bezeichnet. Gibt True
wenn beide Operanden gleich sind oder der zweite Operand True
.
Linkshändiger Operand | Rechtshänder-Operand | Ergebnis |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
Beachten Sie, dass die Imp
Funktion sehr selten verwendet wird. Eine gute Faustregel lautet: Wenn Sie nicht erklären können, was es bedeutet, sollten Sie ein anderes Konstrukt verwenden.