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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow