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 :

[Question]Barre de progression


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut [Question]Barre de progression
    Bonjour,

    Durant le traitement d'une macro je voudrais mettre une barre de progression pour indiquer à l'utilisateur où il en est.
    D'autre part, ce traitement pouvant être long, je cache le classeur afin d'améliorer la vitesse de ce dernier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False/true
    Lorsque le traitement s'effectue avec le classeur "caché", l'utilisateur de base, va croire que rien ne se passe du fait que le sablier de la souris n'apparait qu'à moitié... De ce fait, certains utilisateurs vont certainement se mettre à cliquer partout pour fermer ça. C'est pour cette raison que je souhaite mettre une barre de progression.

    Mais est-il possible de mettre cette barre en "cachant" le classeur?
    [Edit=je précise] Va t-elle se cacher avec le classeur?

  2. #2
    Membre expérimenté
    Inscrit en
    Février 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 208
    Par défaut
    bonjour

    en me promenant sur certains forums j'avais trouvé ce petit programme qui pourrait peut être te servir : http://cjoint.com/?grsWFc23Ui

    à plus

  3. #3
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Citation Envoyé par Be Cool Voir le message
    Durant le traitement d'une macro je voudrais mettre une barre de progression pour indiquer à l'utilisateur où il en est.
    Bonjour, une première question, quel est le type de traitement ? Une boucle incrémentée de 1 à xxx ?

  4. #4
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    En fait quand je parle du traitement, je parle de toute la macro contenant un certain nombre de boucle qui parcourent toutes les lignes d'une feuille du classeur (nombre de feuille indéterminé)

  5. #5
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    C'était juste pour m'assurer qu'il s'agissait bien d'une ou de plusieurs boucles, sans ça je ne vois pas comment calculer le temps restant d'un traitement.

    Si tu vas dans la FAQ ou dans Contribuez ou si tu fais une recherche dans le forum, tu trouveras différents exemples sur la création d'une barre de progression.

    Quand tu dis, je cache le classeur, en réalité avec Application.ScreenUpdating tu ne le caches pas mais tu geles l'écran.
    Si c'est pour une raison de rapidité, avant d'essayer de construire une barre de progression, il faudrait voir si on ne peut pas optimiser la procédure. Ca serait mieux d'avoir une procédure qui dure 4sec sans barre de progression qu'une procédure qui dure 3min avec barre de progression, enfin...c'est mon avis.

  6. #6
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,

    Entièrement d'accord avec toi fring.

    plutot que mettre une barre de progression qui risque de faire ralentir la progression, moi j'afficherai une feuille avec écrit en grand " pas bouger, ça travaille" ou un truc du genre.

    pas super sexy mais fonctionnel quoi!
    :o)

  7. #7
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    fring, tu réponds à une question que j'allais te poser, parfait! =)

    En effet, l'exécution met un certain temps, si c'est pour que la Barre ralentisse c'est la pas la peine.

    J'ai déjà tenté d'optimiser mon code mais après, vis à vis de ce que la macro doit faire, je ne peut guère faire mieux. Le fait de geler l'écran accélère au moins doublement le traitement.

    Je vais donc opter pour un simple message en leur disant d'attendre 2min ^^

    Mirciii =)

  8. #8
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Citation Envoyé par Be Cool Voir le message
    J'ai déjà tenté d'optimiser mon code mais après, vis à vis de ce que la macro doit faire, je ne peut guère faire mieux.
    Tu ne voudrais pas nous le montrer ce code, parfois on passe à côté d'un détail qui peut ralentir toute la procédure.

  9. #9
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    Un de nos logiciel extrait des données (en général ~7000/8000 lignes) dans une feuille. Dans cette feuille, je doit faire des tri afin de les mettre dans des tableaux dynamiques croisés (Dans les 3 feuilles suivant la feuille de données).

    Quand le classeur est tout beau tout bien, on vire les données et on se sert juste du gabarit pour mettre dans le logiciel en question.

    Par contre :
    -je suis débutant, donc pas impossible que vous voyez des choses immondes à vos yeux dans ce code ^^
    -J'ai pô mis de commentaire. Je m'en vais vaccer à cette tâche de suite d'ailleurs (ça m'apprendra à pas les mettre au fur et à mesure :/)

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
      Sub Editions()
     
    'Gele l'écran pour la vitesse du traitement
    Application.ScreenUpdating = False
     
    'Tris sur la feuille de données
    Sheets(1).Select
     
    'Garde les 3 premiers caractère des Editions (MM PAP -> MM )
    k = 2
    While Range("A" & k) <> ""
    Car = Range("I" & k)
    Range("I" & k) = Left(Car, 3)
    k = k + 1
    Wend
     
     
    i = 2
    While Range("A" & i) <> ""
     
    'Si un même annonce paraît la même date mais dans des Edition différentes
    'on ajoute les Editions à la suite, on ajoute le prix de l'un au premier
    'ainsi que la taille. Enfin on supprime les lignes inutiles
     
        If (Range("D" & i) = Range("D" & i + 1)) _
        And (Range("I" & i) <> Range("I" & i + 1)) _
        And (Range("E" & i) = Range("E" & i + 1)) Then
        'Compte le nombre de même annonces qui se suivent
        j = 1
        While Range("D" & i) = Range("D" & i + j) _
            And (Range("I" & i) <> Range("I" & i + j)) _
            And (Range("E" & i) = Range("E" & i + j))
            j = j + 1
        Wend
        For k = 1 To j - 1
            Range("I" & i) = Range("I" & i) & " " & Range("I" & i + 1)
            Range("H" & i) = Range("H" & i) + Range("H" & i + 1)
     
            Rows(i + 1 & ":" & i + 1).Select
            Selection.Delete Shift:=xlUp
        Next
        End If
     
    'Tri pour le tableau croisé dynamique
        If Range("Q" & i) <> "Mots" Then
            Range("Q" & i & ":" & "S" & i).Select
            Selection.ClearContents
        End If
     
        If (Range("T" & i) <> "Col x Hauteur (mm)") And (Range("T" & i) <> "Mm") Then
            Range("T" & i & ":" & "V" & i).Select
            Selection.ClearContents
        End If
     
        If Range("W" & i) <> "Quantité" Then
            Range("W" & i & ":" & "Y" & i).Select
            Selection.ClearContents
        End If
     
        i = i + 1
    Wend
     
     
    Sheets(4).Select
    Range("B7").Select
    ActiveSheet.PivotTableWizard xlDatabase, Range("Feuil1!P1:Y" & i)
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotCache.Refresh
    ActiveWorkbook.ShowPivotTableFieldList = False
    'Mise en page
    If Range("J6") <> "" Then
        Range("B7:J7,B8:J8,B10:J10,B11:J11,B13:J13,B14:J14").Select
        Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous
    Else
        Range("B7:H7,B8:H8,B10:H10,B11:H11,B13:H13,B14:H14").Select
        Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous
    End If
     
    Columns("B:M").Select
    Selection.Style = "Comma"
     
    Columns("I:M").Select
    Selection.ColumnWidth = 17#
     
    If Range("I6") = "(vide)" Then
        Columns("I:I").Select
        Selection.ColumnWidth = 0
    End If
    If Range("H6") = "(vide)" Then
        Columns("H:H").Select
        Selection.ColumnWidth = 0
    End If
     
    Range("A1").Select
     
    Sheets(3).Select
    Range("B10").Select
    ActiveSheet.PivotTableWizard xlDatabase, Range("Feuil1!A1:N" & i)
    ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
    Sheets(2).Select
    Range("B10").Select
    ActiveSheet.PivotTableWizard xlDatabase, Range("Feuil1!A1:N" & i)
    ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotCache.Refresh
        Columns("C:C").Select
        Selection.Style = "Comma"
        Selection.EntireColumn.AutoFit
     
    j = 8
    While (Range("B" & j) <> "Total") And (Range("B" & j - 1) <> "Total")
        Range("B" & j & ":" & "C" & j).Select
        Selection.Interior.ColorIndex = 34
        Range("B" & j + 1 & ":" & "C" & j + 1).Select
        Selection.Interior.ColorIndex = 40
    j = j + 2
    Wend
    If Range("B" & j) = "Total" Then
        Range("B" & j & ":" & "C" & j).Select
        Selection.Interior.ColorIndex = 45
        Else
        Range("B" & j - 1 & ":" & "C" & j - 1).Select
        Selection.Interior.ColorIndex = 45
        End If
    Range("A1").Select
    Sheets(1).Visible = False
    Sheets(2).Name = "Montants par zone"
    Sheets(3).Name = "Détail"
    Sheets(4).Name = "Montants par types gratuits"
     
    Application.ScreenUpdating = True
     
    End Sub
    [Edit] vous allez remarquer que les deux premières boucles ont les même conditions d'arrêt. Seulement, je voyais pas tellement où mettre le traitement de la première dans la seconde, et par ailleurs, le temps d'exécution de ce traitement est rapide (1seconde)

  10. #10
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Toutes les fois que tu fais un .Select et ensuite un traitement quelconque sur l'objet Selection, tu ralentis le traitement. Un exemple pris au hasard dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Rows(i + 1 & ":" & i + 1).Select
            Selection.Delete Shift:=xlUp
    deviendra une fois les .Select et Selection enlevé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Rows(i + 1 & ":" & i + 1).Delete Shift:=xlUp
    Plus court et plus performant !

  11. #11
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Vu la longueur du code, on va y aller par étape
    1ère partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Tris sur la feuille de données
    Sheets(1).Select
     
    'Garde les 3 premiers caractère des Editions (MM PAP -> MM )
    k = 2
    While Range("A" & k) <> ""
    Car = Range("I" & k)
    Range("I" & k) = Left(Car, 3)
    k = k + 1
    Wend
    1. Dans n'importe quelle procédure, on peut dans la majorité des cas éviter les Select qui ralentisse la procédure (comme le précisait zaza que je salue au passage )
    2. La boucle While va s'arrêter dans le cas où tu as une ligne vide entre deux données
    3. Est-ce bien les 3 premiers caractères ? je n'en compte que 2
    4. Pense à déclarer tes variables, si elles ne sont pas déclarées elles prennent le type Variant par défaut et bouffent de la mémoire inutilement

    Donc cette première partie je l'écrirais comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Tris sur la feuille de données
    With Sheets(1)
        'Garde les 3 premiers caractère des Editions (MM PAP -> MM )
        For k = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
             .Range("I" & k) = Left(.Range("I" & k), 3)
        Next
    End With

  12. #12
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    J'ai parcouru ton code et supprimer la majorité des Select, les seuls que j'ai laissé sont ceux concernant la création des TCD que je ne maîtrise pas.

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Sub Editions()
    Dim k As Integer, i As Integer, j As Integer
     
    'Gele l'écran pour la vitesse du traitement
    Application.ScreenUpdating = False
     
    'Tris sur la feuille de données
    With Sheets(1)
     
        'Garde les 3 premiers caractère des Editions (MM PAP -> MM )
        For k = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            .Range("I" & k) = Left(.Range("I" & k), 3)
        Next
     
        i = 2
        While .Range("A" & i) <> ""
     
        'Si un même annonce paraît la même date mais dans des Edition différentes
        'on ajoute les Editions à la suite, on ajoute le prix de l'un au premier
        'ainsi que la taille. Enfin on supprime les lignes inutiles
     
            If (.Range("D" & i) = .Range("D" & i + 1)) _
                And (.Range("I" & i) <> .Range("I" & i + 1)) _
                And (.Range("E" & i) = .Range("E" & i + 1)) Then
                'Compte le nombre de même annonces qui se suivent
                j = 1
                While .Range("D" & i) = .Range("D" & i + j) _
                    And (.Range("I" & i) <> .Range("I" & i + j)) _
                    And (.Range("E" & i) = .Range("E" & i + j))
                    j = j + 1
                Wend
                For k = 1 To j - 1
                    .Range("I" & i) = .Range("I" & i) & " " & .Range("I" & i + 1)
                    .Range("H" & i) = .Range("H" & i) + .Range("H" & i + 1)
     
                    .Rows(i + 1).Delete
                Next
            End If
     
        'Tri pour le tableau croisé dynamique
            If .Range("Q" & i) <> "Mots" Then .Range("Q" & i & ":" & "S" & i).ClearContents
            If (.Range("T" & i) <> "Col x Hauteur (mm)") And (.Range("T" & i) <> "Mm") Then .Range("T" & i & ":" & "V" & i).ClearContents
            If .Range("W" & i) <> "Quantité" Then .Range("W" & i & ":" & "Y" & i).ClearContents
     
            i = i + 1
        Wend
     
    End With
     
     
    Sheets(4).Select
    Range("B7").Select
    ActiveSheet.PivotTableWizard xlDatabase, Range("Feuil1!P1:Y" & i)
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotCache.Refresh
    ActiveWorkbook.ShowPivotTableFieldList = False
    'Mise en page
    If Range("J6") <> "" Then
        Range("B7:J7,B8:J8,B10:J10,B11:J11,B13:J13,B14:J14").Borders(xlEdgeBottom).LineStyle = xlContinuous
    Else
        Range("B7:H7,B8:H8,B10:H10,B11:H11,B13:H13,B14:H14").Borders(xlEdgeBottom).LineStyle = xlContinuous
    End If
     
    Columns("B:M").Style = "Comma"
     
    Columns("I:M").ColumnWidth = 17#
     
    If Range("I6") = "" Then Columns("I").Hidden = True
    If Range("H6") = "" Then Columns("H").Hidden = True
     
    Sheets(3).Select
    Range("B10").Select
    ActiveSheet.PivotTableWizard xlDatabase, Range("Feuil1!A1:N" & i)
    ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
     
    Sheets(2).Select
    Range("B10").Select
    ActiveSheet.PivotTableWizard xlDatabase, Range("Feuil1!A1:N" & i)
    ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotCache.Refresh
        With Columns("C")
            .Style = "Comma"
            .EntireColumn.AutoFit
        End With
     
    j = 8
    While (Range("B" & j) <> "Total") And (Range("B" & j - 1) <> "Total")
        Range("B" & j & ":" & "C" & j).Interior.ColorIndex = 34
        Range("B" & j + 1 & ":" & "C" & j + 1).Interior.ColorIndex = 40
    j = j + 2
    Wend
    If Range("B" & j) = "Total" Then
        Range("B" & j & ":" & "C" & j).Interior.ColorIndex = 45
        Else
        Range("B" & j - 1 & ":" & "C" & j - 1).Interior.ColorIndex = 45
        End If
    Sheets(1).Visible = False
    Sheets(2).Name = "Montants par zone"
    Sheets(3).Name = "Détail"
    Sheets(4).Name = "Montants par types gratuits"
     
    Application.ScreenUpdating = True
     
    End Sub

  13. #13
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    Je doit encore vérifier si les résultats sont justes. Mais après avoir adapté puis testé vite fait, ça m'a l'air juste et plus rapide en effet.
    Entre la version que j'avais avant de geler l'écran et celle-ci, je suis passé de 50/55sec à une bonne dizaine de secondes de traitement.

    3. Est-ce bien les 3 premiers caractères ? je n'en compte que 2
    Ouép, j'ai pas pris le bon exemple.


    Merci à vous =)

  14. #14
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    En grattant il y aurait peut-être encore moyen de gagner 2 ou 3 secondes mais passer de 50 à 10 sec c'est déjà pas mal

  15. #15
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    Ouép comme tu dis. 'Pis si les collègues/utilisateurs trouve que c'est trop long, 'peuvent toujours aller boire un café en attendant, ils sont doués dans le domaine.

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

Discussions similaires

  1. [question] barre de progression animé
    Par jerem721 dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 21/03/2008, 19h56
  2. [VB.NET] Pb avec le bouton Annuler d'1 barre de progression
    Par dada1982 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2004, 10h56
  3. Réponses: 12
    Dernier message: 27/05/2004, 01h13
  4. [DEBUTANT] Barre de progression
    Par pupupu dans le forum MFC
    Réponses: 4
    Dernier message: 18/01/2004, 17h47
  5. [web] Barre de Progression ASCII
    Par Red Bull dans le forum Web
    Réponses: 13
    Dernier message: 05/06/2003, 13h56

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