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.