Microsoft 365 Case à cocher apparait si une autre case est cochée

  • Initiateur de la discussion Initiateur de la discussion dacunha
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dacunha

XLDnaute Junior
Bonjour,
J'aimerais que vous puissiez m'aider dans la construction de mon tableau Excel.
En effet, j'ai différentes cases à cocher et j'aimerais que certaines n'apparaissent que si l'une des cases des cellules D6 à D9 sont elles-mêmes cochées (une seule d'entre elles).
Auriez-vous une solution à me proposer?
Je vous remercie.
 
Solution
Re

@dacunha
Essaie ceci pour la date
(donc il faut de nouveau remplacer la macro évènementielle
Code:
'dernière version 13/4/25 - 19h00
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x, v_al
If Not Intersect(Range("B:D"), Target) Is Nothing Then '-< ici modif
If Target.Count > 1 Then Exit Sub
Select Case Target.CellControl.Type
Case xlTypeCheckbox
If Target.Value = False Then Exit Sub
For i = 3 To [datas].Columns.Count Step 2
x = Target.Address(0, 0)
If IsError(Application.Match(x, Feuil2.ListObjects(1).DataBodyRange.Columns(1), 0)) Then Exit Sub
If Not IsEmpty(Application.VLookup(x, [datas], i, 0)) Then
v_al = InputBox(Application.VLookup(x, [datas], i - 1, 0))
Select Case IsDate(v_al)
Case True
Range(Application.VLookup(x, [datas], i...
Re

@dacunha
Vu le nombre de procédures Sub Caseàcocher_Cliquer redondantes dans ton classeur, je t'invite à plutôt utiliser un module de classe
Voir cet exemple
(je viens de tester la PJ du message que je cite: test OK)

Ensuite fais-le ménage dans tes modules (on sait plus où donner la tête) 39 modules standards, si je compte bien.
 
Dernière modification par un modérateur:
Re

Un exemple pour :
si le bouton 1 est sélectionné que les cellules A5 à A9 apparaissent
Le code VBA
Code:
Private Sub CheckBox1_Click()
If Me.CheckBox1 = True Then
Me.Outline.ShowLevels RowLevels:=2
Else
Me.Outline.ShowLevels RowLevels:=1
End If
End Sub
Le résultat obtenu
• cochée
coché.PNG

• décochée
décoche.PNG


NB: Au préalable, j'ai groupé les lignes 5 à 9 avec Données/Plan/Grouper
 
Re

Un exemple pour :

Le code VBA
Code:
Private Sub CheckBox1_Click()
If Me.CheckBox1 = True Then
Me.Outline.ShowLevels RowLevels:=2
Else
Me.Outline.ShowLevels RowLevels:=1
End If
End Sub
Le résultat obtenu
• cochée
Regarde la pièce jointe 1216028
• décochée
Regarde la pièce jointe 1216029

NB: Au préalable, j'ai groupé les lignes 5 à 9 avec Données/Plan/Grouper
Bonjour,
Merci pour votre réponse. Je n'arrive pas à la mettre en place... Est-ce que la raison pourrait être que les cellules, même vidées de leur contenu, contiennent toujours des formules?
J'ai repris mon fichier test et rajouté toutes les formules que j'ai sur mon fichier officiel afin que vous puissiez voir ce qu'il y a dans mes cellules.
Mon but est de si le bouton 1 est sélectionné que les cellules A5 à A9 apparaissent, y compris les cases à cocher présentes sur chacune des lignes et liées à une cellule de B5 à B9 et si le bouton 2 est sélectionné, alors, je voudrais que le contenu des cellules C5 à C10 apparaissent ainsi que les cases à cochées liées aux cellules D5 à D10.
Merci
 

Pièces jointes

Bonjour

@dacunha
Je ne comprends pas la logique de fonctionnent de ton classeur
Exemple avec cette macro
Code:
Sub Caseàcocher_Cliquer()
Dim result
    If CaseàcocherB6 = vrai Then result = InputBox("Veuillez entrer le solde *** :")
        Range("M1").Value = result
    If CaseàcocherB6 = vrai Then result = InputBox("Veuillez entrer la date *** :")
        If IsDate(result) Then Range("J4").Value = CDate(result)
End Sub
Code liée à la case à cocher en cellule B6
Si je coche le code s'exécute
Si je décoche le code s'exécute de nouveau, et écrasera donc ma précédente saisie

Sinon
Mon but est de si le bouton 1 est sélectionné que les cellules A5 à A9
Qu'est-ce que tu nommes bouton 1 ?

Le seul bouton que je vois , c'est RESET.

Le reste ce ne sont que des cases à cocher
 
Bonjour

@dacunha
Je ne comprends pas la logique de fonctionnent de ton classeur
Exemple avec cette macro
Code:
Sub Caseàcocher_Cliquer()
Dim result
    If CaseàcocherB6 = vrai Then result = InputBox("Veuillez entrer le solde *** :")
        Range("M1").Value = result
    If CaseàcocherB6 = vrai Then result = InputBox("Veuillez entrer la date *** :")
        If IsDate(result) Then Range("J4").Value = CDate(result)
End Sub
Code liée à la case à cocher en cellule B6
Si je coche le code s'exécute
Si je décoche le code s'exécute de nouveau, et écrasera donc ma précédente saisie

Sinon

Qu'est-ce que tu nommes bouton 1 ?

Le seul bouton que je vois , c'est RESET.

Le reste ce ne sont que des cases à cocher
Bonjour,
Je parle du bouton radio XXX= 1 et YYY = 2
1744005664781.png

Nous avons chacun de nous une logique différente.
L'exemple que tu reprends est simple. Si je coche B6 alors j'ai des questions qui apparaissent en popup à laquelle je dois répondre. Une fois cette case B6 cochée, le reste apparait car il faut continuer le traitement. Si je décoche (mais ce n'est pas le but car le bouton RESET est là pour cela), j'ai effectivement à nouveau les popup car je ne sais pas comment faire pour qu'elles n'apparaissent pas lors du décoché. C'est un point d'amélioration auquel je dois penser mais pour l'instant ma priorité est aux cases qui doivent apparaitre ou disparaitre en fonction du bouton radio sélectionné.
Je te remercie.
 
Dernière édition:
Bonjour le fil

@dacunha
Je comprends mieux le fonctionnement.

Personnellement j'écrirai le code comme ceci
(Ici si on décoche il ne passe rien)
VB:
Sub Caseàcocher_Cliquer()
Dim chkBox As Object
Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)
Select Case chkBox
Case xlOn
On Error Resume Next
Range("M1").Value = InputBox("Veuillez entrer le solde *** :")
Range("J4").Value = CDate(InputBox("Veuillez entrer la date *** :"))
Case Else
'
End Select
'Pour test
'MsgBox chkBox.TopLeftCell.Address
End Sub

Cela pourrait être une piste pour essayer de "génériquer" une seule procédure Case_A_Cocher()
 
Re

@dacunha
Je viens de faire le test pour deux cases à cocher (en cellule B6 et B7)
auxquelles j'ai affecté cette seule macro
Résultat : test OK pour ces deux cases à cocher pilotées par une seule et même macro.
VB:
Sub Cases_Cocher()
Dim chkBox As Object
Dim cellules, x$, adrA$, adrB$
cellules = Array(Array("B6", "M1", "J4"), Array("B7", "M2", "J5"))
Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)
x = chkBox.TopLeftCell.Address(0, 0)
adrA = Application.VLookup(x, cellules, 2, 0)
adrB = Application.VLookup(x, cellules, 3, 0)
Select Case chkBox
Case xlOn
On Error Resume Next
Range(adrA).Value = InputBox("Veuillez entrer le solde *** :")
Range(adrB).Value = CDate(InputBox("Veuillez entrer la date *** :"))
Case Else
'
End Select
'Pour test
'MsgBox chkBox.TopLeftCell.Address
End Sub
Le problème étant si j'ai bien compris le fonctionnement , les cases à cocher ne font pas toutes la même
(demander un montant et une date)

Mais si déjà, on peut simplifier la donne en ayant une seule procédure dans un seul module on y verrait plus clair, non ?
 
Dernière édition:
Re

@dacunha
Je viens de faire le test pour deux cases à cocher (en cellule D6 et D7)
auxquelles j'ai affecté cette seule macro
Résultat : test OK pour ces deux cases à cocher pilotées par une seule et même macro.
VB:
Sub Cases_Cocher()
Dim chkBox As Object
Dim cellules, x$, adrA$, adrB$
cellules = Array(Array("B6", "M1", "J4"), Array("B7", "M2", "J5"))
Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)
x = chkBox.TopLeftCell.Address(0, 0)
adrA = Application.VLookup(x, cellules, 2, 0)
adrB = Application.VLookup(x, cellules, 3, 0)
Select Case chkBox
Case xlOn
On Error Resume Next
Range(adrA).Value = InputBox("Veuillez entrer le solde *** :")
Range(adrB).Value = CDate(InputBox("Veuillez entrer la date *** :"))
Case Else
'
End Select
'Pour test
'MsgBox chkBox.TopLeftCell.Address
End Sub
Le problème étant si j'ai bien compris le fonctionnement , les cases à cocher ne font pas toutes la même
(demander un montant et une date)

Mais si déjà, on peut simplifier la donne en ayant une seule procédure dans un seul module on y verrait plus clair, non ?
Re
Merci d'avoir pris le temps de réfléchir à une solution à mon problème.
Je viens de supprimer sur mon fichier test l'ensemble des macros et en y mettant la macro que tu as préparée. J'ai tenté d'affecter cette macro au cases D6 et D7 mais celle-ci n'apparait pas dans la liste des macros.
Effectivement, s'il y avait un seul module pour une même procédure ça serait moins invasif. Oui tu as bien compris, les cases à cocher ne renvoient pas toutes à la même conclusion ou questions
 
Re

@dacunha
Je viens de refaire le test sur un classeur vierge
avec 3 cases à cocher (en C3, C5 et C7)
Resultat_TEST_CB.PNG

Sur ces 3 cases à cocher, j'ai fait Clic-droit -> Affecter une macro
et j'ai choisi celle-ci qui est dans un module Standard
Code:
Sub Cases_Cocher()
Dim chkBox As Object
Dim cellules, x$, adrA$, adrB$
cellules = Array(Array("C3", "D3", "F3"), Array("C5", "D5", "F5"), Array("C7", "D7", "F7"))
Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)
x = chkBox.TopLeftCell.Address(0, 0)
adrA = Application.VLookup(x, cellules, 2, 0)
adrB = Application.VLookup(x, cellules, 3, 0)
Select Case chkBox
Case xlOn
On Error Resume Next
Range(adrA).Value = InputBox("Veuillez entrer le solde *** :")
Range(adrB).Value = CDate(InputBox("Veuillez entrer la date *** :"))
Case Else
'
End Select
'Pour test
'MsgBox chkBox.TopLeftCell.Address
End Sub
Puis j'ai cliquer sur chaque case (la macro a fait son office)
J'ai ensuite décoché chaque case (et rien n'a été effacé)



Code:
Sub Cases_Cocher_Juste_Pour_Test()
Dim chkBox As Object
Dim cellules, x$, adrA$, adrB$
cellules = Array(Array("C3", "D3", "F3"), Array("C5", "D5", "F5"), Array("C7", "D7", "F7"))
Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)
x = chkBox.TopLeftCell.Address(0, 0)
adrA = Application.VLookup(x, cellules, 2, 0)
adrB = Application.VLookup(x, cellules, 3, 0)
Select Case chkBox
Case xlOn
On Error Resume Next
Range(adrA).Value = InputBox("Veuillez entrer le solde *** :", "Vous avez cliqué sur: " & chkBox.Name)
Range(adrB).Value = CDate(InputBox("Veuillez entrer la date *** :", "Vous avez cliqué sur: " & chkBox.Name))
Case Else
'
End Select
End Sub
 
Dernière édition:
Re

Pour revenir à ton fichier, on pourrait envisager de regrouper les cases à cocher par type d'action produit
On aurait alors une, deux ou trois procédures distinctes (toujours dans un seul module)
Sub Cocher_A()
Sub Cocher_B()
Sub Cocher_C()

Et selon les cas, on irait affecter une des 3 macros génériques à tes cases à cocher
 
Re

@dacunha
Je viens de refaire le test sur un classeur vierge
avec 3 cases à cocher (en C3, C5 et C7)
Regarde la pièce jointe 1216130
Sur ces 3 cases à cocher, j'ai fait Clic-droit -> Affecter une macro
et j'ai choisi celle-ci qui est dans un module Standard
Code:
Sub Cases_Cocher()
Dim chkBox As Object
Dim cellules, x$, adrA$, adrB$
cellules = Array(Array("C3", "D3", "F3"), Array("C5", "D5", "F5"), Array("C7", "D7", "F7"))
Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)
x = chkBox.TopLeftCell.Address(0, 0)
adrA = Application.VLookup(x, cellules, 2, 0)
adrB = Application.VLookup(x, cellules, 3, 0)
Select Case chkBox
Case xlOn
On Error Resume Next
Range(adrA).Value = InputBox("Veuillez entrer le solde *** :")
Range(adrB).Value = CDate(InputBox("Veuillez entrer la date *** :"))
Case Else
'
End Select
'Pour test
'MsgBox chkBox.TopLeftCell.Address
End Sub
Puis j'ai cliquer sur chaque case (la macro a fait son office)
J'ai ensuite décoché chaque case (et rien n'a été effacé)



Code:
Sub Cases_Cocher_Juste_Pour_Test()
Dim chkBox As Object
Dim cellules, x$, adrA$, adrB$
cellules = Array(Array("C3", "D3", "F3"), Array("C5", "D5", "F5"), Array("C7", "D7", "F7"))
Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)
x = chkBox.TopLeftCell.Address(0, 0)
adrA = Application.VLookup(x, cellules, 2, 0)
adrB = Application.VLookup(x, cellules, 3, 0)
Select Case chkBox
Case xlOn
On Error Resume Next
Range(adrA).Value = InputBox("Veuillez entrer le solde *** :", "Vous avez cliqué sur: " & chkBox.Name)
Range(adrB).Value = CDate(InputBox("Veuillez entrer la date *** :", "Vous avez cliqué sur: " & chkBox.Name))
Case Else
'
End Select
End Sub
Ah oui je te crois mais je ne comprends pas pourquoi elle n'apparait pas lorsque je la créer.
1744032945134.png

Je ne vois que la macro concernant le bouton RESET
Voici la macro, j'ai fait clic droit insérer module
1744033015769.png

Puis j'y ai collé ton code
1744033045484.png


Peut-ête que je me trompe d'endroit?
 
Re

@dacunha
Pour coller un code VBA dans un module existant, il suffit de faire depuis Excel
ALT+F11
puis copier/coller dans le module de son choix
Ensuite on retourne dans Excel (de nouveau ALT+F11)
On clique-droit sur une case à cocher -> Affecter une macro et on choisit la macro qu'on vient de copier/coller.

Fais le test que j'ai fait ( sur un fichier vierge) avec simplement 3 cases à cocher

PS: Sur l'image de ton post, on voit la macro, il faut juste la sélectionner et cliquer sur OK
Il ne faut pas faire Nouvelle ou Enregistrer
 
Re

Pour revenir à ton fichier, on pourrait envisager de regrouper les cases à cocher par type d'action produit
On aurait alors une, deux ou trois procédures distinctes (toujours dans un seul module)
Sub Cocher_A()
Sub Cocher_B()
Sub Cocher_C()

Et selon les cas, on irait affecter une des 3 macros génériques à tes cases à cocher
Re,
Je viens de regarder au sein de chaque module l'ensemble des questions mais, en fonction des cases je n'ai pas les mêmes questions. Pour être tout à fait exacte, si par exemple sur un module j'ai 4 questions, sur les 4, j'en ai simplement 1 identique aux autres modules mais les autres sont toutes différentes. Et ceci est vrai pour chaque module. C'est difficile à voir pour toi car j'ai dû modifier les termes des questions mais du coup, dans le vrai fichier, le départ des questions est identique mais pas la fin (où j'ai mis des ***.
Si déjà j'arrive à comprendre la philosophie, j'essaierai ensuite de concevoir tous les modules sur les mêmes bases.
 
Re

@dacunha
Pour coller un code VBA dans un module existant, il suffit de faire depuis Excel
ALT+F11
puis copier/coller dans le module de son choix
Ensuite on retourne dans Excel (de nouveau ALT+F11)
On clique-droit sur une case à cocher -> Affecter une macro et on choisit la macro qu'on vient de copier/coller.

Fais le test que j'ai fait ( sur un fichier vierge) avec simplement 3 cases à cocher

PS: Sur l'image de ton post, on voit la macro, il faut juste la sélectionner et cliquer sur OK
Il ne faut pas faire Nouvelle ou Enregistrer
Re,
J'avais pas réalisé que la macro Cases_cocher était celle que tu avais créee... je suis perturbée. Donc ou la macro apparait bien.
Lorsque je clique sur D6 par exemple j'obtiens cela :
1744034273210.png

Puis lorsque je fais Débogage, voici ce que je vois
1744034307176.png


Je viens de créer un fichier avec 3 cases et cette macro et j'obtiens le même message d'erreur
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
18
Affichages
1 K
Retour