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 :

Attribution de variable à des checkbox [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : amateur
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2019
    Messages : 5
    Par défaut Attribution de variable à des checkbox
    Bonjour à la communauté. c'est ma première demande d'aide qui vous est acheminé.


    VBA excel Pour quelle raison mon programme exécuté en mode pas à pas fonctionne bien et en temps réel ne fonctionne pas bien.
    Le rafraîchissement des checkbox n'est pas effectué en temps réel alors qu'il l'est en mode pas à pas?
    Le programme interroge une base de donnée et sauve l'info dans des variables matriciels. l'info est bien sauvegardé dans les variables. Les valeurs affectées aux checkbox ne passent pas lorsque le programme roule en temps réelle alors que les cellules le sont.

    Merci d'avance pour le support.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
            For I = 0 To K - J
                    Range("A2").Value = Nom(I)
                    Range("B2").Value = Prenom(I)
                    Range("A5").Value = Date_insp(I)
                    Range("B5").Value = Modele(I)
                    Range("C5").Value = No_serie(I)
                    Range("D5").Value = Marque(I)
                    Range("E5").Value = Lot(I)
                    Range("F5").Value = Capacite(I)
                    Range("G5").Value = Date_Achat(I)
                    Range("C13").Value = Quinc_Defaut(I)
                    Range("E13").Value = Quinc_correctif(I)
                    Range("C15").Value = Sangle_Defaut(I)
                    Range("E15").Value = Sangle_correctif(I)
                    Range("C17").Value = Couture_Defaut(I)
                    Range("E17").Value = Couture_correctif(I)
                    Range("C19").Value = Etiq_Defaut(I)
                    Range("E19").Value = Etiq_correctif(I)
                    Range("C21").Value = Autre_Defaut(I)
                    Range("E21").Value = Autre_correctif(I)
                    Range("E27").Value = Inspecteur(I)
                    Range("C24").Value = Commentaire(I)
                    CheckBox1.Value = QuincAccept(I)
                    CheckBox2.Value = QuincRejet(I)
                    CheckBox3.Value = QuincNA(I)
                    CheckBox4.Value = SanglesAccept(I)
                    CheckBox5.Value = SanglesRejet(I)
                    CheckBox6.Value = SanglesNA(I)
                    CheckBox7.Value = CouturesAccept(I)
                    CheckBox8.Value = CouturesRejet(I)
                    CheckBox9.Value = CouturesNA(I)
                    CheckBox10.Value = EtiqAccept(I)
                    CheckBox11.Value = EtiqRejet(I)
                    CheckBox12.Value = EtiqNA(I)
                    CheckBox13.Value = AutreAccept(I)
                    CheckBox14.Value = AutreRejet(I)
                    CheckBox15.Value = AutreNA(I)
     
               If I = K - J Then
                    L = 1
                        For L = 1 To 15
                            ActiveSheet.OLEObjects("CheckBox" & L).Object.Value = False
                        Next L
                    Exit Sub
               Else
                ActiveSheet.PrintPreview
               End If
     
            Next I

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Pour quelle raison mon programme exécuté en mode pas à pas fonctionne bien et en temps réel ne fonctionne pas bien.
    Parce que vous êtes beaucoup plus lent que le microprocesseur de votre PC.

    mettez DoEvents après le remplissage de la dernière ChekBox (juste avant le If I = K - J Then) et essayez.

    DoEvents va permettre de laisser finir les tâches précédentes avant de passer à la boucle suivante.

    Cdlt

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    est inutile avant une boucle for, L prendra la valeur de la 1ère borne quoi qu'il arrive.

    Pour la remise à false des checkbox, il faut la sortir de la boucle For

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'On boucle pour faire le publipostage
    For I = 0 To K - J
    '....
    Next
     
    'On boucle sur les checkbox
    For L = 1 To 15
          ActiveSheet.OLEObjects("CheckBox" & L).Object.Value = False
    Next L
    Un conseil, il est fortement recommander de renommer les contrôles, ça rend le code plus lisible et bien plus facile à entretenir/débugger par la suite. (Bien que je comprends dans le contexte de votre code que vous souhaitiez garder une racine commune "CheckBox" et un numéro d'ordre, garder "CheckBox" n'est pas parlant et risque de générer des problèmes en cas de suppression de checkbox.
    Peut-être devriez vous nous en dire un peu plus sur le code global, il y a peut-être des simplifications à réaliser.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : amateur
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2019
    Messages : 5
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Excusez pour le délai mais malheureusement ça ne fonctionne pas.

    Citation Envoyé par Qwazerty Voir le message

    Merci pour ton aide ! Effectivement la fonction DoEvents a réglé mon problème. Par contre il a fallu que je l'implante pour chaque checkbox.
    Merci encore pour l'info. Je n'aurais jamais pu trouver cette fonction seul.

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    C'est ARTURO83 qui t'a guidé vers le DoEvents.

    Par contre pourrais-tu mettre ton code modifé, il n'y a pas de raison pour que DoEvents soit nécessaire aussi souvent à mon avis.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : amateur
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2019
    Messages : 5
    Par défaut
    C'est peu étégant mais ça fait le travail.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
            For I = 0 To K - J
                    Range("A2").Value = Nom(I)
                    Range("B2").Value = Prenom(I)
                    Range("A5").Value = Date_insp(I)
                    Range("B5").Value = Modele(I)
                    Range("C5").Value = No_serie(I)
                    Range("D5").Value = Marque(I)
                    Range("E5").Value = Lot(I)
                    Range("F5").Value = Capacite(I)
                    Range("G5").Value = Date_Achat(I)
                    Range("C13").Value = Quinc_Defaut(I)
                    Range("E13").Value = Quinc_correctif(I)
                    Range("C15").Value = Sangle_Defaut(I)
                    Range("E15").Value = Sangle_correctif(I)
                    Range("C17").Value = Couture_Defaut(I)
                    Range("E17").Value = Couture_correctif(I)
                    Range("C19").Value = Etiq_Defaut(I)
                    Range("E19").Value = Etiq_correctif(I)
                    Range("C21").Value = Autre_Defaut(I)
                    Range("E21").Value = Autre_correctif(I)
                    Range("E27").Value = Inspecteur(I)
                    Range("C24").Value = Commentaire(I)
                    CheckBox1.Value = QuincAccept(I)
                    DoEvents 'DoEvents donne le temps à l'objet de prendre sa valeur
                    CheckBox2.Value = QuincRejet(I)
                    DoEvents
                    CheckBox3.Value = QuincNA(I)
                    DoEvents
                    CheckBox4.Value = SanglesAccept(I)
                    DoEvents
                    CheckBox5.Value = SanglesRejet(I)
                    DoEvents
                    CheckBox6.Value = SanglesNA(I)
                    DoEvents
                    CheckBox7.Value = CouturesAccept(I)
                    DoEvents
                    CheckBox8.Value = CouturesRejet(I)
                    DoEvents
                    CheckBox9.Value = CouturesNA(I)
                    DoEvents
                    CheckBox10.Value = EtiqAccept(I)
                    DoEvents
                    CheckBox11.Value = EtiqRejet(I)
                    DoEvents
                    CheckBox12.Value = EtiqNA(I)
                    DoEvents
                    CheckBox13.Value = AutreAccept(I)
                    DoEvents
                    CheckBox14.Value = AutreRejet(I)
                    DoEvents
                    CheckBox15.Value = AutreNA(I)
     
               If I = K - J Then
                        For L = 1 To 15
                            ActiveSheet.OLEObjects("CheckBox" & L).Object.Value = False
                        Next L
                    Exit Sub
               Else
     
                ActiveSheet.PrintPreview
     
               End If
     
            Next I

    Merci encore.

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Tel que ton code est fait, tu n'imprimes ps la feuille contenant I = K-J
    Le DoEvents devrait être placé en dessous de la dernière modification de case à cocher
    Le RAZ n'a rien à faire dans la boucle For

    Les modifications:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    For I = 0 To K - J
        Range("A2").Value = Nom(I)
        Range("B2").Value = Prenom(I)
        Range("A5").Value = Date_insp(I)
        Range("B5").Value = Modele(I)
        Range("C5").Value = No_serie(I)
        Range("D5").Value = Marque(I)
        Range("E5").Value = Lot(I)
        Range("F5").Value = Capacite(I)
        Range("G5").Value = Date_Achat(I)
        Range("C13").Value = Quinc_Defaut(I)
        Range("E13").Value = Quinc_correctif(I)
        Range("C15").Value = Sangle_Defaut(I)
        Range("E15").Value = Sangle_correctif(I)
        Range("C17").Value = Couture_Defaut(I)
        Range("E17").Value = Couture_correctif(I)
        Range("C19").Value = Etiq_Defaut(I)
        Range("E19").Value = Etiq_correctif(I)
        Range("C21").Value = Autre_Defaut(I)
        Range("E21").Value = Autre_correctif(I)
        Range("E27").Value = Inspecteur(I)
        Range("C24").Value = Commentaire(I)
        CheckBox1.Value = QuincAccept(I)
        DoEvents 'DoEvents donne le temps à l'objet de prendre sa valeur
        CheckBox2.Value = QuincRejet(I)
        DoEvents
        CheckBox3.Value = QuincNA(I)
        DoEvents
        CheckBox4.Value = SanglesAccept(I)
        DoEvents
        CheckBox5.Value = SanglesRejet(I)
        DoEvents
        CheckBox6.Value = SanglesNA(I)
        DoEvents
        CheckBox7.Value = CouturesAccept(I)
        DoEvents
        CheckBox8.Value = CouturesRejet(I)
        DoEvents
        CheckBox9.Value = CouturesNA(I)
        DoEvents
        CheckBox10.Value = EtiqAccept(I)
        DoEvents
        CheckBox11.Value = EtiqRejet(I)
        DoEvents
        CheckBox12.Value = EtiqNA(I)
        DoEvents
        CheckBox13.Value = AutreAccept(I)
        DoEvents
        CheckBox14.Value = AutreRejet(I)
        DoEvents
        CheckBox15.Value = AutreNA(I)
     
        'Perso j'aurais mis le doevent uniquement ici
        DoEvents
     
        'On imprime la feuille
        ActiveSheet.PrintPreview
    Next
     
    'On fait un RAZ
    For L = 1 To 15
        ActiveSheet.OLEObjects("CheckBox" & L).Object.Value = False
    Next L
    Je n'insisterais pas de plus mais à mon avis la structure du fichier pourrait sans doute être améliorée.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : amateur
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2019
    Messages : 5
    Par défaut
    Lorsque j'ai placé la commande à cet endroit ça ne marchait pas. Tu as raison c'est plus logique d'imprimer à la fin de la boucle.
    C'est très intéressant d'échanger sur le sujet. J'apprécie beaucoup. Pour ce qui est du reste du code pour l'instant ça fonctionne.
    Dans le temps je vais tenter de raffiner mon code. C'est tout de même un assez gros projet pour un débutant. Entrée de donnée via un userform, interrogation d'une base de donnée avec modification et création de rapport. Je joints mon fichier si tu veux examiner. Merci de ton temps.
    Fichiers attachés Fichiers attachés

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Si je peux me permettre, je te propose une structure un peu plus robuste du code et qui t'économisera bien des lignes de code.
    Je n'ai fait que la partie affichage, le principe est le même pour l'enregistrement des données.
    Tu pourras trouver d'autres sujet sur le forum qui traite de l'affichage et de l'enregistrement, si tu fais une recherche en utilisant le pseudo de Pierre Fauconnier et/ou le mien, je suis sûr d'avoir participer avec lui sur ce style de sujet. D'ailleurs, il irait encore plus loin que ce que j'ai fait en externalisant les fonctions .

    Sur le principe, j'utilise la propriété Tag des contrôles. C'est une propriété où tu peux inscrire ce que tu veux. Ici j'y place le nom de la colonne qui correspond au contrôle dans la base de données. Puis avec une simple boucle sur le composant, je vais chercher les données pour une ligne donnée.

    J'ai désactivé la mise à jour en temps réel quand l'utilisateur modifie un contrôle du userform. Il manque donc un bouton "Enregistrer" qui inscrit les données dans la feuille Excel, pour le code, c'est à peu de choses près une copie de la boucle contenue dans AfficherLigne.

    Je te laisse regarder et me dire si tu as des questions. Le code est commenté mais si tu as besoin de plus d'info, dis moi.

    ++
    Qwaz
    Fichiers attachés Fichiers attachés

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : amateur
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2019
    Messages : 5
    Par défaut
    Amateur vs PRO. Des heures de plaisir à décortiquer ce que tu as fait. Merci. Il se pourrais que je recommunique lorsque j'analyse en profondeur.

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

Discussions similaires

  1. [WD14] Problème d'accès natif avec des checkboxes
    Par Baboulinet_ dans le forum WinDev
    Réponses: 8
    Dernier message: 04/02/2013, 09h05
  2. ajouter une partie variable à des checkbox
    Par koeuf dans le forum Général VBA
    Réponses: 2
    Dernier message: 18/06/2011, 14h46
  3. [Tableaux] Problème de foreach avec des checkboxes
    Par nanor21 dans le forum Langage
    Réponses: 10
    Dernier message: 15/05/2006, 01h04
  4. Problème simple avec des checkbox
    Par nanor21 dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2006, 00h26
  5. Problème d'attribut de lecture seule sur des dossiers
    Par Redbull dans le forum Sécurité
    Réponses: 2
    Dernier message: 09/08/2005, 09h52

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