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.