Zoeken…


Opmerkingen

Operators worden in deze volgorde geëvalueerd:

  • Wiskundige operatoren
  • Bitwise operatoren
  • Samenvoegingsexploitanten
  • Vergelijkingsoperatoren
  • Logische operatoren

Operators met overeenkomende prioriteit worden van links naar rechts geëvalueerd. De standaardvolgorde kan worden opgeheven door haakjes ( en ) om expressies te groeperen.

Wiskundige operatoren

Op volgorde van prioriteit:

blijk Naam Beschrijving
^ machtsverheffen Keer het resultaat van het verhogen van de linker operand terug naar de macht van de rechter operand. Merk op dat de waarde die wordt geretourneerd door exponentiatie altijd een Double , ongeacht de waardetypen die worden gesplitst. Elke dwang van het resultaat in een variabel type vindt plaats nadat de berekening is uitgevoerd.
/ Divisie 1 Retourneert het resultaat van het delen van de linkeroperand door de rechteroperand. Merk op dat de waarde die wordt geretourneerd door deling altijd een Double waarde is, ongeacht de waardetypen die worden gesplitst. Elke dwang van het resultaat in een variabel type vindt plaats nadat de berekening is uitgevoerd.
* Vermenigvuldiging 1 Retourneert het product van 2 operanden.
\ Integer divisie Retourneert het gehele resultaat van het delen van de linker operand door de rechter operand na het afronden van beide zijden met .5 naar beneden afgerond. De rest van de verdeling wordt genegeerd. Als de rechter operand (de deler) 0 , zal een runtime-fout 11: delen door nul resulteren. Merk op dat dit is nadat alle afronding is uitgevoerd - uitdrukkingen zoals 3 \ 0.4 zullen ook resulteren in een deling door nul-fout.
Mod modulo Retourneert het gehele getal van het delen van de linkeroperand door de rechteroperand. De operand aan elke zijde is afgerond op een geheel getal vóór de deling, met .5 naar beneden afgerond. Zowel 8.6 Mod 3 als 12 Mod 2.6 resulteren bijvoorbeeld in 0 . Als de rechter operand (de deler) 0 , zal een runtime-fout 11: delen door nul resulteren. Merk op dat dit is nadat alle afronding is uitgevoerd - uitdrukkingen zoals 3 Mod 0.4 zullen ook resulteren in een deling door nul-fout.
- Aftrekken 2 Retourneert het resultaat van het aftrekken van de rechter operand van de linker operand.
+ Toevoeging 2 Retourneert de som van 2 operanden. Merk op dat dit token ook wordt behandeld als een aaneenschakelingsoperator wanneer het op een String wordt toegepast. Zie Operatoren voor aaneenschakeling .

1 Vermenigvuldiging en deling worden behandeld met dezelfde prioriteit.

2 Optellen en aftrekken worden behandeld met dezelfde prioriteit.

Samenvoegingsexploitanten

VBA ondersteunt 2 verschillende aaneenschakelingsexploitanten, + en & en voeren beide exact dezelfde functie uit wanneer gebruikt met String typen - de rechter String wordt toegevoegd aan het einde van de linker String .

Als de operator & wordt gebruikt met een ander variabel type dan een String , wordt deze impliciet naar een String gegoten voordat deze wordt samengevoegd.

Merk op dat de operator + aaneenschakeling een overbelasting is van de operator + additie. Het gedrag van + wordt bepaald door de variabele types van de operanden en de prioriteit van operatortypen. Als beide operanden worden getypt als een String of Variant met een subtype String , worden ze samengevoegd:

Public Sub Example()
    Dim left As String
    Dim right As String
    
    left = "5"
    right = "5"
    
    Debug.Print left + right    'Prints "55"
End Sub

Als een van beide zijden een numeriek type is en de andere kant een String die kan worden omgezet in een getal, zorgt de typeprioriteit van wiskundige operatoren ervoor dat de operator wordt behandeld als de opteloperator en worden de numerieke waarden toegevoegd:

Public Sub Example()
    Dim left As Variant
    Dim right As String
    
    left = 5
    right = "5"
    
    Debug.Print left + right    'Prints 10
End Sub

Dit gedrag kan leiden tot subtiele, moeilijk te debuggen fouten - vooral als Variant types worden gebruikt, dus alleen de & operator moet meestal worden gebruikt voor aaneenschakeling.

Vergelijkingsoperatoren

blijk Naam Beschrijving
= Gelijk aan Retourneert True als de linker- en rechteroperanden gelijk zijn. Merk op dat dit een overbelasting is van de toewijzingsoperator.
<> Niet gelijk aan Retourneert True als de operanden voor de linker- en rechterhand niet gelijk zijn.
> Groter dan Retourneert True als de linkeroperand groter is dan de rechteroperand.
< Minder dan Retourneert True als de linkeroperand kleiner is dan de rechteroperand.
>= Groter dan of gelijk aan Retourneert True als de if de linkeroperand groter is dan of gelijk is aan de rechteroperand.
<= Minder dan of gelijk Retourneert True als de if de linkeroperand kleiner is dan of gelijk is aan de rechteroperand.
Is Referentie eigen vermogen Retourneert True als de verwijzing naar het linkerhandobject dezelfde instantie is als de verwijzing naar het rechterobject. Het kan ook worden gebruikt met Nothing (de nul-objectreferentie) aan beide kanten. Opmerking: de operator Is probeert beide operanden in een Object voordat de vergelijking wordt uitgevoerd. Als een van beide zijden een primitief type is of een Variant die geen object bevat (een niet- vtEmpty of vtEmpty ), resulteert de vergelijking in een runtime-fout 424 - "Object vereist". Als een operand tot een andere interface van hetzelfde object behoort, retourneert de vergelijking True . Als u wilt testen op gelijkheid van zowel het exemplaar als de interface, gebruikt u in plaats daarvan ObjPtr(left) = ObjPtr(right) .

Notes

De VBA-syntaxis maakt "ketens" van vergelijkingsoperatoren mogelijk, maar deze constructen moeten in het algemeen worden vermeden. Vergelijkingen worden altijd uitgevoerd van links naar rechts op slechts 2 operanden tegelijk, en elke vergelijking resulteert in een Boolean . Bijvoorbeeld de uitdrukking ...

a = 2: b = 1: c = 0
expr = a > b > c

... kan in sommige contexten worden gelezen als een test of b tussen a en c . In VBA wordt dit als volgt geëvalueerd:

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

Elke andere vergelijkingsoperator dan Is gebruikt met een Object als operand zal worden uitgevoerd op de retourwaarde van het standaardlid van het Object . Als het object geen standaardlid heeft, resulteert de vergelijking in een runtime-fout 438 - "Object ondersteunt zijn eigenschap of methode niet".

Als het Object is geïnitialiseerd, resulteert de vergelijking in een runtime-fout 91 - "Objectvariabele of met blokvariabele niet ingesteld".

Als de letterlijke Nothing wordt gebruikt met een andere vergelijkingsoperator dan Is , resulteert dit in een compileerfout - "Ongeldig gebruik van object".

Als het standaardlid van het Object een ander Object , roept VBA continu het standaardlid van elke volgende retourwaarde aan totdat een primitief type wordt geretourneerd of een fout wordt gegenereerd. Stel bijvoorbeeld dat SomeClass een standaardlid van Value , wat een instantie van ChildClass met een standaardlid van ChildValue . De vergelijking...

Set x = New SomeClass
Debug.Print x > 42

... wordt geëvalueerd als:

Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42

Als een operand een numeriek type is en de andere operand een String of Variant van het subtype String , wordt een numerieke vergelijking uitgevoerd. In dit geval, als de String niet naar een getal kan worden gegoten, resulteert een runtime-fout 13 - "Type mismatch" uit de vergelijking.

Als beide operanden een String of een Variant van een subtype String , wordt een stringvergelijking uitgevoerd op basis van de instelling Option Compare van de codemodule. Deze vergelijkingen worden per teken uitgevoerd. Merk op dat de karakterweergave van een String die een nummer bevat niet hetzelfde is als een vergelijking van de numerieke waarden:

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

Zorg er daarom voor dat String of Variant variabelen naar getallen worden gegoten voordat u numerieke ongelijkheidsvergelijkingen daarop uitvoert.

Als een operand een Date , wordt een numerieke vergelijking op de onderliggende dubbele waarde uitgevoerd als de andere operand numeriek is of naar een numeriek type kan worden gegoten.

Als de andere operand een String of een Variant van het subtype String die naar een Date kan worden gecast met de huidige landinstelling, wordt de String naar een Date gecast. Als het niet naar een Date in de huidige landinstelling kan worden gecast, resulteert een runtime-fout 13 - "Type komt niet overeen" uit de vergelijking.


Voorzichtigheid is geboden bij het maken van vergelijkingen tussen Double of Single waarden en Booleans . In tegenstelling tot andere numerieke, kunnen niet-nul waarden niet worden geacht zich op True te wijten aan het gedrag van het bevorderen van het type gegevens van een vergelijking met een floating point getal naar 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

Bitwise \ Logical Operators

Alle logische operatoren in VBA kunnen worden beschouwd als "overschrijvingen" van de bitsgewijze operatoren met dezelfde naam. Technisch gezien worden ze altijd behandeld als bitsgewijze operatoren. Alle vergelijkingsoperatoren in VBA retourneren een Boolean , die altijd geen van zijn bits heeft ingesteld ( False ) of alle bits heeft ingesteld ( True ). Maar het zal een waarde behandelen met elk bit ingesteld als True . Dit betekent dat het resultaat van het gieten van het bitsgewijze resultaat van een uitdrukking naar een Boolean (zie Vergelijkingsoperators) altijd hetzelfde zal zijn als het behandelen als een logische uitdrukking.

Het toewijzen van het resultaat van een uitdrukking met behulp van een van deze operatoren geeft het bitgewijze resultaat. Merk op dat in de waarheidstabellen hieronder 0 gelijk is aan False en 1 gelijk is aan True .


And

Retourneert True als de uitdrukkingen aan beide zijden worden geëvalueerd als True .

Linker operand Rechterhand Operand Resultaat
0 0 0
0 1 0
1 0 0
1 1 1

Or

Retourneert True als een van beide zijden van de expressie naar True evalueert.

Linker operand Rechterhand Operand Resultaat
0 0 0
0 1 1
1 0 1
1 1 1

Not

Retourneert True als de expressie naar False evalueert en False als de expressie naar True evalueert.

Rechterhand Operand Resultaat
0 1
1 0

Not is de enige operand zonder een linkse operand. De Visual Basic Editor vereenvoudigt uitdrukkingen automatisch met een argument aan de linkerkant. Als u typt ...

Debug.Print x Not y

... de VBE verandert de regel in:

Debug.Print Not x

Soortgelijke vereenvoudigingen zullen worden aangebracht voor elke expressie die een linker operand (inclusief expressies) voor Not .


Xor

Ook bekend als "exclusief of". Retourneert True als beide expressies verschillende resultaten opleveren.

Linker operand Rechterhand Operand Resultaat
0 0 0
0 1 1
1 0 1
1 1 0

Hoewel de Xor operator kan worden gebruikt als een logische operator, is er absoluut geen reden om dit te doen, omdat deze hetzelfde resultaat geeft als de vergelijkingsoperator <> .


Eqv

Ook bekend als "gelijkwaardigheid". Retourneert True wanneer beide expressies hetzelfde resultaat opleveren.

Linker operand Rechterhand Operand Resultaat
0 0 1
0 1 0
1 0 0
1 1 1

Merk op dat de Eqv functie zeer zelden wordt gebruikt, omdat x Eqv y equivalent is aan de veel leesbaardere Not (x Xor y) .


Imp

Ook bekend als "implicatie". Retourneert True als beide operanden hetzelfde zijn of de tweede operand True .

Linker operand Rechterhand Operand Resultaat
0 0 1
0 1 1
1 0 0
1 1 1

Merk op dat de Imp functie zeer zelden wordt gebruikt. Een goede vuistregel is dat als je niet kunt uitleggen wat het betekent, je een ander construct moet gebruiken.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow