XL 2019 alterner cochage oui ou non dans checkbox

  • Initiateur de la discussion Initiateur de la discussion pat66
  • 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 !

pat66

XLDnaute Impliqué
Bonjour le forum, j'aimerai faire en sorte que si je coche la checkbox6 = oui, la checkbox7 = non, se décoche
et inversement, voici la macro
Sub CheckBox6_Click()
If CheckBox6.Value = True Then 'Si coché
Sheets("BDD").Range("N2").Value = "Oui"
Else 'Si non coché
Sheets("BDD").Range("N2").Value = "Non"
End If
End Sub

il y a cette solution, mais peut être peut on faire plus simple
Sub CheckBox6_Click()
If CheckBox6.Value = True Then 'Si coché
Sheets("BDD").Range("N2").Value = "Oui"
CheckBox7.Value = False
' Else 'Si non coché
' Sheets("BDD").Range("N2").Value = "Non"
End If
End Sub

Sub CheckBox7_Click()
If CheckBox7.Value = True Then 'Si coché
Sheets("BDD").Range("N2").Value = "Non"
CheckBox6.Value = False
' Else 'Si non coché
' Sheets("BDD").Range("N2").Value = "Non"
' CheckBox7 = True
End If
End Sub
merci de votre aide

Pat66
 
Dernière édition:
Solution
Avec une permutation aléatoire :
VB:
Sub CheckBox8_Click()
Coche CheckBox8
End Sub

Sub CheckBox9_Click()
Coche CheckBox9
End Sub

Sub CheckBox10_Click()
Coche CheckBox10
End Sub

Sub Coche(CB As Object)
Static flag As Boolean
If flag Then Exit Sub 'bloque l'exécution
Dim a, b, i As Byte, j As Byte, k As Byte, temp As Byte
a = Array("CheckBox8", "CheckBox9", "CheckBox10")
b = Array("Avant", "Arrière", "Avant/Arrière")
i = Application.Match(CB.Name, a, 0)
j = IIf(i = 3, 1, i + 1)
k = IIf(j = 3, 1, j + 1)
Randomize
If Rnd > 0.5 Then temp = j: j = k: k = temp 'permutation aléatoire
flag = True
Me.OLEObjects(Application.Index(a, j)).Object = Not CB
Me.OLEObjects(Application.Index(a, k)).Object = 0
flag = False
[E60] =...
remplace test CheckBox par des OptionButton et utilise la propriété GroupName pour associer lest OptionButton
VB:
OptionButton6.GroupName ="AA"
OptionButton7.GroupName ="AA"
ensuite tu utilise la méthode Change d'un des deux OptionButton vue que le que les deux interagissent!
Code:
Private Sub OptionButton6_Change()
Sheets("BDD").Range("N2") = IIf(OptionButton6, "Oui", "Non")
End Sub

Si une option parmi X alors OptionButton avec GroupName si plusieurs alors CheckBox
tu peux également utiliser une ComboBox!
VB:
Private Sub UserForm_Initialize()
Me.ComboBox1.List = Array("Avant", "Arrière", "Avant/Arrière")
Me.ComboBox2.List = Array("OUI","Non")
End Sub
Private Sub ComboBox2_Change()
if ComboBox2.ListIndex>-1 then  Sheets("BDD").Range("N2") = ComboBox2
End Sub
 
Dernière édition:
Utiliser des OptionButtons n'est pas le sujet de ce fil, c'est un autre problème, plus simple :
VB:
Sub OptionButton8_Click()
Active OptionButton8
End Sub

Sub OptionButton9_Click()
Active OptionButton9
End Sub

Sub OptionButton10_Click()
Active OptionButton10
End Sub

Sub Active(OB As Object)
Dim a, b, i As Byte, n As Byte
a = Array(OptionButton8, OptionButton9, OptionButton10)
b = Array("Avant", "Arrière", "Avant/Arrière")
For i = 0 To UBound(a)
    If a(i).Name = OB.Name Then n = i Else a(i) = 0
Next
[E60] = b(n)
End Sub
Le code est le même dans une feuille de calcul et dans un UserForm.

Nota : dans tous les cas, s'il y a beaucoup d'objets, on utilisera un module de classe.
 
Bonjour le fil

Bonjour Job75,
j'ai opté pour la solution avec permutation aléatoire mais j'ai ajouté une 4ième checkbox et je n'arrive pas a la configurer correctement et certaines checkboxs restent cochées simultanément pourriez vous m'aider sil vous plait,
Sub CheckBox3_Click()
Coche3 CheckBox3
End Sub

Sub CheckBox4_Click()
Coche3 CheckBox4
End Sub

Sub CheckBox5_Click()
Coche3 CheckBox5
End Sub

Sub CheckBox6_Click()
Coche3 CheckBox6
End Sub

Sub Coche3(CB As Object)
Static flag As Boolean
If flag Then Exit Sub 'bloque l'exécution
Dim a, b, i As Byte, j As Byte, k As Byte, temp As Byte
a = Array("CheckBox3", "CheckBox4", "CheckBox5", "CheckBox6")
b = Array("M.O", "Étage", "Plain Pied", "Non défini")
i = Application.Match(CB.Name, a, 0)
j = IIf(i = 4, 1, i + 1)
k = IIf(j = 4, 1, j + 1)
Randomize
If Rnd > 0.5 Then temp = j: j = k: k = temp 'permutation aléatoire
flag = True
Me.OLEObjects(Application.Index(a, j)).Object = Not CB
Me.OLEObjects(Application.Index(a, k)).Object = 0
flag = False
[F76] = Application.Index(b, IIf(CB, i, j))
End Sub

merci beaucoup
 
Dernière édition:
Bonjour pat66, le forum,
VB:
Sub CheckBox3_Click()
Coche3 CheckBox3
End Sub

Sub CheckBox4_Click()
Coche3 CheckBox4
End Sub

Sub CheckBox5_Click()
Coche3 CheckBox5
End Sub

Sub CheckBox6_Click()
Coche3 CheckBox6
End Sub

Sub Coche3(CB As Object)
Static flag As Boolean
If flag Then Exit Sub 'bloque l'exécution
Dim a, b, ub As Byte, i As Byte, r As Byte, j As Byte
a = Array("CheckBox3", "CheckBox4", "CheckBox5", "CheckBox6")
b = Array("M.O", "Étage", "Plain Pied", "Non défini")
ub = UBound(a) '3 car base 0
i = Application.Match(CB.Name, a, 0) - 1
Randomize
Do
    r = Application.RandBetween(0, ub) 'ALEA.ENTRE.BORNES
Loop While r = i
flag = True
Me.OLEObjects(a(r)).Object = Not CB
For j = 0 To ub
    If j <> i And j <> r Then Me.OLEObjects(a(j)).Object = 0
Next
flag = False
[F76] = b(IIf(CB, i, r))
End Sub
J'aurais dû utiliser cette méthode même avec 3 CheckBoxes car elle fonctionne quel que soit leur nombre.

A+
 
Au post #19 j'ai parlé de module de classe, voyez ce que ça donne dans le fichier joint.

Code du module de classe :
VB:
Public WithEvents CB As MSForms.CheckBox

Sub CB_Click()
Coche CB
End Sub
La macro dans Module1 :
VB:
Sub Coche(obj As Object)
Static flag As Boolean
If flag Then Exit Sub 'bloque l'exécution
Dim a, b, ub As Byte, i As Byte, r As Byte, j As Byte
a = Array("CheckBox3", "CheckBox4", "CheckBox5", "CheckBox6")
b = Array("M.O", "Étage", "Plain Pied", "Non défini")
ub = UBound(a) '3 car base 0
i = Application.Match(obj.Name, a, 0) - 1
Randomize
Do
    r = Application.RandBetween(0, ub) 'ALEA.ENTRE.BORNES
Loop While r = i
flag = True
With obj.Parent
    .OLEObjects(a(r)).Object = Not obj
    For j = 0 To ub
        If j <> i And j <> r Then .OLEObjects(a(j)).Object = 0
    Next
    .[F76] = b(IIf(obj, i, r))
End With
flag = False
End Sub
Et dans ThisWorkbook pour initialiser la classe :
Code:
Dim CB() As New Classe1

Private Sub Workbook_Open()
Dim o As OLEObject, n%
With Feuil1 'CodeName
    For Each o In .OLEObjects
        If TypeName(o.Object) = "CheckBox" Then
            ReDim Preserve CB(n)
            Set CB(n).CB = o.Object
            n = n + 1
        End If
    Next
End With
End Sub
 

Pièces jointes

- 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
9
Affichages
404
Réponses
4
Affichages
580
Réponses
5
Affichages
704
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
10
Affichages
531
Réponses
4
Affichages
671
Retour