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 :

Aide pour une macro qui donne un résultat inattendu


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Aide pour une macro qui donne un résultat inattendu
    J'ai écrit une macro ultra-simple pour accompagner mon apprentissage de débutant.
    Elle balaye un tableau comportant une simple colonne de mots et affiche la mot lu dans la 1re boîte de texte (la 2e boîte est pour l'instant inutilisée) d'un formulaire qui comporte aussi 2 boutons de commande pour "continue"r ou "arrêter"; à la fin du balayage ou bien si le bouton "arrêter" a été actionné, la macro affiche le nombre de mots traités.
    Je ne comprends pas pourquoi, lorsque je lance la macro, seul le dernier mot du tableau s'affiche immédiatement et aucun bouton ne produit d'effet lorsqu'on l'actionne.
    Voici le 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
      Sub Macro1()
    '
    ' Macro1 Macro
    ' Macro enregistrée le 21/03/2023 par Gérard
    '
    ' Déclaration des variables
    Dim Question, Bilan As String
    Dim i, Compteur As Integer
    '
    ' Affichage du formulaire en modal
    UserForm1.Show 0
    Compteur = 0
    ' Boucle
    For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
        Question = Cells(i, 1).Value
        UserForm1.TextBox1 = Question
        If UserForm1.Tag = "Arreter" Then
            Exit For
        End If
        Compteur = Compteur + 1
    Next i
    ' Fin
        Bilan = CStr(Compteur) & " mots ont été traités"
        UserForm1.TextBox3 = Bilan
    '
    End Sub
     
    '
    '
    '
     
    Private Sub UserForm_Initialize()
        Me.StartUpPosition = 2
        i = 0
    End Sub
    Private Sub CommandButton1_Click()
        Me.Tag = "Continuer"
    End Sub
    Private Sub CommandButton2_Click()
        Me.Tag = "Arreter"
    End Sub]
    Je joins également le fichier que j'ai créé sous Excel 2003.
    Je remercie par avance qui voudra bient éclairer ma lanterne.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonsoir,

    Je ne comprends pas pourquoi, lorsque je lance la macro, seul le dernier mot du tableau s'affiche immédiatement
    Il s'affiche car tu exécutes ta macro qui balaie ta base jusqu'au dernier.

    aucun bouton ne produit d'effet lorsqu'on l'actionne.
    Comme ils n'ont aucun code mis à part le positionnement du tag qui ne se voie pas il ne peut y avoir aucun effet.

    C'est la découverte et pour que tu vois le cheminement, je t'invite à dérouler tes procédures en pas à pas avec la touche F8 pour en comprendre le fonctionnement.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 115
    Points : 1 638
    Points
    1 638
    Par défaut
    De plus,
    A chaque tour de boucle, tu écrase les valeur de la boucle précédente, donc quand on arrive à la fin, on a que les dernières valeurs.

    Si tu veux afficher plusieurs valeurs dans ton formulaire, c'est un contrôle ListBox qu'il te faut (et non un Textbox).

    Enfin, il n'y a quasiment aucune chance que la boucle puisse être interrompue en plein milieux via un click sur un bouton, le code va tout simplement trop vite.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Merci
    J'ai compris pourqooi je ne vois que le dernier contenu de ma liste et je vais chercher comment faire fonctionner les boutons.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour

    Accessoirement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Question, Bilan As String
    Dim i, Compteur As Integer
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Question as Variant, Bilan As String
    Dim i as Variant, Compteur As Integer
    Je pense que tu voulais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Question as String, Bilan As String
    Dim i as Integer, Compteur As Integer
    Par ailleurs dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub UserForm_Initialize()
        Me.StartUpPosition = 2
        i = 0
    End Sub
    i=0 ne sert à rien puisqu'il met 0 dans une variable i locale au sub, qui disparait dès le end sub qui suit, et qui n'a rien à voir avec la variable i utilisée dans Macro1. Si tu veux que i ait une portée globale, il faut la définir au niveau du form.
    Pour éviter ce genre d'erreur, ajoute un Option Explicit en tête de module, et déclare systématiquement tes variables.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 115
    Points : 1 638
    Points
    1 638
    Par défaut
    Le meilleur moyen de se prémunir contre ce genre d'etourderie est encore la directive Option Explicit, et de configurer l'IDE pour qu'il l'ajoute par défaut.

    Ne lui introduisons pas les variables globales, ça fait déjà assez de ravages avec les programmeurs confirmés.
    Alors un débutant...

  7. #7
    Membre éprouvé
    Inscrit en
    Décembre 2002
    Messages
    800
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 800
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par erbou Voir le message
    J'ai compris pourqooi je ne vois que le dernier contenu de ma liste et je vais chercher comment faire fonctionner les boutons.
    j'ai mis le code dans l'évènement click du bouton, comme ça il affiche un nom à la fois et pas toute la liste pour t'afficher seulement le dernier. J'espère que ça t'aidera.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public i As Integer
     
    Private Sub CommandButton1_Click()
        i = i + 1
        If i > Sheets("Dico").Cells(Rows.Count, 1).End(xlUp).Row - 1 Then
            i = Sheets("Dico").Cells(Rows.Count, 1).End(xlUp).Row - 1
        End If
        TextBox1.Text = Sheets("Dico").Cells(i + 1, 1).Value
    End Sub
     
    Private Sub UserForm_Initialize()
        i = 1
        TextBox1.Text = Sheets("Dico").Cells(2, 1).Value
    End Sub

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/11/2017, 16h22
  2. Réponses: 5
    Dernier message: 18/02/2017, 22h58
  3. Réponses: 0
    Dernier message: 15/04/2014, 12h04
  4. Réponses: 15
    Dernier message: 26/03/2006, 12h10
  5. [VBA] Excell : demande d'aide pour une macro
    Par Fealendril dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/01/2006, 16h28

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