TL;DR — Un
CheckBoxest une bascule oui/non : lisez.Valuecomme unBoolean,TrueouFalse, avecIf CheckBox1.Value Then .... Deux choses surprennent les gens.TripleState = Truedonne à.Valueun troisième état,Null, et alorsIf CheckBox1.Valuedé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 unFrame.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
CheckBoxcomme unBoolean, le contrôle le plus simple d'un formulaire - Le piège
TripleState: un troisième.ValuevalantNullqui fait échouerIf CheckBox1.Value - Pourquoi les groupes d'
OptionButtonsont décidés par leur conteneur, non par le nommage - Comment un
Frame(ouGroupName) empêche deux groupes de boutons radio de se disputer - Le choix de jugement :
CheckBoxpour des oui/non indépendants,OptionButtonpour 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
CheckBoxquand 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 unFrame) 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
