XL 2019 alterner cochage oui ou non dans checkbox

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] =...

dysorthographie

XLDnaute Accro
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:

job75

XLDnaute Barbatruc
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.
 

pat66

XLDnaute Impliqué
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:

job75

XLDnaute Barbatruc
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+
 

job75

XLDnaute Barbatruc
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

  • Classeur(1).xlsm
    32.4 KB · Affichages: 6

Discussions similaires

Statistiques des forums

Discussions
315 133
Messages
2 116 603
Membres
112 802
dernier inscrit
Dan Marc