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

VBA Frame dans Excel — regrouper les OptionButton et délimiter la portée des contrôles

|

VBA Frame dans Excel — regrouper les OptionButton et délimiter la portée des contrôles

TL;DR — Un Frame est un conteneur, pas une décoration. Sa bordure avec légende est le moindre de ses attributs : le cadre possède les contrôles placés à l'intérieur. Cette possession rend un ensemble de boutons radio mutuellement exclusifs en tant que groupe — des boutons radio déposés directement sur un formulaire forment tous un seul groupe, si bien qu'un seul peut jamais être choisi. Un cadre possède aussi sa propre sous-collection Controls et ses propres .Enabled et .Visible, si bien que vous pouvez activer ou désactiver une section entière d'un coup.

' Deux choix independants ont besoin de deux cadres.
' Les OptionButtons dans fraSize sont exclusifs entre eux;
' Les OptionButtons dans fraColour forment un groupe separe.
Private Sub UserForm_Initialize()
    fraSize.Caption = "Size"
    fraColour.Caption = "Colour"
    optSmall.Value = True        ' une valeur par defaut par cadre
    optRed.Value = True
End Sub

Un Frame est le seul contrôle de UserForm que vous ajoutez pour le bien des autres contrôles. À lui seul, il ne fait presque rien ; son but est de contenir un groupe, et ce rôle de conteneur complète la famille des contrôles. Atteint comme tout le reste via la collection Controls du formulaire, un cadre est l'endroit où vit réellement la règle de regroupement des boutons radio, et c'est ainsi que vous délimitez et basculez une section d'un formulaire comme une unité. Si vous avez déjà placé deux ensembles de boutons radio sur un formulaire et constaté qu'en choisir un désélectionnait l'autre, ce contrôle est le correctif.

Ce que vous allez apprendre

  • Pourquoi un Frame est un conteneur qui possède ses contrôles, pas seulement une bordure
  • La règle pour laquelle les Frame existent : rendre les boutons radio exclusifs par groupe
  • L'alternative GroupName et quand la préférer
  • Le fait qu'un cadre possède sa propre sous-collection Controls
  • Basculer une section entière avec les .Enabled et .Visible du cadre
  • La chaîne Parent, et pourquoi elle change la façon d'atteindre un contrôle

Le modèle mental : un Frame est un conteneur, pas une décoration

Il est tentant de voir un Frame comme une boîte cosmétique avec une légende. C'est en réalité un parent : les contrôles que vous dessinez à l'intérieur lui appartiennent, pas au formulaire. Cette relation unique — le cadre possède ses enfants — est la source de tout ce qui le rend utile. Déplacez le cadre et ses enfants se déplacent. Désactivez le cadre et ses enfants grisent. Et un groupe de boutons radio à l'intérieur du cadre ne rivalise qu'entre eux. La bordure que vous voyez n'est que le bord visible d'une frontière de possession.

La raison d'être des Frame : regrouper les boutons radio

C'est le point central. Les OptionButtons (boutons radio) sont mutuellement exclusifs au sein de leur conteneur. Déposez six boutons radio directement sur un formulaire et ils partagent un seul conteneur — le formulaire — si bien que choisir l'un efface les cinq autres, même si vous les vouliez comme deux questions séparées :

' FAUX: six boutons radio directement sur le formulaire = un seul groupe.
' Choisir optRed efface optSmall. L'utilisateur ne peut pas choisir une taille ET une couleur.

Placez chaque question dans son propre cadre et chacun devient un groupe indépendant :

' CORRECT: trois options de taille dans fraSize, trois options de couleur dans fraColour.
' Maintenant l'utilisateur choisit une taille et une couleur, independamment.

Le cadre est le groupe. Ce n'est pas un raffinement — c'est la seule façon propre d'avoir plus d'un ensemble de boutons radio sur un formulaire. (Les CheckBoxes ne sont jamais regroupées de cette façon ; chacune est indépendante, ce qui est exactement la distinction du CheckBox.)

L'alternative GroupName et quand la préférer

Il existe une deuxième façon de regrouper les boutons radio : leur donner la même chaîne GroupName. Les boutons qui partagent un GroupName sont exclusifs même sans cadre autour d'eux :

optCash.GroupName = "Payment"
optCard.GroupName = "Payment"     ' exclusif avec optCash, pas de cadre necessaire

Préférez un Frame quand le regroupement est aussi visuel — l'utilisateur doit voir que les options vont ensemble, et vous voulez pouvoir les activer ou les masquer comme une unité. Utilisez GroupName quand vous avez besoin d'exclusivité sans conteneur visible, ou quand la disposition rend un cadre malcommode. Le cadre est le meilleur choix par défaut car il rend le regroupement évident pour la prochaine personne qui lira le formulaire.

Un Frame possède sa propre collection Controls

Parce que le cadre possède ses enfants, il a sa propre collection Controls — un sous-ensemble de celle du formulaire. Cela permet de parcourir uniquement les contrôles d'une section :

Dim ctl As MSForms.Control
For Each ctl In fraSize.Controls        ' seulement les controles a l'interieur de fraSize
    If TypeOf ctl Is MSForms.OptionButton Then
        If ctl.Value Then MsgBox "Size chosen: " & ctl.Caption
    End If
Next ctl

Cela reflète Me.Controls mais cadré au cadre. C'est ainsi que vous lisez quelle option est sélectionnée dans ce groupe sans toucher au reste du formulaire — parcourez les contrôles du cadre et trouvez le bouton radio dont le .Value est True.

Basculer une section entière avec Enabled et Visible

Réglez le .Enabled ou le .Visible du cadre et chaque enfant suit :

fraShipping.Enabled = chkShip.Value      ' griser toute la section expedition
fraAdvanced.Visible = False              ' masquer les options avancees jusqu'a ce qu'elles soient necessaires

Une seule ligne désactive ou masque une section entière — adresse, paiement, réglages avancés — au lieu de parcourir ses contrôles. C'est le bénéfice quotidien du modèle de conteneur : le cadre est une poignée sur le groupe pris comme une unité.

La chaîne parent : le vrai parent d'un contrôle

La possession change la filiation. Un contrôle à l'intérieur d'un cadre a ce cadre comme Parent, pas le formulaire :

MsgBox optSmall.Parent.Name     ' "fraSize", pas le nom du formulaire

Deux conséquences piègent les gens. Premièrement, le .Left et le .Top d'un contrôle sont mesurés depuis le cadre, pas le formulaire, si bien que déplacer un contrôle entre un cadre et le formulaire change l'endroit où il atterrit. Deuxièmement, un contrôle cadré est atteint via le cadre, pas comme un élément de premier niveau de la propre Controls du formulaire — si bien qu'une boucle au niveau du formulaire qui s'attendait à le trouver au premier niveau le manquera. Quand un contrôle semble être au mauvais endroit ou introuvable là où vous l'avez cherché, vérifiez si son Parent est un cadre.

Le choix de jugement : quand un Frame mérite sa place

Un Frame est peu coûteux, mais pas gratuit — il ajoute une couche à la chaîne parent et à la façon d'atteindre les contrôles. Ajoutez-en un quand il fait un vrai travail : vous avez plus d'un ensemble de boutons radio, ou une section que vous voulez activer, masquer ou lire comme une unité. N'enveloppez pas chaque étiquette et boîte dans un cadre pour l'esthétique ; cela ne fait qu'approfondir la chaîne parent et fait manquer aux boucles Controls au niveau du formulaire des contrôles que vous vous attendiez à trouver au premier niveau. La règle empirique : un cadre doit correspondre à un groupe que l'utilisateur perçoit comme une seule chose — une question avec plusieurs réponses, une section qui s'active ensemble. S'il ne regroupe rien, c'est juste une bordure, et une simple étiquette fait ce travail sans effet de bord.

Comment ExcelMaster vous aide

Le bug classique du Frame est invisible jusqu'à ce que vous testiez le formulaire : deux ensembles de boutons radio qui se battent parce qu'ils n'ont jamais été mis dans un cadre, ou un contrôle qui rapporte une mauvaise position parce que son parent est un cadre que vous avez oublié. Cela ressemble à un problème de disposition et c'est en réalité un problème de possession.

ExcelMaster vous laisse décrire le formulaire en mots simples — « un choix de taille et un choix de couleur, indépendants » — et il dispose les cadres, groupe correctement les boutons radio, et câble le .Enabled d'une section à la case qui la contrôle. Vous gardez le formulaire et le code, et les groupes se comportent comme l'utilisateur s'y attend.

Questions fréquentes

Que fait un Frame dans un UserForm VBA ?

Un Frame est un conteneur qui possède les contrôles placés à l'intérieur. Au-delà de la bordure visible avec légende, il regroupe ces contrôles pour qu'ils se déplacent, s'activent et se masquent ensemble, et — c'est le plus important — il rend un ensemble d'OptionButtons placés à l'intérieur mutuellement exclusifs en tant qu'un seul groupe. Il expose aussi sa propre collection Controls pour parcourir uniquement cette section.

Pourquoi mes boutons radio sont-ils tous dans un seul groupe ?

Parce qu'ils partagent un conteneur. Les OptionButtons sont exclusifs au sein de leur parent, et les boutons déposés directement sur le formulaire partagent tous le formulaire comme parent — si bien qu'un seul peut être sélectionné. Placez chaque ensemble 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 Frame et GroupName pour le regroupement ?

Les deux rendent les boutons radio exclusifs. Un Frame les regroupe et montre un conteneur visible que vous pouvez activer, masquer ou parcourir comme une unité. GroupName les regroupe par une chaîne partagée sans boîte visible. Utilisez un Frame quand le regroupement doit être visible ou commutable ; utilisez GroupName quand vous avez besoin d'exclusivité sans conteneur.

Comment parcourir uniquement les contrôles à l'intérieur d'un Frame ?

Utilisez la collection propre du cadre : For Each ctl In fraSize.Controls. Elle ne contient que les contrôles rattachés à ce cadre, si bien que vous pouvez trouver le bouton radio sélectionné dans un groupe sans toucher au reste du formulaire. Testez chacun avec TypeOf ctl Is MSForms.OptionButton avant de lire son .Value.

Pourquoi la position ou le parent de mon contrôle sont-ils faux à l'intérieur d'un Frame ?

Parce que le Parent d'un contrôle cadré est le cadre, pas le formulaire, et que son .Left et son .Top sont mesurés depuis le cadre. Si un contrôle atterrit à un endroit inattendu après que vous l'avez déplacé dans ou hors d'un cadre, ou qu'une boucle Controls au niveau du formulaire ne le trouve pas comme élément de premier niveau, le cadre présent dans sa chaîne parent en est la raison.

Testé dans

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

Guides associés : VBA Controls · VBA CheckBox · VBA UserForm · VBA ListBox · VBA ComboBox · VBA TextBox · VBA On Error