Recherche…
Remarques
Les opérateurs sont évalués dans l'ordre suivant:
- Opérateurs mathématiques
- Opérateurs binaires
- Opérateurs de concaténation
- Opérateurs de comparaison
- Opérateurs logiques
Les opérateurs avec une priorité correspondante sont évalués de gauche à droite. L'ordre par défaut peut être remplacé en utilisant des parenthèses (
et )
pour grouper des expressions.
Opérateurs Mathématiques
En ordre de priorité:
Jeton | prénom | La description |
---|---|---|
^ | Exponentiation | Renvoie le résultat de l'élévation de l'opérande gauche à la puissance de l'opérande droit. Notez que la valeur renvoyée par exponentiation est toujours un Double , quels que soient les types de valeur divisés. Toute coercition du résultat dans un type de variable a lieu après le calcul. |
/ | Division 1 | Renvoie le résultat de la division de l'opérande de gauche par l'opérande de droite. Notez que la valeur renvoyée par division est toujours un Double , indépendamment des types de valeur divisés. Toute contrainte du résultat dans un type de variable a lieu après le calcul. |
* | Multiplication 1 | Renvoie le produit de 2 opérandes. |
\ | Division entière | Retourne le résultat entier de la division de l'opérande de gauche par l'opérande de droite après avoir arrondi les deux côtés avec un arrondi de 0,5 inférieur. Tout reste de la division est ignoré. Si l'opérande droit (le diviseur) est 0 , il en résultera une erreur d'exécution 11: division par zéro. Notez que c'est après que tout l'arrondi soit effectué - des expressions telles que 3 \ 0.4 entraîneront également une division par erreur zéro. |
Mod | Modulo | Retourne le nombre entier restant de la division de l'opérande de gauche par l'opérande de droite. L'opérande de chaque côté est arrondi à un entier avant la division, avec 0,5 arrondi à la valeur inférieure. Par exemple, 8.6 Mod 3 et 12 Mod 2.6 donnent 0 . Si l'opérande droit (le diviseur) est 0 , il en résultera une erreur d'exécution 11: division par zéro. Notez que c'est après que tout l'arrondi soit effectué - des expressions telles que 3 Mod 0.4 entraîneront également une division par erreur zéro. |
- | Soustraction 2 | Renvoie le résultat de la soustraction de l'opérande de droite de l'opérande de gauche. |
+ | Ajout 2 | Renvoie la somme de 2 opérandes. Notez que ce jeton est également traité comme un opérateur de concaténation lorsqu'il est appliqué à une String . Voir Opérateurs de concaténation . |
1 La multiplication et la division sont traitées comme ayant la même priorité.
2 L' addition et la soustraction sont traitées comme ayant la même priorité.
Opérateurs de concaténation
VBA prend en charge 2 opérateurs de concaténation différents, +
et &
et tous deux exécutent exactement la même fonction lorsqu'ils sont utilisés avec les types String
- la String
droite est ajoutée à la fin de la String
gauche.
Si l'opérateur &
est utilisé avec un type de variable autre qu'une String
, il est implicitement converti en une String
avant d'être concaténé.
Notez que l'opérateur de concaténation +
est une surcharge de l'opérateur +
addition. Le comportement de +
est déterminé par les types de variables des opérandes et la priorité des types d'opérateurs. Si les deux opérandes sont typés en tant que String
ou Variant
avec un sous-type de String
, ils sont concaténés:
Public Sub Example()
Dim left As String
Dim right As String
left = "5"
right = "5"
Debug.Print left + right 'Prints "55"
End Sub
Si l' un des côtés est un type numérique et que l'autre côté est une String
pouvant être contenue dans un nombre, la priorité de type des opérateurs mathématiques entraîne le traitement de l'opérateur comme opérateur d'addition et les valeurs numériques sont ajoutées:
Public Sub Example()
Dim left As Variant
Dim right As String
left = 5
right = "5"
Debug.Print left + right 'Prints 10
End Sub
Ce comportement peut conduire à des erreurs subtiles et difficiles à déboguer, en particulier si des types Variant
sont utilisés, de sorte que seul l'opérateur &
devrait être utilisé pour la concaténation.
Opérateurs de comparaison
Jeton | prénom | La description |
---|---|---|
= | Égal à | Renvoie True si les opérandes gauche et droit sont égaux. Notez qu'il s'agit d'une surcharge de l'opérateur d'affectation. |
<> | Pas égal à | Renvoie True si les opérandes gauche et droite ne sont pas égaux. |
> | Plus grand que | Renvoie True si l'opérande de gauche est supérieur à l'opérande de droite. |
< | Moins que | Renvoie True si l'opérande de gauche est inférieur à l'opérande de droite. |
>= | Meilleur que ou égal | Renvoie True si the si l'opérande de gauche est supérieur ou égal à l'opérande de droite. |
<= | Inférieur ou égal | Renvoie True si the si l'opérande de gauche est inférieur ou égal à l'opérande de droite. |
Is | Équité de référence | Renvoie True si la référence d'objet de gauche est la même instance que la référence d'objet de droite. Il peut également être utilisé avec Nothing (la référence d'objet null) de chaque côté. Remarque: L'opérateur Is tentera de contraindre les deux opérandes dans un Object avant d'effectuer la comparaison. Si l'un des côtés est un type primitif ou un Variant ne contenant pas d'objet (sous-type non-objet ou vtEmpty ), la comparaison entraînera une erreur d'exécution 424 - "Objet requis". Si l'un des opérandes appartient à une interface différente du même objet, la comparaison renverra True . Si vous devez tester l'équité de l'instance et de l'interface, utilisez ObjPtr(left) = ObjPtr(right) . |
Remarques
La syntaxe VBA autorise les "chaînes" d'opérateurs de comparaison, mais ces constructions doivent généralement être évitées. Les comparaisons sont toujours effectuées de gauche à droite sur seulement 2 opérandes à la fois, et chaque comparaison donne un Boolean
. Par exemple, l'expression ...
a = 2: b = 1: c = 0
expr = a > b > c
... peut être lu dans certains contextes comme un test pour savoir si b
est compris entre a
et c
. Dans VBA, cela se présente comme suit:
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
Tout opérateur de comparaison autre que Is
utilisé avec un Object
en tant qu'opérande sera exécuté sur la valeur de retour du membre par défaut de l' Object
. Si l'objet n'a pas de membre par défaut, la comparaison entraînera une erreur d'exécution 438 - "L'objet ne prend pas en charge sa propriété ou sa méthode".
Si l' Object
n'est pas initialisé, la comparaison entraînera une erreur d'exécution 91 - "Variable d'objet ou Variable de bloc non définie".
Si le littéral Nothing
est utilisé avec un opérateur de comparaison autre que Is
, cela entraînera une erreur de compilation - "Utilisation non valide de l'objet".
Si le membre par défaut de l' Object
est un autre Object
, VBA appellera continuellement le membre par défaut de chaque valeur de retour successive jusqu'à ce qu'un type primitif soit renvoyé ou qu'une erreur soit générée. Par exemple, supposons que SomeClass
a un membre par défaut de Value
, qui est une instance de ChildClass
avec un membre par défaut de ChildValue
. La comparaison...
Set x = New SomeClass
Debug.Print x > 42
... sera évalué comme:
Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42
Si un opérande est un type numérique et que l' autre opérande est une String
ou un Variant
de String
de sous-type, une comparaison numérique sera effectuée. Dans ce cas, si la String
ne peut pas être convertie en un nombre, une erreur d'exécution 13 - "Incompatibilité de type" résultera de la comparaison.
Si les deux opérandes sont une String
ou une Variant
de String
de sous-type, une comparaison de chaîne sera effectuée en fonction du paramètre Option Compare du module de code. Ces comparaisons sont effectuées caractère par caractère. Notez que la représentation des caractères d'une String
contenant un nombre n'est pas la même que la comparaison des valeurs numériques:
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
Pour cette raison, assurez-vous que les variables String
ou Variant
sont converties en nombres avant d'effectuer des comparaisons numériques sur les inégalités.
Si un opérande est une Date
, une comparaison numérique sur la valeur double sous-jacente sera effectuée si l'autre opérande est numérique ou peut être convertie en un type numérique.
Si l'autre opérande est une String
ou une Variant
de String
de sous-type pouvant être convertie en Date
utilisant les paramètres régionaux actuels, la String
sera convertie en Date
. S'il ne peut pas être converti en une Date
dans les paramètres régionaux en cours, une erreur d'exécution 13 - "Incompatibilité de type" résultera de la comparaison.
Des précautions doivent être prises lors des comparaisons entre les valeurs Double
ou Single
et les valeurs booléennes . Contrairement à d'autres types numériques, les valeurs non nulles ne peuvent pas être considérées comme True
raison du comportement de VBA consistant à promouvoir le type de données d'une comparaison impliquant un nombre à virgule flottante sur 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
Opérateurs binaires \ logiques
Tous les opérateurs logiques de VBA peuvent être considérés comme des "substitutions" des opérateurs binaires du même nom. Techniquement, ils sont toujours traités comme des opérateurs binaires. Tous les opérateurs de comparaison dans VBA renvoient un booléen , dont aucun des bits ne sera défini ( False
) ou tous ses bits définis ( True
). Mais il traitera une valeur avec n'importe quel bit défini comme True
. Cela signifie que le résultat de la conversion du résultat binaire d'une expression en un Boolean
(voir Opérateurs de comparaison) sera toujours le même que le traiter comme une expression logique.
L'affectation du résultat d'une expression à l'aide de l'un de ces opérateurs donnera le résultat binaire. Notez que dans les tables de vérité ci-dessous, 0
est équivalent à False
et 1
est équivalent à True
.
And
Renvoie True
si les expressions des deux côtés ont la valeur True
.
Opérande de gauche | Opérande de droite | Résultat |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Or
Renvoie True
si l'un des côtés de l'expression correspond à True
.
Opérande de gauche | Opérande de droite | Résultat |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Not
Renvoie True
si l'expression est False
et False
si l'expression est évaluée à True
.
Opérande de droite | Résultat |
---|---|
0 | 1 |
1 | 0 |
Not
est le seul opérande sans opérande de gauche. Visual Basic Editor simplifiera automatiquement les expressions avec un argument de gauche. Si vous tapez ...
Debug.Print x Not y
... le VBE changera la ligne pour:
Debug.Print Not x
Des simplifications similaires seront apportées à toute expression contenant un opérande gauche (y compris les expressions) pour Not
.
Xor
Aussi appelé "exclusif ou". Renvoie True
si les deux expressions donnent des résultats différents.
Opérande de gauche | Opérande de droite | Résultat |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Notez que bien que l'opérateur Xor
puisse être utilisé comme un opérateur logique, il n'y a absolument aucune raison de le faire car il donne le même résultat que l'opérateur de comparaison <>
.
Eqv
Aussi appelé "équivalence". Renvoie True
lorsque les deux expressions ont le même résultat.
Opérande de gauche | Opérande de droite | Résultat |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Notez que la fonction Eqv
est très rarement utilisée, car x Eqv y
est équivalent au Not (x Xor y)
beaucoup plus lisible.
Imp
Aussi appelé "implication". Renvoie True
si les deux opérandes sont identiques ou que le deuxième opérande est True
.
Opérande de gauche | Opérande de droite | Résultat |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
Notez que la fonction Imp
est très rarement utilisée. Une bonne règle de base est que si vous ne pouvez pas expliquer ce que cela signifie, vous devriez utiliser une autre construction.