Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

pat66

XLDnaute Impliqué
Bonjour Job

merci pour ton aide

cela fonctionne bien, je coche la checkbox 6 cela décoche checkbox 7, mais si la checkbox 6 est cochée et que je clique sur la checkbox7 les 2 restent cochées, mais en plus cela n'écrit pas forcément dans BDD ?
 

pat66

XLDnaute Impliqué
oui bien sur, mais cela n'écrit pas dans la "N2"

Sub CheckBox6_Click()
Sheets("BDD").Range("N2") = IIf(CheckBox6, "Oui", "Non")
CheckBox7 = Not CheckBox6
End Sub

Sub CheckBox7_Click()
Sheets("BDD").Range("N2") = IIf(CheckBox7, "Oui", "Non")
CheckBox6 = Not CheckBox7
End Sub
 

pat66

XLDnaute Impliqué
Bonjour Job75
Pourriez vous me dire comment prodécer dans le cas où l'on a 3 checkbox, mon souhait si je coche une checkbox cela décoche les 2 autres, et pour être très précis, je souhaite que si
Checkbox8 est cochée E60 = Avant
Checkbox9 est cochée E60 = Arrière
Checkbox10 est cochée E60 = Avant/Arrière

merci beaucoup
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour pat66, job75,

un essai :

VB:
Sub CheckBox8_Click()
  CheckBox9 = 0: CheckBox10 = 0: [E60] = "Avant"
End Sub

Sub CheckBox9_Click()
  CheckBox8 = 0: CheckBox10 = 0: [E60] = "Arrière"
End Sub

Sub CheckBox10_Click()
  CheckBox8 = 0: CheckBox9 = 0: [E60] = "Avant/Arrière"
End Sub

attention : si E60 est sur la feuille "BDD", mettre :

[BDD!E60] au lieu de [E60]

soan
 

pat66

XLDnaute Impliqué
Bonjour Soan,

Merci cela fonctionne, mais j'ai juste un souci, est ce qu'on peut éviter de devoir cliquer 2 fois pour cocher une autre checkbox car en l'état si une checkbox est cochée, le premier clic la décoche et il faut un 2ième clic pour recocher une chckbox

L'idéal serait qu'avec un clic cela coche la checkbox choisit et décoche les autres ?

merci
 

soan

XLDnaute Barbatruc
Inactif
@pat66

j'viens d'lire ton nouveau post, mais j'comprends pas :

normalement, avec le code VBA de mon post #9, si tu coches une CheckBox, alors les 2 autres sont décochées automatiquement ! attention : vérifie bien attentivement les numéros des CheckBox ! peut-être que tu as fait un copier/coller d'une des 3 subs sans ajuster ensuite ce numéro ?

si avec ces infos tu arrives à résoudre ton problème : ok ; sinon, difficile de t'aider davantage sans un fichier exemple (si y'a des données confidentielles, remplace-les par des données fictives).​

soan
 

job75

XLDnaute Barbatruc
Bonjour pat66, soan, dyso,

Si les CheckBoxes sont dans une feuille de calcul placez ces macros dans le code de cette feuille :
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
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)
flag = True
Me.OLEObjects(Application.Index(a, j)).Object = Not CB
Me.OLEObjects(Application.Index(a, k)).Object = 0
flag = False
[E60] = Application.Index(b, IIf(CB, i, j))
End Sub
Le cochage se fait par permutation circulaire, on pourrait le faire autrement.

A+
 

job75

XLDnaute Barbatruc
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] = Application.Index(b, IIf(CB, i, j))
End Sub
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…