Ricerca…


Osservazioni

Gli operatori sono valutati nel seguente ordine:

  • Operatori matematici
  • Operatori bit a bit
  • Operatori di concatenazione
  • Operatori di confronto
  • Operatori logici

Gli operatori con precedenza corrispondente vengono valutati da sinistra a destra. L'ordine predefinito può essere sovrascritto usando parentesi ( e ) per raggruppare le espressioni.

Operatori matematici

Elencati in ordine di precedenza:

Gettone Nome Descrizione
^ elevamento a potenza Restituisce il risultato dell'innalzamento dell'operando di sinistra alla potenza dell'operando di destra. Si noti che il valore restituito da esponenziazione è sempre un Double , indipendentemente dal tipo di valore che viene diviso. Qualsiasi coercizione del risultato in un tipo di variabile avviene dopo che il calcolo è stato eseguito.
/ Divisione 1 Restituisce il risultato della divisione dell'operando di sinistra per l'operando di destra. Si noti che il valore restituito dalla divisione è sempre un Double , indipendentemente dal tipo di valore che viene diviso. Qualsiasi coercizione del risultato in un tipo di variabile avviene dopo che il calcolo è stato eseguito.
* Moltiplicazione 1 Restituisce il prodotto di 2 operandi.
\ Divisione intera Restituisce il risultato intero della divisione dell'operando di sinistra per l'operando di destra dopo aver arrotondato entrambi i lati con un arrotondamento di 0,5. Qualsiasi resto della divisione viene ignorato. Se l'operando di destra (il divisore) è 0 , verrà generato un errore di runtime 11: Divisione per zero. Notare che questo è dopo che viene eseguito l'arrotondamento - espressioni come 3 \ 0.4 genereranno anche un errore di divisione per zero.
Mod Modulo Restituisce il resto dell'intero di divisione dell'operando di sinistra per l'operando di destra. L'operando su ciascun lato è arrotondato a un intero prima della divisione, con 0,5 arrotondamento all'indietro. Ad esempio, entrambi 8.6 Mod 3 e 12 Mod 2.6 risultano in 0 . Se l'operando di destra (il divisore) è 0 , verrà generato un errore di runtime 11: Divisione per zero. Notare che questo è dopo che viene eseguito l'arrotondamento - espressioni come 3 Mod 0.4 causeranno anche un errore di divisione per zero.
- Sottrazione 2 Restituisce il risultato della sottrazione dell'operando di destra dall'operando di sinistra.
+ Aggiunta 2 Restituisce la somma di 2 operandi. Si noti che questo token viene anche considerato come operatore di concatenazione quando viene applicato a una String . Vedi Operatori di concatenazione .

1 La moltiplicazione e la divisione sono considerate come aventi la stessa precedenza.

2 Addizione e sottrazione vengono considerate come aventi la stessa precedenza.

Operatori di concatenazione

VBA supporta 2 diversi operatori di concatenazione, + e & ed entrambi eseguono la stessa identica funzione quando vengono usati con i tipi di String - la String destra viene aggiunta alla fine della String sinistra.

Se l'operatore & viene utilizzato con un tipo di variabile diverso da String , viene implicitamente convertito in una String prima di essere concatenato.

Si noti che l'operatore di concatenazione + è un sovraccarico dell'operatore + addizione. Il comportamento di + è determinato dai tipi di variabili degli operandi e dalla precedenza dei tipi di operatore. Se entrambi gli operandi vengono digitati come String o Variant con un sottotipo di String , vengono concatenati:

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

Se entrambi i lati sono di tipo numerico e l'altro lato è una String che può essere forzata in un numero, la precedenza dei tipi degli operatori matematici fa sì che l'operatore venga trattato come operatore di addizione e vengono aggiunti i valori numerici:

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

Questo comportamento può portare a errori delicati, difficili da debug, soprattutto se vengono utilizzati tipi Variant , quindi in genere viene utilizzato solo l'operatore & per la concatenazione.

Operatori di confronto

Gettone Nome Descrizione
= Uguale a Restituisce True se gli operandi di sinistra e di destra sono uguali. Si noti che questo è un sovraccarico dell'operatore di assegnazione.
<> Non uguale a Restituisce True se gli operandi di sinistra e di destra non sono uguali.
> Più grande di Restituisce True se l'operando di sinistra è maggiore dell'operando di destra.
< Meno di Restituisce True se l'operando di sinistra è inferiore all'operando di destra.
>= Maggiore o uguale Restituisce True se il se l'operando di sinistra è maggiore o uguale all'operando di destra.
<= Meno o uguale Restituisce True se l'operando di sinistra è minore o uguale all'operando di destra.
Is Equità di riferimento Restituisce True se il riferimento all'oggetto a sinistra è la stessa istanza del riferimento all'oggetto a destra. Può anche essere utilizzato con Nothing (il riferimento a oggetti null) su entrambi i lati. Nota: l'operatore Is tenterà di forzare entrambi gli operandi in un Object prima di eseguire il confronto. Se un lato è un tipo primitivo o un Variant che non contiene un oggetto (un sottotipo non dell'oggetto o vtEmpty ), il confronto genererà un errore di runtime 424 - "Oggetto richiesto". Se l'operando appartiene ad una diversa interfaccia dello stesso oggetto, il confronto restituisce True . Se è necessario verificare l'equità dell'istanza e dell'interfaccia, utilizzare invece ObjPtr(left) = ObjPtr(right) .

Gli appunti

La sintassi VBA consente "catene" di operatori di confronto, ma questi costrutti dovrebbero essere generalmente evitati. I confronti vengono sempre eseguiti da sinistra a destra su solo 2 operandi per volta e ogni confronto risulta in un Boolean . Ad esempio, l'espressione ...

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

... può essere letto in alcuni contesti come un test di se b è tra a e c . In VBA, questo valuta come segue:

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

Qualsiasi operatore di confronto diverso da Is utilizzato con un Object come un operando verrà eseguito sul valore restituito del membro predefinito Object . Se l'oggetto non ha un membro predefinito, il confronto genererà un errore di run-time 438 - "L'oggetto non supporta la sua proprietà o il metodo".

Se l' Object è stato inizializzato, il confronto genererà un errore 91 di runtime: "Variabile oggetto o variabile di blocco Con non impostata".

Se il valore letterale Nothing viene utilizzato con qualsiasi operatore di confronto diverso da Is , verrà generato un errore Compile - "Uso non valido dell'oggetto".

Se il membro predefinito Object è un altro Object , VBA chiamerà continuamente il membro predefinito di ciascun valore di ritorno successivo fino a quando viene restituito un tipo primitivo o viene generato un errore. Ad esempio, supponiamo che SomeClass abbia un membro predefinito di Value , che è un'istanza di ChildClass con un membro predefinito di ChildValue . Il confronto...

Set x = New SomeClass
Debug.Print x > 42

... sarà valutato come:

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

Se uno degli operandi è un tipo numerico e l' altro operando è String o Variant del sottotipo String , verrà eseguito un confronto numerico. In questo caso, se la String non può essere trasmessa a un numero, un errore di runtime 13 - "Tipo non corrispondente" sarà il risultato del confronto.

Se entrambi gli operandi sono una String o una Variant del sottotipo String , verrà eseguito un confronto tra le stringhe in base all'impostazione Confronta opzioni del modulo codice. Questi confronti sono eseguiti su base carattere per carattere. Si noti che la rappresentazione del carattere di una String contenente un numero non è uguale a un confronto dei valori numerici:

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

Per questo motivo, assicurati che le variabili String o Variant vengano convertite in numeri prima di eseguire confronti di ingiustizie numeriche su di esse.

Se un operando è una Date , verrà eseguito un confronto numerico sul valore doppio sottostante se l'altro operando è numerico o può essere convertito in un tipo numerico.

Se l'altro operando è una String o una Variant del sottotipo String che può essere trasmessa a una Date utilizzando le impostazioni internazionali correnti, la String verrà convertita in una Date . Se non è possibile eseguire il cast su una Date nelle impostazioni internazionali correnti, verrà generato un errore di run-time 13 - "Tipo non corrispondente".


È necessario prestare attenzione quando si effettuano confronti tra valori Double o Single e Booleans . A differenza di altri tipi numerici, valori diversi da zero non possono essere considerate True causa del comportamento di VBA di promuovere il tipo di dati di un confronto che coinvolge un numero decimale a 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

Operatori logici a bit

Tutti gli operatori logici in VBA possono essere pensati come "override" degli operatori bit a bit con lo stesso nome. Tecnicamente, vengono sempre considerati come operatori bit a bit. Tutti gli operatori di confronto in VBA restituiscono un booleano , che non avrà mai nessuno dei suoi bit impostati ( False ) o tutti i suoi bit impostati ( True ). Ma tratterà un valore con qualsiasi bit impostato come True . Ciò significa che il risultato del casting del risultato bitwise di un'espressione in un Boolean (vedere Operatori di confronto) sarà sempre lo stesso del trattarlo come un'espressione logica.

Assegnare il risultato di un'espressione usando uno di questi operatori darà il risultato bit a bit. Notare che nelle tabelle di verità di seguito, 0 equivale a False e 1 equivale a True .


And

Restituisce True se le espressioni su entrambi i lati valutano True .

Operando di sinistra Operando a destra Risultato
0 0 0
0 1 0
1 0 0
1 1 1

Or

Restituisce True se entrambi i lati dell'espressione valutano True .

Operando di sinistra Operando a destra Risultato
0 0 0
0 1 1
1 0 1
1 1 1

Not

Restituisce True se l'espressione restituisce False e False se l'espressione è valutata su True .

Operando a destra Risultato
0 1
1 0

Not è l'unico operando senza un operando di sinistra. Il Visual Basic Editor semplificherà automaticamente le espressioni con un argomento a sinistra. Se digiti ...

Debug.Print x Not y

... il VBE cambierà la linea in:

Debug.Print Not x

Semplificazioni simili verranno apportate a qualsiasi espressione che contiene un operando di sinistra (incluse le espressioni) per Not .


Xor

Conosciuto anche come "esclusivo o". Restituisce True se entrambe le espressioni valutano risultati diversi.

Operando di sinistra Operando a destra Risultato
0 0 0
0 1 1
1 0 1
1 1 0

Si noti che sebbene l'operatore Xor possa essere utilizzato come un operatore logico, non vi è assolutamente alcun motivo per farlo in quanto fornisce lo stesso risultato dell'operatore di confronto <> .


Eqv

Conosciuto anche come "equivalenza". Restituisce True quando entrambe le espressioni valutano lo stesso risultato.

Operando di sinistra Operando a destra Risultato
0 0 1
0 1 0
1 0 0
1 1 1

Notare che la funzione Eqv è usata molto raramente poiché x Eqv y è equivalente al Not (x Xor y) molto più leggibile Not (x Xor y) .


Imp

Conosciuto anche come "implicazione". Restituisce True se entrambi gli operandi sono uguali o il secondo operando è True .

Operando di sinistra Operando a destra Risultato
0 0 1
0 1 1
1 0 0
1 1 1

Si noti che la funzione Imp è utilizzata molto raramente. Una buona regola è che se non riesci a spiegare cosa significa, dovresti usare un altro costrutto.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow