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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow