Conserver la même checkbox sur toutes les lignes

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 !

siocnarf

XLDnaute Occasionnel
Bonjour,

Je suis à créer un classeur avec plusieurs checkbox sur une même ligne. J'associe des VBA à ces checkbox afin que des valeurs soient associés en fonction que la checkbox est coché ou pas.

Ma problématique est que chaque ligne correspond à un incident. Donc au fur et à mesure que de nouveaux incidents sont créés, je veux réutiliser les checkbox de la ligne précédent.

1. Comment aisément copier tous les checkbox d'une ligne sur la ligne du dessous?
2. Comment réutiliser les checkbox d'une ligne à l'autre?
3. Y-a-t-il une manière de décocher tous les checkbox d'un classeur d'un coup?

Code:
Private Sub CheckBox1_Click()
With ActiveSheet.Shapes("Checkbox1").TopLeftCell
    nligne = .Row
    ncolonne = .Column
    sAddresse = .Address
End With
'Valeur de la réponse quand la case est cochée
nvaleur = 20
'Colonne à côté signifie +1 ou 1
nemplacementvaleur = 1
Call setvaleur(nligne, ncolonne, nvaleur, nemplacementvaleur)
End Sub

Private Sub setvaleur(S_nligne, S_ncolonne, S_nvaleur, S_nemplacementvaleur)
S_celloutput = Cells(S_nligne, S_ncolonne + S_nemplacementvaleur).Address
'(RowAbsolute:=False, ColumnAbsolute:=False)
If CheckBox1.Value = True Then Range(S_celloutput).Value = S_nvaleur
If CheckBox1.Value = False Then Range("C4").Value = 0
End Sub

En pièce jointe un exemple de fichier avec les cases à cocher.

Merci pour votre aide,

François Racine
 

Pièces jointes

Re : Conserver la même checkbox sur toutes les lignes

Bonsoir siocnarf,

Je préfère utiliser à la place des checkbox des caractères de remplacement affublés de la police WingDings. Le caractère de code 111 représente une case non cochée et le caractère de code 254 représente une case cochée.

Pour cocher/décocher une case, on utilise le double-clique sur la cellule (qu'on pourrait remplacer par le clique droit)

Le code pour cocher/décocher une case se trouve dans le module de code de la feuille "Feuil1". Il permet de cocher ou décocher une case ainsi que d'entreprendre les actions induites.

Le module "Module2" comporte une procédure ajouter_incident qui permet d'ajouter un incident. Cette procédure est déclenchée quand on clique sur le bouton "insérer Incident" sur la feuille "Feuil1".

Le code dans le module de "Feuil1":
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Target.Font.Name = "Wingdings" Then
  'on passe de coché à décoché et vice-versa
  Target = IIf(Target = Chr(PasCoche), Chr(Coche), Chr(PasCoche))
  Cancel = True
  Select Case Target.Column
    ' si colonne B
    Case Range("B1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    ' si colonne D
    Case Range("D1").Column
       If Target = Chr(Coche) Then MsgBox ("Aller porter plainte")
    ' si colonne E
    Case Range("E1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), "Pas bien", "")
    ' si colonne G
    Case Range("G1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), "tête de linotte", "")
  End Select
End If

End Sub

Le code d'insertion d'un incident dans module2:
VB:
Option Explicit

Public Const PasCoche = 111
Public Const Coche = 254

Sub ajouter_incident()
Dim xrg As Range

With Sheets("Feuil1")
  Set xrg = .Range("A" & Rows.Count).End(xlUp)
  xrg.Resize(1, 8).Copy xrg.Offset(1)
  xrg.Offset(1, 0) = xrg + 1
  xrg.Offset(1, 1) = Chr(PasCoche)
  xrg.Offset(1, 2) = ""
  xrg.Offset(1, 3) = Chr(PasCoche)
  xrg.Offset(1, 4) = Chr(PasCoche)
  xrg.Offset(1, 5) = ""
  xrg.Offset(1, 6) = Chr(PasCoche)
  xrg.Offset(1, 7) = ""
  xrg.Offset(1).EntireRow.RowHeight = xrg.EntireRow.RowHeight
End With

End Sub

nota: Voir fichier v2 (avec option raz et une petite correction du v1) dans message suivant #3
 
Dernière édition:
Re : Conserver la même checkbox sur toutes les lignes

(re) Bonsoir siocnarf,

Avec l'option de RAZ de toutes les Checkbox + une correction du précédent fichier.

Le code de la procédure raz dans module2:
VB:
Sub raz()
Dim xrg As Range

If MsgBox("Etes vous certain de vouloir décocher toutes les checkBox ?", _
    Buttons:=vbDefaultButton2 + vbYesNo + vbQuestion) = vbYes Then
  With Sheets("Feuil1")
    Set xrg = .Range("A" & Rows.Count).End(xlUp)
    Set xrg = .Range(.Range("A4"), xrg)
    xrg.Offset(0, 1) = Chr(PasCoche)
    xrg.Offset(0, 2) = ""
    xrg.Offset(0, 3) = Chr(PasCoche)
    xrg.Offset(0, 4) = Chr(PasCoche)
    xrg.Offset(0, 5) = ""
    xrg.Offset(0, 6) = Chr(PasCoche)
    xrg.Offset(0, 7) = ""
  End With
End If
End Sub
 

Pièces jointes

Re : Conserver la même checkbox sur toutes les lignes

Bonjour siocnarf,

L'instruction qui coche/décoche se trouve dans la macro évènementielle Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean).

On regarde d'abord si la cellule sur laquelle on a double-cliqué (Target) est en police Wingdings
If Target.Font.Name = "Wingdings" Then

Si oui alors on change l'état de la cellule par l'instruction:
Target = IIf(Target = Chr(PasCoche), Chr(Coche), Chr(PasCoche)) qui peut s'interpréter comme suit:

Si Target est égal au caractère Chr(PasCoche) alors on place dans Target le caractère Chr(Coche) sinon on y place le caractère Chr(PasCoche).

Ensuite, en fonction de la colonne de Target, via le select (Select Case Target.Column... End Select), on fait ce qui est à faire selon le nouvel état de Target (coché ou non).
 
Re : Conserver la même checkbox sur toutes les lignes

Bonjour,

Je me permets de vous relancer. Votre macro fonctionne très bien mais cela m'amène une problématique.
Cela fait un case extrèmement long et si j'ajoute une colonne alors toute la numérotation est à recorriger. Comment pourrais-je contourner ce problème?

Code:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Target.Font.Name = "Wingdings" Then
  'on passe de coché à décoché et vice-versa
  Target = IIf(Target = Chr(PasCoche), Chr(Coche), Chr(PasCoche))
  Cancel = True
  Select Case Target.Column
    Case Range("B1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("D1").Column
       ' Colonne D - Vol
       'If Target = Chr(Coche) Then MsgBox ("Aller porter plainte")
       Target.Offset(0, 1) = IIf(Target = Chr(Coche), 15, "")
    Case Range("F1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 10, "")
    Case Range("H1").Column
        'Colonne H - Perte
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 10, "")
    Case Range("K1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("M1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 10, "")
    Case Range("O1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 5, "")
    Case Range("R1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("T1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("V1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("X1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("Z1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("AB1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("AE1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), -100, "")
    Case Range("AG1").Column
        'Colonne AG -  100 et plus
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("AI1").Column
        'Colonne AI -  De 11 à 100
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 10, "")
    Case Range("AK1").Column
        'Colonne AK -  De 1 à 10
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 5, "")
    Case Range("AN1").Column
        'Colonne AN -  100 et plus
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 20, "")
    Case Range("AP1").Column
        'Colonne AP -  De 11 à 100
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 10, "")
    Case Range("AR1").Column
        'Colonne AR -  De 1 à 10
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), 5, "")
    Case Range("AU1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), -215, "")
   Case Range("AW1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), -25, "")
   Case Range("AY1").Column
      Target.Offset(0, 1) = IIf(Target = Chr(Coche), -20, "")

  End Select
End If

End Sub

Merci,

François
 
- 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
13
Affichages
573
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
488
Réponses
2
Affichages
515
Retour