🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA CheckBox dans Excel — True/False, le Null de TripleState et le regroupement des OptionButton

|

VBA CheckBox dans Excel — True/False, le Null de TripleState et le regroupement des OptionButton

TL;DR — Un CheckBox est une bascule oui/non : lisez .Value comme un Boolean, True ou False, avec If CheckBox1.Value Then .... Deux choses surprennent les gens. TripleState = True donne à .Value un troisième état, Null, et alors If CheckBox1.Value déclenche un « Type mismatch ». Et son cousin l'OptionButton (un bouton radio) est exclusif par conteneur : chaque bouton radio sur le même formulaire forme un groupe, donc vous séparez les groupes indépendants avec un Frame. CheckBox = des bascules indépendantes ; OptionButton-dans-un-Frame = choisir exactement un.

' Lire des cases a cocher, c'est aussi simple que le VBA le permet
Private Sub cmdSave_Click()
    If chkEmail.Value Then Range("B1").Value = "Email opt-in"
    If chkSMS.Value Then Range("B2").Value = "SMS opt-in"
End Sub

Un CheckBox est un contrôle sur un UserForm, et c'est le plus aimable à lire : son .Value est un simple Boolean. Cette simplicité est justement pourquoi les deux exceptions ci-dessous prennent les gens au dépourvu — vous cessez d'attendre du contrôle quoi que ce soit d'astucieux, et alors TripleState ou un ensemble de boutons radio non groupés vous mord.

Ce que vous allez apprendre

  • Lire un CheckBox comme un Boolean, le contrôle le plus simple d'un formulaire
  • Le piège TripleState : un troisième .Value valant Null qui fait échouer If CheckBox1.Value
  • Pourquoi les groupes d'OptionButton sont décidés par leur conteneur, non par le nommage
  • Comment un Frame (ou GroupName) empêche deux groupes de boutons radio de se disputer
  • Le choix de jugement : CheckBox pour des oui/non indépendants, OptionButton pour un-parmi-plusieurs
  • Pourquoi vous ne devriez jamais simuler un groupe radio à partir de cases à cocher

Le modèle mental : une case à cocher est un Boolean que vous pouvez voir

Il n'y a presque rien dans un CheckBox. C'est un Boolean avec une étiquette dessus :

CheckBox1.Value       ' True quand coche, False quand vide

Lisez-le avec un If, écrivez-le pour basculer la coche, et vous avez fini. C'est la correspondance contrôle-code la plus nette d'un formulaire, et pour un ensemble d'options oui/non indépendantes — inscription e-mail, inscription SMS, inclure les totaux — c'est exactement ce qu'il faut. Chaque case tient seule ; en cocher une n'a aucun effet sur les autres. Gardez à l'esprit cette idée d'« indépendant », car c'est la ligne qui sépare un CheckBox d'un OptionButton.

Le piège TripleState : quand .Value peut valoir Null

Un CheckBox possède une propriété TripleState. Laissez-la à False (la valeur par défaut) et .Value ne vaut jamais que True ou False. Passez-la à True et le contrôle gagne un troisième état — une coche grisée, indéterminée — dont le .Value est Null, non False :

' Avec TripleState = True, cette ligne peut exploser
If CheckBox1.Value Then ...     ' Null dans un If leve l'erreur d'execution 13, Type mismatch

If Null Then est un « Type mismatch » (erreur d'exécution 13), car Null n'est ni True ni False. Donc si vous activez TripleState, vous devez tester les trois états explicitement :

If IsNull(CheckBox1.Value) Then
    ' indetermine - ni coche ni decoche
ElseIf CheckBox1.Value Then
    ' coche
Else
    ' vide
End If

Le conseil pratique : n'activez pas TripleState à moins d'avoir vraiment besoin d'un état indéterminé. La plupart des formulaires n'en ont pas besoin, et chacun qui le laisse désactivé peut lire .Value avec un simple If.

OptionButton : la même simplicité, une seule réponse exclusive

Un OptionButton (un bouton radio) se lit exactement comme un CheckBox — .Value vaut True pour celui qui est sélectionné — mais tout son intérêt est qu'un seul dans un groupe peut valoir True à la fois. En sélectionner un efface les autres. On lit un groupe en trouvant celui qui est actif :

Dim shipping As String
If optStandard.Value Then shipping = "Standard"
If optExpress.Value Then shipping = "Express"
If optOvernight.Value Then shipping = "Overnight"

C'est le bon contrôle quand la réponse est l'une de plusieurs — vitesse de livraison, mode de paiement, taille. Là où ça déraille, c'est le regroupement.

Le piège du regroupement : les boutons radio sont exclusifs par conteneur

C'est l'erreur qui produit « sélectionner un bouton radio désélectionne un bouton d'un groupe totalement étranger ». L'exclusivité d'OptionButton est décidée par le conteneur, non par les noms ou l'intention. Chaque bouton radio placé directement sur le UserForm appartient à un groupe — si bien que deux questions radio distinctes sur le même formulaire se disputent. Le correctif est de donner à chaque ensemble son propre conteneur, un Frame :

UserForm
  Frame "Shipping"        <- un groupe exclusif
    optStandard
    optExpress
    optOvernight
  Frame "Payment"         <- un groupe separe et independant
    optCard
    optInvoice

Déposez chaque grappe de boutons radio dans son propre Frame et chaque Frame devient un groupe indépendant : l'utilisateur peut désormais choisir une vitesse de livraison et un mode de paiement sans que les deux interfèrent. (Autrement, réglez la propriété .GroupName de chaque bouton sur une chaîne partagée ; le Frame est le choix visuel et, d'ordinaire, le plus clair.)

Le choix de jugement : CheckBox ou OptionButton

Le choix porte sur la forme de la réponse, et ce n'est pas affaire de goût :

  • Utilisez CheckBox quand les options sont indépendantes et qu'un nombre quelconque peut être actif — fonctionnalités à activer, colonnes à inclure, inscriptions. Plusieurs peuvent être cochées à la fois.
  • Utilisez OptionButton (dans un Frame) quand la réponse est exactement une parmi un ensemble mutuellement exclusif — un mode, une vitesse, une taille.

Et l'anti-modèle à éviter : ne simulez jamais un groupe radio avec des cases à cocher en écrivant du code qui décoche les autres quand on en coche une. C'est réimplémenter, mal, ce qu'un groupe d'OptionButton fait déjà gratuitement — et c'est le genre d'état bricolé à la main qui casse à l'instant où vous ajoutez une quatrième option. Si la réponse est un-parmi-plusieurs, utilisez des OptionButton dans un Frame.

Comment ExcelMaster vous aide

Deux échecs de cette page sont discrets et agaçants : un If CheckBox1.Value qui plante avec « Type mismatch » parce que TripleState y a glissé un Null, et des boutons radio qui s'effacent mutuellement à travers des questions étrangères parce que personne ne les a mis dans des Frame.

ExcelMaster vous laisse décrire le formulaire en mots simples — « trois cases à cocher d'inscription indépendantes, plus un choix de vitesse de livraison et un choix de paiement » — et il dispose les CheckBox, groupe les OptionButton dans leurs propres Frame pour qu'ils n'interfèrent pas, et lit chaque contrôle de la bonne façon. Vous gardez le classeur et le code.

Questions fréquentes

Comment savoir si un CheckBox est coché en VBA ?

Lisez son .Value, qui est un Boolean : If CheckBox1.Value Then ... s'exécute quand la case est cochée. Écrire CheckBox1.Value = True la coche depuis le code. Cela fonctionne proprement tant que TripleState vaut False, ce qui est la valeur par défaut.

Pourquoi If CheckBox1.Value donne-t-il une erreur « Type mismatch » ?

Parce que TripleState est activé, et que la case est dans son troisième état, indéterminé, où .Value est Null. If Null Then déclenche l'erreur d'exécution 13, « Type mismatch ». Soit vous laissez TripleState = False pour que la valeur ne vaille jamais que True ou False, soit vous testez les trois états avec IsNull(CheckBox1.Value) avant le If.

Pourquoi mes boutons radio se désélectionnent-ils entre différents groupes ?

Parce que l'exclusivité d'OptionButton est fixée par le conteneur. Chaque bouton radio placé directement sur le UserForm est traité comme un seul groupe, si bien que des questions étrangères interfèrent. Placez chaque ensemble de boutons radio dans son propre Frame (ou donnez à chaque ensemble un .GroupName distinct) pour en faire des groupes indépendants.

Quelle est la différence entre un CheckBox et un OptionButton ?

Un CheckBox est une bascule oui/non indépendante — un nombre quelconque peut être coché à la fois. Un OptionButton est un choix parmi un groupe mutuellement exclusif — en sélectionner un efface les autres. Utilisez des cases à cocher pour des options indépendantes et des boutons radio (groupés dans un Frame) quand l'utilisateur doit en choisir exactement un.

Comment grouper des boutons radio dans un UserForm VBA ?

Placez chaque groupe de contrôles OptionButton dans son propre contrôle Frame ; le Frame définit le groupe, si bien que les boutons de cadres différents ne s'effacent plus entre eux. Si vous ne pouvez pas utiliser de cadres, réglez la propriété .GroupName de chaque groupe sur une chaîne partagée et distincte. Dans tous les cas, le but est de donner à chaque question exclusive son propre conteneur.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 25/09/2026.

Guides associés : VBA ListBox · VBA ComboBox · VBA UserForm · VBA MsgBox · VBA If Then Else