IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Philippe Tulliez

VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne

Noter ce billet
par , 13/02/2022 à 13h37 (19966 Affichages)
Constat

On peut lire régulièrement sur les forums dédiés au VBA, des codes publiés comme ceux-ci
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
If Range("A2").Value = 10 Then
  CommandButton2.Visible = True
Else
  CommandButton2.Visible = False
End If

Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
If Sheets("NOM DE LA FEUILLE").Visible = True Then
   Sheets("NOM DE LA FEUILLE").Visible = False
 Else
   Sheets("NOM DE LA FEUILLE").Visible = True
End If

et celui-ci qui mérite la palme
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Private Sub ToggleButton1_Click()
  With ToggleButton1
    If .Value = True Then
       Columns("J:P").Hidden = True
    ElseIf .Value = False Then
       Columns("J:P").Hidden = False
    End If
  End With
End Sub

Rappel

Qu'est-ce qu'une variable booléenne ?
Un booléen est un type de variable à deux états (généralement notés True et False)
Attribuer une valeur booléenne à une variable ou à une propriété
On peut affecter la valeur True ou False à une variable comme par exemple Flag = True ou à une propriété, si son type le permet, comme par exemple pour masquer les colonnes J à P de la feuille nommée Accueil Worksheets("Accueil").Columns("J:P").Hidden = True
La fonction If...Then...[Else]
La fonction If à pour but de renvoyer une valeur ou d'effectuer une action si la condition est vraie et éventuellement une autre si la condition est fausse.
Sa syntaxe est If <Condition> Then <Valeur/Action si VRAI> Else <Valeur/Action si FAUX>
Tests et opérateurs logiques
Assigner la valeur True ou False directement à une variable présente un intérêt relativement limité. En revanche, il est bien plus intéressant d'effectuer un test qui renvoie l'une de ces valeurs.
Un test logique, c'est comparer deux éléments à l'aide d'un opérateur de comparaison et cette opération renverra donc True ou False.
Il existe six opérateurs de comparaison (=, <>, <, >=, >, <=)
Pour effectuer des tests plus complexes on utilisera les opérateurs And, Or, Xor
Pour inverser une valeur booléenne, on utilisera l'opérateur Not

Utiliser directement le test logique

Effectuer un test qui renvoie la valeur True ou False pour affecter la valeur d'une variable ou modifier la propriété booléenne d'un objet se révèle bien plus intéressant et plus professionnel que de passer par un If


Exemple 1
Pour masquer ou afficher les colonnes de H à O en fonction de la valeur modifiée de la cellule A2 de la feuille active, on écrira
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If .Address = "$A$2" Then Columns("H:O").EntireColumn.Hidden = (.Value = 10)
  End With
End Sub
ou
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    Columns("H:O").EntireColumn.Hidden = (.Address = "$A$2") And (.Value = 10)
  End With
End Sub

Au lieu de
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If .Address = "$A$2" Then
      If .Value = 10 Then
         Columns("H:O").EntireColumn.Hidden = True
       Else
         Columns("H:O").EntireColumn.Hidden = False
      End If
    End If
  End With
End Sub

Exemple 2
Pour afficher ou masquer une feuille en inversant la valeur booléenne de la propriété Visible de l'objet Sheet
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
With Sheets("Parameter")
.Visible = (Not .Visible)
End With
est préférable à
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
If Sheets("Parameter").Visible = True Then
   Sheets("Parameter").Visible = False
 Else
   Sheets("Parameter").Visible = True
End If

Il peut également être intéressant de Remplacer la fonction SI par une formule logique directement dans Excel.

Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog Viadeo Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog Twitter Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog Google Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog Facebook Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog Digg Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog Delicious Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog MySpace Envoyer le billet « VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne » dans le blog Yahoo

Mis à jour 03/04/2022 à 18h02 par Philippe Tulliez

Catégories
VBA Excel

Commentaires

  1. Avatar de Korian_68
    • |
    • permalink
    Bonjour,
    je suis d'accord sur le principe, mais j'aurais ajouté des parenthèses pour rendre le code plus lisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
      With Target
        If .Address = "$A$2" Then Columns("H:O").EntireColumn.Hidden = ( .Value = 10)
      End With
    End Sub
    Cordialement
  2. Avatar de Philippe Tulliez
    • |
    • permalink
    Bonjour Korian,
    Merci pour ta remarque constructive.
    Tu as raison, cela clarifie la lecture. J'ai modifié le code
    Philippe

    Citation Envoyé par Korian_68
    Bonjour,
    je suis d'accord sur le principe, mais j'aurais ajouté des parenthèses pour rendre le code plus lisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
      With Target
        If .Address = "$A$2" Then Columns("H:O").EntireColumn.Hidden = ( .Value = 10)
      End With
    End Sub
    Cordialement