IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Modification ".Caption" (ou ".Texte") d'une CheckBox suite à son activation [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Modification ".Caption" (ou ".Texte") d'une CheckBox suite à son activation
    Bonjour,

    Dans le cadre de mes études, j'ai voulu créer un tableau excel qui renseigne sur le nombre de fois que j'ai récité un cours grâce à des CheckBox notamment avec une indication de la date associée à cette "couche" d'apprentissage.

    Je souhaiterai modifier le texte (mettre une date) d'une CheckBox lorsque celle-ci est cochée (une fois coché, ".Texte" contient la date actuelle). J'ai déjà créé un code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub CheckBox_Dated():
     
      Dim Current_Date As Date
      Dim ChkBx As CheckBox
      Dim Current_Date_String As String
     
      Current_Date = Date
      Current_Date_String = Format(Current_Date, "dd/mm/yyyy")
      If Worksheets("Feuil1").Activate Then
        For Each ChkBx In ActiveSheet.CheckBoxes
        If ChkBx.Value = 1 Then
          ChkBx.Text = Current_Date_String
        Else
          ChkBx.Text = ""
        End If
      Next
    End If
    End Sub
    Le problème de ce code est qu'il modifie le texte de tout les CheckBox activées donc on perte les informations relatives des CheckBox ayant été déjà cocher précédemment (date antérieur). Je comprend très bien pourquoi. Le problème est que je ne trouve pas de propriété de Checkbox qui permet de dire si cette dernière vient d'être cochée ou quelque chose qui permet cela.

    Je me document énormément sur ce lien : https://msdn.microsoft.com/fr-fr/lib...roperties.aspx.

    J'ai appris l'existence d’événement comme par exemple "Checkbox.CheckedChanged". Cependant, je n'arrive pas à maîtriser ces notions malgré les informations données par le site de Microsoft. Et je ne sait pas si elles peuvent régler mon problème.
    J'ai débuter VBA d'Excel il y a 1 semaine et j'ai juste des notions de bases en programmation. J'ai étudié les bases Python dans le cadre d'étude en Biologie mais cela m'aide peu. J'espère que vous serez indulgents !

    NB : Fichier en pièce-jointe.
    La fonction suppression n'est pas fonctionnelle dans mon fichier (un autre problème mais secondaire). Le bouton CheckBox créé des CheckBox dans la sélection de cellule faite au curseur. Et Datage est un bouton associé à la macro CheckBox_Dated() = sujet de cette discussion.

    Je vous remercie par avance pour l'attention que vous porterez à mon problème !
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    voir si j'ai bien compris ton soucis
    tu a X checkboxs dont certain ont eu la caption changé en date et tu voudrais que ton code mettent la curent date quand il sont true
    et qu'ils nont pas de date dans la caption
    si c'est ca c'est simple
    ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChkBx.Text = Current_Date_String
    tu la remplace par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not isdate(ChkBx.Text) then ChkBx.Text = Current_Date_String
    apres pour la propriété ".text" entre nous sauf erreur de ma part je suis pas sur !!
    pour les activX c'est ".caption" et pour les controles formulaire c'est ".Characters.Text ="blabla" en passant par la collections(shapes)

    je ne peut pas te dire je ne les utilises pas

    ce qu'il faut retenir c'est ce test "if not isdate(......"

    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je te propose une autre façon de faire !
    Tu lie la macro ci-dessous à tous tes CheckBox et de cette façon, seule celle active sera visée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub Dater()
     
        With ActiveSheet.Shapes(Application.Caller)
     
            If .ControlFormat.Value = 1 Then
                .TextFrame.Characters.Text = Format(Date, "dd/mm/yyyy")
            Else
                'ce que tu veux si non cochée !
            End If
     
        End With
     
    End Sub

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonjour,

    Je te propose une autre façon de faire !
    Tu lie la macro ci-dessous à tous tes CheckBox et de cette façon, seule celle active sera visée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub Dater()
     
        With ActiveSheet.Shapes(Application.Caller)
     
            If .ControlFormat.Value = 1 Then
                .TextFrame.Characters.Text = Format(Date, "dd/mm/yyyy")
            Else
                'ce que tu veux si non cochée !
            End If
     
        End With
     
    End Sub
    bonjour theze
    Le problème de ce code est qu'il modifie le texte de tout les CheckBox activées donc on perte les informations relatives des CheckBox ayant été déjà cocher précédemment (date antérieur). Je comprend très bien pourquoi. Le problème est que je ne trouve pas de propriété de Checkbox qui permet de dire si cette dernière vient d'être cochée ou quelque chose qui permet cela.
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour Robert, Patrick,

    Patrick, Guillaume dit :
    Je souhaiterai modifier le texte (mettre une date) d'une CheckBox lorsque celle-ci est cochée (une fois coché, ".Texte" contient la date actuelle). J'ai déjà créé un code...
    Vu qu'il y a une évolution de 1 à 4 (en fait de 1 à 8 mais seulement 3 à 6 prise en compte dan l'exemple) je pense que la réponse donné est bonne mais attendons la réponse de Guillaume !

    Robert, pour un Shape et principalement pour un CheckBox, coché = 1 non coché = -4146 !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Réponse
    Bonjour à tous !

    Merci pour votre réactivité et votre temps consacré à la résolution de mon problème.

    • Concernant la proposition de Patrick, j'ai intégré cette nouvelle ligne de code mais malheureusement, lors de l'activation de la macro pour dater, toutes les Checkbox de la feuille se voient attribuer une date. Quelles soient cochée ou non.


    • Concernant la proposition de Robert, je n'est pas trop compris la ligne de code proposée mais cela semble intéressant dans la mesure ou je découvre une méthode avec "array". D'après mes bases algorithmiques, j'ai juste compris (à vérifier si j'ai juste, mes connaissances sont limitées) que le ".Texte" de la CheckBox peut prendre la valeur d'un tableau avec deux éléments de type String : soit rien soit la date actuelle. Mais j'ignore ce que signifie "(abs(ChkBx.Value)" accolé à array() et par conséquent l'ensemble de la ligne.


    • Concernant la proposition de Theze, la procédure dater() marche très bien pour une CheckBox. C'est exactement ce que je cherchais ! Je voulais juste souligner une chose étrange, c'est que lorsque j'attribue manuellement cette macro à plusieurs CheckBox (tout une rangée de CheckBox), cela ne fonctionne pas. J'ai l'impression que peut-être une macro peut être associée qu'a un seul objet Je ne saisie pas la source réelle de cette anomalie.
      J'ai une nouvelle demande suite cette voie prometteuse !
      Etant donnée que ma feuille possédera un nombre indéterminé de CheckBox (dépend du nombre de matière dans le contexte), cela serait fastidieux d'attribuer manuellement la macro "Dater()" à l'ensemble des CheckBox (pouvant aller jusqu'à 160 CheckBox)
      Est-il possible d'intégrer dans la procédure (d'un Module) qui créer mes CheckBox, une ligne de code qui permet d'associer à la CheckBox tout juste créée la macro "Dater()" ? Si cela est possible, je aurai un tableur avec toutes les CheckBox déjà prêtes à l'emploi sans lancer :
      - soit une macro qui attribue à tout les CheckBox la macro Dater()
      - soit attribuer manuellement les macro à l'ensemble des Checkbox


    Voici pour information ma procédure de création de mes CheckBox dans une Selection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Option Explicit
     
    Sub Inserer_Cases_a_cocher_Liees()
     
    Dim rngCel As Range
    Dim ChkBx As CheckBox
    Dim CompteurIndex As Long
    Dim CompteurIndexBoucle As Long
     
    For Each rngCel In Selection
        With rngCel.MergeArea.Cells
            If .Resize(1, 1).Address = rngCel.Address Then
                '.NumberFormat = ";;;"
                Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
                With ChkBx
                CompteurIndexBoucle = CompteurIndex + 1
                .Name = "CheckBox" & CompteurIndexBoucle
                .Value = xlOff
                .LinkedCell = rngCel.MergeArea.Cells.Address
                .Text = ""
                End With
            End If
        End With
    Next rngCel
    End Sub
    Merci pour vos retours, je sens qu'on est pas loin de résoudre ce problème !

    PS : mon Tableur mise à jour avec la procédure Dater() associée à 2 CheckBox pour test. En pièce-jointe.
    Fichiers attachés Fichiers attachés

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ChkBx.Text = array("",Current_Date_String)(abs(ChkBx.Value ))
    @Theze true =-1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If ChkBx then
    'If (true=true)=true then un test est vrai ou faut True/False
    Dernière modification par Invité ; 26/06/2018 à 08h09.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Un tableau (array) comme dans l'exemple {array("",Current_Date_String)}
    Peut pendre la valeur 0/1.

    Un booléen comme ChkBx true/false 0/-1; abs(-1) valeur absolue! abs(true) = 1.

    En fait on ne teste pas la ChkBx mais c'est sa valeur absolue true/false qui aiguille le array.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ChkBx.Text = array("",Current_Date_String)(abs(ChkBx.Value ))
    'array("",Current_Date_String)(abs(true))=Current_Date_String

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Concernant la proposition de Theze, la procédure dater() marche très bien pour une CheckBox. C'est exactement ce que je cherchais ! Je voulais juste souligner une chose étrange, c'est que lorsque j'attribue manuellement cette macro à plusieurs CheckBox (tout une rangée de CheckBox), cela ne fonctionne pas. J'ai l'impression que peut-être une macro peut être associée qu'a un seul objet Je ne saisie pas la source réelle de cette anomalie.
    Dans mon premier post, j'ai dis :
    Tu lie la macro ci-dessous à tous tes CheckBox...
    donc, toutes les CheckBox appellent la même procédure "Dater()" et c'est l'utilisation de "Application.Caller" qui permet de cibler la bonne CheckBox !

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut
    Bonjour,

    Citation Envoyé par Theze Voir le message
    Tu lie la macro ci-dessous à tous tes CheckBox... !
    J'ai procédé comme suit pour lier Dater() avec les CheckBox :
    1. Cliquez droit sur la CheckBox, menu déroulant propose "Affecter une Macro" (Ici sélection multiple)
    2. La fenêtre contextuelle Affecter une Macro apparaît.
    3. Selectionnez la Macro voulue (ici Dater)
    4. Cliquez sur OK.


    J'ai sélectionné les CheckBox successivement en maintenant "Ctrl" puis j'ai procédé comme le protocole ci-dessus le stipule.

    Mais toujours un problème lorsque je test directement après avoir lier Dater(). J'ai approfondi la compréhension de cette anomalie. Elle est présenté dans la pièce-jointe pour plus de clarté et d'efficacité avec des Screenshots le tout organisé chronologiquement : 1 à 3.

    Conclusion de cette étude de l'anomalie (pièce-jointe) : il existe une forme de latence entre la liaison des CheckBox à Dater() et leur effectivité. Ce qui explique le fait qu'au début, je voyais que cela ne marchait pas pour un ensemble de Checkbox.
    NOTE NON NEGLIGEABLE : pour UNE CheckBox, cela marche directement après avoir affecter Dater() la CheckBox dite --> hypothèse qui en découle : est-ce ne nombre de CheckBox qui est responsable de cela ? Cela serait étonnant dans la mesure ou ce n'est pas un programme "lourd" de calcul.

    J'espère que la pièce-jointe facilite la compréhension de ce qu'il se passe réellement et de l'hypothèses que j'émet.

    Merci par avance !
    Images attachées Images attachées  

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    je ne sais pas quel problème tu rencontres mais avec ton fichier exemple, 1 --> sélection de toutes les CheckBox 2 --> affectation de la macro (aux 16 CheckBox) et 3 pour tester, clic sur différentes CheckBox, le caption apparaît bien avec la date du jour et s'efface bien au décochage (j'ai ajouter .TextFrame.Characters.Text = "" dans la partie Else)
    Mets toutes les procédures que tu as dans le VBE en commentaire sauf "Dater()" et refais des tests pour voir, il peut peut être y avoir un conflit quelque part sinon, poste ton fichier original et je testerai ça.
    Petite précision, les cases à cocher le sont l'une après l'autre puisque "Application.Caller" donc un seul nom retourné !

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut
    Bonjour,

    Citation Envoyé par Theze Voir le message
    je ne sais pas quel problème tu rencontres mais avec ton fichier exemple, 1 --> sélection de toutes les CheckBox 2 --> affectation de la macro (aux 16 CheckBox) et 3 pour tester, clic sur différentes CheckBox, le caption apparaît bien avec la date du jour et s'efface bien au décochage (j'ai ajouter .TextFrame.Characters.Text = "" dans la partie Else)
    Mets toutes les procédures que tu as dans le VBE en commentaire sauf "Dater()" et refais des tests pour voir, il peut peut être y avoir un conflit quelque part sinon, poste ton fichier original et je testerai ça.
    J'ai supprimé certaines procédures obsolètes et j'ai mis tous les autres procédures en commentaire afin de tester la macro Dater(). Malheureusement, on retrouve encore cette anomalie.
    Comme prévu, vous trouverez posté mon fichier.

    Citation Envoyé par Theze Voir le message
    Petite précision, les cases à cocher le sont l'une après l'autre puisque "Application.Caller" donc un seul nom retourné !
    D'accord ! C'est noté.


    Nous y sommes presque ! Encore merci pour vos retours et votre temps.
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2007] Insérer un texte à partir d'une CheckBox
    Par legab dans le forum Word
    Réponses: 2
    Dernier message: 19/04/2016, 23h32
  2. [FAQ] Les formulaires (partie 2) : Comment désactiver une zone de texte en cochant une checkbox ?
    Par Auteur dans le forum Contributions JavaScript / AJAX
    Réponses: 6
    Dernier message: 17/11/2013, 11h59
  3. [WD-2003] Ajout de texte à partir d'une CheckBox
    Par Betadine dans le forum VBA Word
    Réponses: 6
    Dernier message: 30/05/2011, 17h18
  4. Remplir une zone de texte par rapport à une checkbox
    Par beegees dans le forum Général JavaScript
    Réponses: 43
    Dernier message: 04/09/2006, 17h01
  5. désactivation d'une zone de texte en cochant une checkBox
    Par mjihanne dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 25/05/2006, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo