Sök…
Anmärkningar
Operatörerna utvärderas i följande ordning:
- Matematiska operatörer
- Bitvisa operatörer
- Samkopplingsoperatörer
- Jämförelseoperatörer
- Logiska operatörer
Operatörer med matchande prioritet utvärderas från vänster till höger. Standardordningen kan åsidosättas genom att använda parenteser (
och )
att gruppera uttryck.
Matematiska operatörer
Listad i prioritetsordning:
Tecken | namn | Beskrivning |
---|---|---|
^ | exponentiering | Återställ resultatet av att höja den vänstra operanden till makten för den högra operanden. Observera att värdet som returneras av exponentiering alltid är en Double , oavsett värdetyper som delas. All tvång av resultatet till en variabel typ sker efter beräkningen. |
/ | Avdelning 1 | Returnerar resultatet av att dela vänsteroperand med högeroperand. Observera att värdet som returneras av divisionen alltid är en Double , oavsett värdetyper som delas. All tvång av resultatet till en variabel typ sker efter beräkningen. |
* | Multiplikation 1 | Returnerar produkten från 2 operander. |
\ | Heltalsuppdelning | Returnerar heltalets resultat genom att dela vänsteroperand med högeroperand efter att ha rundat båda sidor med .5 avrundning. Alla återstående delningar ignoreras. Om den högra operand (divisorn) är 0 kommer ett körtidfel 11: Division med noll uppnås. Observera att detta trots allt utförs av avrundningar - uttryck som 3 \ 0.4 kommer också att leda till en delning med noll-fel. |
Mod | modulo | Returnerar heltalets återstående delning av vänsteroperand med högeroperand. Operanden på varje sida avrundas till ett heltal före uppdelningen, med .5 avrundning. Till exempel resulterar både 8.6 Mod 3 och 12 Mod 2.6 i 0 . Om den högra operand (divisorn) är 0 , kommer ett körtidfel 11: Uppdelning med noll. Observera att detta trots allt utförs av avrundning - uttryck som 3 Mod 0.4 kommer också att leda till en delning med noll-fel. |
- | Subtraktion 2 | Returnerar resultatet av att subtrahera högeroperand från vänsteroperand. |
+ | Tillägg 2 | Returnerar summan av 2 operander. Observera att detta token också behandlas som en sammankopplingsoperatör när den appliceras på en String . Se Operatörer för sammankoppling . |
1 Multiplikation och delning behandlas som att ha samma företräde.
2 Tillsats och subtraktion behandlas som att ha samma företräde.
Samkörningsoperatörer
VBA stöder 2 olika samkopplingsoperatörer, +
och &
och båda utför exakt samma funktion när de används med String
- den högra String
bifogas till slutet av den vänstra String
.
Om &
operatören används med en annan typ än en String
, kastas den implicit till en String
innan den slås samman.
Observera att +
samkopplingsoperatören är en överbelastning av +
tilläggsoperatören. Beteendet hos +
bestäms av operatörernas variabeltyper och operatörernas företräde. Om båda operanderna skrivs som en String
eller en Variant
med en undertyp av String
, är de sammankopplade:
Public Sub Example()
Dim left As String
Dim right As String
left = "5"
right = "5"
Debug.Print left + right 'Prints "55"
End Sub
Om endera sidan är en numerisk typ och den andra sidan är en String
som kan tvingas till ett nummer, får typföreträde för matematiska operatörer att operatören behandlas som tilläggsoperatör och de numeriska värdena läggs till:
Public Sub Example()
Dim left As Variant
Dim right As String
left = 5
right = "5"
Debug.Print left + right 'Prints 10
End Sub
Detta beteende kan leda till subtila, svåra felsökningsfel - speciellt om Variant
används, så endast &
operatören bör vanligtvis användas för sammankoppling.
Jämförelseoperatörer
Tecken | namn | Beskrivning |
---|---|---|
= | Lika med | Returnerar True om de vänstra och högra operanderna är lika. Observera att detta är en överbelastning av uppdragsoperatören. |
<> | Inte lika med | Returnerar True om de vänstra och högra operanderna inte är lika. |
> | Större än | Returnerar True om den vänstra operanden är större än den högra operanden. |
< | Mindre än | Returnerar True om den vänstra operanden är mindre än den högra operand. |
>= | Större än eller lika med | Returnerar True om den om den vänstra operanden är större än eller lika med den högra operanden. |
<= | Mindre än eller lika | Returnerar True om den vänstra operanden är mindre än eller lika med den högra operanden. |
Is | Referenskapital | Returnerar True om den vänstra objektreferensen är samma instans som den högra objektreferensen. Det kan också användas med Nothing (nollobjektreferensen) på vardera sidan. Obs: Operatören Is försöker tvinga båda operanderna till ett Object innan jämförelsen utförs. Om endera sidan är en primitiv typ eller en Variant som inte innehåller ett objekt (antingen en icke- vtEmpty eller vtEmpty ) kommer jämförelsen att resultera i ett körningsfel 424 - "Objekt krävs". Om endera operand tillhör ett annat gränssnitt för samma objekt, kommer jämförelsen att returnera True . Om du behöver testa för kapital för både instansen och gränssnittet använder du i stället ObjPtr(left) = ObjPtr(right) . |
anteckningar
VBA-syntaxen möjliggör "kedjor" av jämförelseoperatörer, men dessa konstruktioner bör i allmänhet undvikas. Jämförelser utförs alltid från vänster till höger på endast 2 operander åt gången, och varje jämförelse resulterar i en Boolean
. Till exempel uttrycket ...
a = 2: b = 1: c = 0
expr = a > b > c
... kan läsas i vissa sammanhang som ett test av huruvida b
är mellan a
och c
. I VBA utvärderar detta enligt följande:
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
Alla jämförelseoperator än Is
används med en Object
som operand kommer att utföras på returvärdet av Object
s standardmedlem . Om objektet inte har en standardmedlem kommer jämförelsen att resultera i ett körningsfel 438 - "Objekt stöder inte hans egendom eller metod".
Om Object
är oinitierat kommer jämförelsen att resultera i ett körtidsfel 91 - "Objektvariabel eller med blockvariabel inte inställd".
Om det bokstavliga Nothing
används med någon annan jämförande operatör än Is
, kommer det att resultera i ett kompileringsfel - "Ogiltig användning av objekt".
Om standardmedlemet i Object
är ett annat Object
kommer VBA kontinuerligt att ringa standardmedlemmen för varje på varandra följande returräge tills en primitiv typ returneras eller ett fel uppstår. SomeClass
till exempel att SomeClass
har en standardmedlem i Value
, som är en instans av ChildClass
med en standardmedlem i ChildValue
. Jämförelsen...
Set x = New SomeClass
Debug.Print x > 42
... kommer att utvärderas som:
Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42
Om någon operand är en numerisk typ och den andra operanden är en String
eller Variant
av subtyp String
kommer en numerisk jämförelse utföras. I detta fall, om String
inte kan kastas till ett nummer, kommer ett körtid-fel 13 - "Typmatchning" att uppstå från jämförelsen.
Om båda operander är String
eller en Variant
av subtyp String
kommer en jämförelse sträng utföras baserat på Option Jämför inställning av koden modulen. Dessa jämförelser utförs på en karaktär för karaktär. Observera att teckenrepresentationen för en String
innehåller ett nummer inte är densamma som en jämförelse av de numeriska värdena:
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
Av den anledningen måste du se till att String
eller Variant
kastas till siffror innan du gör numeriska ojämlikhetsjämförelser på dem.
Om en operand är ett Date
, kommer en numerisk jämförelse av det underliggande dubbelvärdet att utföras om den andra operanden är numerisk eller kan kastas till en numerisk typ.
Om den andra operanden är en String
eller en Variant
av subtyp String
som kan gjutas till ett Date
med den aktuella lokalen, den String
kommer att gjutas till en Date
. Om det inte kan kastas till ett Date
i det aktuella språket, kommer ett körtidfel 13 - "Typmatchning" att uppstå från jämförelsen.
Man bör vara försiktig när man gör jämförelser mellan Double
eller Single
värden och booléer . Till skillnad från andra numeriska typer kan inte värden utan noll antas vara True
grund av VBA: s beteende att främja datatypen för en jämförelse som involverar ett flytande punktnummer till 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
Bitvis \ Logiska operatörer
Alla de logiska operatörerna i VBA kan betraktas som "åsidosättningar" av bitvisa operatörer med samma namn. Tekniskt behandlas de alltid som bitvisa operatörer. Alla jämförelseoperatörer i VBA returnerar en Boolean , som alltid inte kommer att ha några av dess bitar ( False
) eller alla dess bitar ( True
). Men det kommer att behandla ett värde med alla bitar som True
. Detta innebär att resultatet av gjutning av det bitvisa resultatet av ett uttryck till en Boolean
(se Jämförelseoperatörer) alltid kommer att vara detsamma som att behandla det som ett logiskt uttryck.
Att tilldela resultatet av ett uttryck med en av dessa operatörer ger det bitvisa resultatet. Observera att i sanningstabellerna nedan är 0
ekvivalent med False
och 1
motsvarar True
.
And
Returnerar True
om uttryck på båda sidor utvärderar till True
.
Vänsterhand | Höger operand | Resultat |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Or
Returnerar True
om endera sidan av uttrycket utvärderar till True
.
Vänsterhand | Höger operand | Resultat |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Not
Returnerar True
om uttrycket utvärderas till False
och False
om uttrycket utvärderar till True
.
Höger operand | Resultat |
---|---|
0 | 1 |
1 | 0 |
Not
är den enda operanden utan en vänsteroperand. Visual Basic Editor förenklar automatiskt uttryck med ett vänsterargument. Om du skriver ...
Debug.Print x Not y
... VBE kommer att ändra linjen till:
Debug.Print Not x
Liknande förenklingar kommer att göras till alla uttryck som innehåller en vänsterhand (inklusive uttryck) för Not
.
Xor
Även känd som "exklusiv eller". Returnerar True
om båda uttryck utvärderar till olika resultat.
Vänsterhand | Höger operand | Resultat |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Observera att även om Xor
operatören kan användas som en logisk operatör, finns det absolut ingen anledning att göra det eftersom det ger samma resultat som jämförelsesoperatören <>
.
Eqv
Även känd som "ekvivalens". Returnerar True
när båda uttryck utvärderar till samma resultat.
Vänsterhand | Höger operand | Resultat |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Observera att Eqv
funktionen mycket sällan används eftersom x Eqv y
motsvarar det mycket mer läsbara Not (x Xor y)
.
Imp
Även känd som "implikation". Returnerar True
om båda operanderna är desamma eller den andra operanden är True
.
Vänsterhand | Höger operand | Resultat |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
Observera att Imp
funktionen mycket sällan används. En bra tumregel är att om du inte kan förklara vad det betyder, bör du använda en annan konstruktion.