Case à cocher Excel (non-booléenne)

Résolu
Bonjour,

Je dois effectuer un travail sur Excel qui nécessite des cases à cocher avec macro mais qui présentent plus de deux état. Je m'explique : j'aimerai que quand l'on clique une fois dessus, la case soit cocher normalement (par exemple) et que en re-cliquant dessus, plutôt que de retourner à son état de base, celle-ci affiche un point, ou une croix, etc... puis, en cliquant une troisième fois, celle-ci soit décochée.

Merci d'avance !

5 réponses

  1. Contributeur
    Bonjour,

    si tu prends une case à cocher ActiveX tu peux mettre sa propriété TripleState à True.
    Tu auras : non coché, coché grisé, coché.
    eric
    1
    1. Merci pour ton aide. Ca m'a beaucoup avancé mais malgré cela je trouve que la différence entre les 3 états n'est pas assez flagrante. J'ai donc essayé de changer la police mais je bloque maintenant sur un autre problème. (je le poste à la suite)
      0
  2. Contributeur
    Une case à cocher est booléenne et donc ne peut présenter que 2 états: vrai- faux

    on peut toujours tenter avec un textbox de la forme d'un checkbox ou peut-^tre avec la linkedcell du checkbox
    0
    1. Merci pour ton aide ! mais je vais essayer avec la méthode d'Eric.
      0
  3. Re-bonjour à tous !

    Suite à la réponse d'Eric, j'ai pu trouver une checkbox à trois états mais je trouve que ceux-ci ne sont pas assez différenciable. En effet le but est d'avoir un changement qui soit plus visible qu'une croix grisé de façon à ce que l'opérateur puisse voir la différence assez facilement. J'ai donc pensé à une nouvelle chose c'est de garder l'idée de la TripleState checkbox mais de changer la police en fonction de la valeur que prend la checkbox. Seulement voilà : j'ai trouvé pas mal de chose sur internet qui m'ont fait arriver ici :

    __________________________________________________________
    Private Sub CheckBox1_Click()

    If CheckBox1.Value = True Then
    With ActiveSheet.CheckBox1
    .Font.Name = "Times New Roman"
    .Font.Size = 14

    ElseIf CheckBox1.Value = False Then
    With ActiveSheet.CheckBox1
    .Font.Name = "Calibri"
    .Font.Size = 11
    End With

    ElseIf CheckBox1.Value = Null Then

    With ActiveSheet.CheckBox1
    .Font.Name = "Calibri"
    .Font.Size = 24
    End With

    End If

    End Sub
    __________________________________________________________

    Malheureusement, la valeur 'Null' (case grisé) n'est pas reconnu et la police s'affiche de la même manière que dans le cas de la case décoché.

    J'ai déjà essayé :
    - de simplement laisser "Else" dans la 3ème condition
    - de mettre la valeur différent de 'True' et différente de 'False' dans la 3ème condition

    Voilà voilà ! C'est la première fois que je fais du vba c'est donc un mix de ce que j'ai trouvé sur internet et que j'ai pensé juste.
    Merci pour votre aide !

    A bientôt!
    0
    1. Je viens de tomber sur ça :
      ________________________________________
      Private Sub CheckBox1_Change()
      If IsNull(CheckBox1.Value) Then
      CheckBox1.Caption = "Value is Null"
      ElseIf CheckBox1.Value = False Then
      CheckBox1.Caption = "Value is False"
      ElseIf CheckBox1.Value = True Then
      CheckBox1.Caption = "Value is True"
      End If
      End Sub _______________________________

      J'ai donc remplacer par l'expression "IsNull()" mais rien ne change.
      0
    2. Hello,
      Ayant déjà bien avancé dans l'apprentissage du VBA je ne suis aussi qu'un débutant.
      Cette histoire de triple state checkbox est un peu compliqué pour moi, mais je propose on ne sait jamais. Au lieu d'utiliser l'event "click" de la checkbox, pourquoi ne pas utiliser l'event "Change" :

      Private Sub CheckBox1_Change()
      
      End Sub


      Si j'ai bien compris son fonctionnement, le code se lancera au changement de statut de la checkbox
      0
    3. Je viens de voir, et je pense que tu n'as pas fait attention aussi puisque tu ne le précises pas, mais un coup tu utilises l'event Click et un coup l'event Change. As-tu essayé avec :

      Private Sub CheckBox1_Change()
      If IsNull(CheckBox1.Value) Then 
        With ActiveSheet.CheckBox1 
          .Font.Name = "Calibri" 
          .Font.Size = 24 
        End With
      
      ElseIf CheckBox1.Value = False Then 
        With ActiveSheet.CheckBox1 
          .Font.Name = "Calibri" 
          .Font.Size = 11 
        End With 
      
      ElseIf CheckBox1.Value = True Then 
        With ActiveSheet.CheckBox1 
          .Font.Name = "Times New Roman" 
          .Font.Size = 14
        End With 
      
      End If 
      
      End Sub


      Il te manque un End With d'ailleurs. Le premier.

      EDIT : J'ai changé = Null par IsNull
      0
    4. Effectivement j'ai retirer le premier End With en modifiant le programme pour le poster ici mais il apparait bien sur le code.
      J'ai essayer ton code et... CA MARCHE ! Merci énormément j'y suis depuis 3heures et effectivement il fallait changer d'event ^^
      Merci encore, bonne journée !
      0
  4. Merci à tous pour vos réponses, j'ai finalement réussi avec l'aide de Jauster !
    0
    1. Contributeur
      Bonjour,

      perso je trouve bizarre de jouer sur la taille du texte.
      Pourquoi ne pas changer la couleur du texte ou du fond ?
      eric
      0
      1. Re-bonjour,
        En fait j'ai déjà un code couleur défini pour le fond et/ou le cadre puisque je dois définir des niveaux de maintenance sur certaines pièces à partir du schéma d'un montage hydraulique. Le problème est donc que je ne peux pas vraiment changer le fond et le cadre puisque ceux-ci sont de couleur prédéfini.
        Je vais bien sûr changer la couleur du texte et pas seulement modifié la taille (ce que j'ai envoyé comme partie de code n'était qu'une ébauche pour savoir si c'était réalisable et si je m'engageais sur cette voie là.)

        Bonne journée

        Julien
        0