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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow