Barre de progression

Bonjour le forum

J'ai essayé de mettre dans mon code en m’appuyant sur www.excel-pratique.com/fr/astuces_vba/progress_bar.php que je remercie.

Le résultat n'est que partiellement correct.

L'userform se comporte correctement, sauf l'activité de progression.

Normale puisque je ne sais pas comment la mettre en place dans ce mon code.

Mon code:

'PROCEDURE INIALISATION DU DOSSIER

' En 1- METTRE "PE" DANS COLONNE D A PARTIR DE LA LIGNE 3 SI CELLULE B N'EST PAS VIDE sur toutes les feuilles

Private Sub Btn_InitDossier_Click()
    Dim plage As Range
    Dim I%, y%
    Dim derlig As Long
    Dim Data As Long

        Application.ScreenUpdating = False  'Désactive l'actualisation de l'écran

    For I = 3 To Worksheets.Count
         With Worksheets(I)
             For y = 3 To .Cells(.Rows.Count, 2).End(xlUp).Row
                If Not IsEmpty(.Cells(y, 3)) Then                       'Vérifie que la cellule à gauche n'est pas vide
                    .Range(.Cells(y, 4), .Cells(y, 10)).ClearContents   'Raz des informations précédentes
                    .Cells(y, 4) = "PE"                                     'Ecriture Pas Essayer "PE"
                    .Columns("G:I").EntireColumn.Hidden = True             ' Choix des colonnes a masquer pour saisir les informations: Columns("G:I") étant la phase corrective sur "N"
                End If
             Next y
        End With
    Next I

' En 2- RECUPERE LES NOMS D'ONGLETS ET COMPTE LE NBRE DE "PE" APRES "INIT DOSSIER" PRESENT DANS CHAQUE ONGLET

   Worksheets("DATA").Activate   'Activation Feuille "DATA"

     DerLig_Data = Sheets("DATA").Range("D" & Rows.Count).End(xlUp).Row                 'détermine la dernière ligne
     If DerLig_Data > 8 Then Sheets("DATA").Range("D9:E" & DerLig_Data).ClearContents  'si la dernière ligne est la 8, on fait rien sinon, on efface tout ce qui est en dessous

    For I = 1 To Sheets.Count
        If Sheets(I).Name <> "DATA" And Sheets(I).Name <> "ADMINISTRATEUR" Then    'toutes les feuilles sauf "DATA" et "ADMINISTRATEUR"
            PosTiret = InStr(1, Sheets(I).Name, "-", 1) 'relevé de l'emplacement du tiret dans le nom de l'onglet
            Tbl = Left(Sheets(I).Name, PosTiret - 1)
            With Sheets("DATA")    'Choix de la l'onglet "DATA"
                .Cells(9 + I - 3, "D") = Sheets(I).Name 'Nom de l'onglet
                .Cells(9 + I - 3, "G") = Sheets(I).Name 'Nom de l'onglet
                .Range("E" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Statique
                .Range("K" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Dynamique (Pour Datas Courbes Barres)
            End With
        End If
    Next I

    DerLig_Data = Worksheets("DATA").Range("D" & Rows.Count).End(xlUp).Row   'détermine la dernière ligne
    If DerLig_Data > 8 Then
        With Sheets("DATA")
            .Range("D9:E" & DerLig_Data).Value = Range("D9:E" & DerLig_Data).Value 'remplacement des formules par leurs valeurs
            .Range("K9:K" & DerLig_Data).Value = Range("K9:K" & DerLig_Data).Value 'remplacement des formules par leurs valeurs

        End With

    End If

' En 3- METTRE A JOURS LA LISTE DES ONGLETS DANS "ADMINISTRATEUR"

    Call MJLIST_Onglet   'Appel module MJLIST_Onglet

     Init_Dossier.Height = 140   'définition hauteur UserForm "Init_Dossier" à la fermeture

  ' MsgBox "Toutes les feuilles sont mises à jour", vbInformation

' Worksheets("DATA").Visible = False 'Cache la feuille "DATA"

End Sub

Je n'ai pas mis mon fichier (trop de données confidentielles), pour info :

Si cela est nécessaire , je ferai un support.

Merci par avance.

Bonne journée au forum

Bonsoir,

à première vue vous avez deux boucles "principales", il vous faut déterminer leur proportion par rapport aux 100% de la barre de progression.
A voir aussi combien de "temps" dure la procédure MJLIST_Onglet.

Mais l'idée est là : première boucle correspondant à 60% et la seconde à 40 %, l'image_barre ayant une taille finie de 150, la première boucle la fera avancer de 60% soit 60*150/100 = 90 et la deuxième boucle de 60, elle sera donc à 100% à la fin des deux boucle (je part du principe que la dernière procédure n'est pas longue)

Pour la première boucle, la barre devra avancer de 90/par le nombre de boucle, soit dans votre exemple : 90/Worksheets.Count mais comme il y a une autre boucle imbriquée chaque portion devra également être divisée par le compteur de cette boucle (90/WorkSheets.count) / .Cells(.Rows.Count, 2).End(xlUp).Row

Vous trouvez ainsi la valeur d'avancement pour chaque "sous boucle" et cette valeur d'avancement sera proportionnel à chaque compteur.

Pour la deuxième boucle c'est plus simple il n'y en a qu'une, donc le principe est le même 60/Sheets.Count

Le découpage étant mis en variable, la valeur d'avancement devra être ajouté à la taille de l'image de la barre pour la faire avancée.

@ bientôt

LouReeD

Un essai d'intégration :

'PROCEDURE INIALISATION DU DOSSIER

' En 1- METTRE "PE" DANS COLONNE D A PARTIR DE LA LIGNE 3 SI CELLULE B N'EST PAS VIDE sur toutes les feuilles

Private Sub Btn_InitDossier_Click()
    Dim plage As Range
    Dim I%, y%
    Dim derlig As Long
    Dim Data As Long

    '******************** LouReeD
    Dim Taille_Barre, Segment_Barre, Taille, NB_Lignes
    UserForm_demo.Show

    Application.ScreenUpdating = False  'Désactive l'actualisation de l'écran

    ' ******************* LouReeD
    ' on part du principe que la première double boucle prend 60% de la barre
    Taille = 90

    For I = 3 To Worksheets.Count
         With Worksheets(I)

            '****** LouReeD
            NB_Lignes = .Cells(.Rows.Count, 2).End(xlUp).Row
            Segment_Barre = (Taille / Worksheets.Count) / NB_Lignes

             For y = 3 To NB_Lignes
                If Not IsEmpty(.Cells(y, 3)) Then                       'Vérifie que la cellule à gauche n'est pas vide
                    .Range(.Cells(y, 4), .Cells(y, 10)).ClearContents   'Raz des informations précédentes
                    .Cells(y, 4) = "PE"                                     'Ecriture Pas Essayer "PE"
                    .Columns("G:I").EntireColumn.Hidden = True             ' Choix des colonnes a masquer pour saisir les informations: Columns("G:I") étant la phase corrective sur "N"
                End If

                '****** LouReeD
                Image_barre.Width = Image_barre.Width + Segment_Barre
                Label_barre.Caption = Image_barre.Width * 1.5 & "%"
                DoEvents

             Next y
        End With
    Next I

' En 2- RECUPERE LES NOMS D'ONGLETS ET COMPTE LE NBRE DE "PE" APRES "INIT DOSSIER" PRESENT DANS CHAQUE ONGLET

   Worksheets("DATA").Activate   'Activation Feuille "DATA"

     DerLig_Data = Sheets("DATA").Range("D" & Rows.Count).End(xlUp).Row                 'détermine la dernière ligne
     If DerLig_Data > 8 Then Sheets("DATA").Range("D9:E" & DerLig_Data).ClearContents  'si la dernière ligne est la 8, on fait rien sinon, on efface tout ce qui est en dessous

    ' ******************* LouReeD
    ' on part du principe que la deuxième boucle prend 40% de la barre
    Taille = 60
    Segment_Barre = (Taille / Sheets.Count)

    For I = 1 To Sheets.Count
        If Sheets(I).Name <> "DATA" And Sheets(I).Name <> "ADMINISTRATEUR" Then    'toutes les feuilles sauf "DATA" et "ADMINISTRATEUR"
            PosTiret = InStr(1, Sheets(I).Name, "-", 1) 'relevé de l'emplacement du tiret dans le nom de l'onglet
            Tbl = Left(Sheets(I).Name, PosTiret - 1)
            With Sheets("DATA")    'Choix de la l'onglet "DATA"
                .Cells(9 + I - 3, "D") = Sheets(I).Name 'Nom de l'onglet
                .Cells(9 + I - 3, "G") = Sheets(I).Name 'Nom de l'onglet
                .Range("E" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Statique
                .Range("K" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Dynamique (Pour Datas Courbes Barres)
            End With
        End If

        '****** LouReeD
        Image_barre.Width = Image_barre.Width + Segment_Barre
        Label_barre.Caption = Image_barre.Width * 1.5 & "%"
        DoEvents

    Next I

    DerLig_Data = Worksheets("DATA").Range("D" & Rows.Count).End(xlUp).Row   'détermine la dernière ligne
    If DerLig_Data > 8 Then
        With Sheets("DATA")
            .Range("D9:E" & DerLig_Data).Value = Range("D9:E" & DerLig_Data).Value 'remplacement des formules par leurs valeurs
            .Range("K9:K" & DerLig_Data).Value = Range("K9:K" & DerLig_Data).Value 'remplacement des formules par leurs valeurs

        End With

    End If

' En 3- METTRE A JOURS LA LISTE DES ONGLETS DANS "ADMINISTRATEUR"

    Call MJLIST_Onglet   'Appel module MJLIST_Onglet

     Init_Dossier.Height = 140   'définition hauteur UserForm "Init_Dossier" à la fermeture

    '****** LouReeD
    ' on s'assure que la barre est complète
    Image_barre.Width = 150
    Label_barre.Caption = "100%"

  ' MsgBox "Toutes les feuilles sont mises à jour", vbInformation

' Worksheets("DATA").Visible = False 'Cache la feuille "DATA"

    '****** LouReeD
    ' on efface le USF
    Unload userform_demo

End Sub

Avec suppression de tous les codes du USF d'origine, mais il faut alors le retravailler un peu :
Suppression du bouton, remonter les différents labels qui se trouvent sur le bas (ils sont masqués car la taille global du USF est trop petite, donc l'agrandir vers le bas. Adapter ensuite la taille du USF à ce qui reste.

@ bientôt

LouReeD

Bonsoir Le Forum

Bonsoir LouReed

Merci de ta réponse

Je vais essayer d’intégrer ta proposition à mon code.

J'espère que tu suivras mon post, car je n'ai pas beaucoup de tps en ce moment.

cela fait des mois que je travail sur ce fichier , il prend forme au fil des posts avec l'aide du forum.

Je regarde ta proposition ce week-end.

et encore merci

Bonne soirée à tous

Bonsoir,

j'ai bon espoir, à la lecture cela me semble correcte. Bons tests @ vous !

@ bientôt

LouReeD

Bonjour le forum

J'ai testé le code que tu m'as proposé LouReed, mais cela bloque sur:

objet requis

 '****** LouReeD
                Image_barre.Width = Image_barre.Width + Segment_Barre  

Cette ligne se met en jaune

Le début de l'action de "INIT DOSSIER" se fais par ce BP

image

Le code associé est :

'PROCEDURE INIALISATION DU DOSSIER

' En 1- METTRE "PE" DANS COLONNE D A PARTIR DE LA LIGNE 3 SI CELLULE B N'EST PAS VIDE sur toutes les feuilles

Private Sub Btn_InitDossier_Click()
    Dim plage As Range
    Dim I%, y%
    Dim derlig As Long
    Dim Data As Long

    '******************** LouReeD
    Dim Taille_Barre, Segment_Barre, Taille, NB_Lignes
   ' UserForm_demo.Show Je n'ai pas utilisé l'Userform démo. J'ai pris les éléments  "Label_barre & Image_barre2 " de la démo pour les mettre ds Userform Init_Dossier

    Application.ScreenUpdating = False  'Désactive l'actualisation de l'écran

    ' ******************* LouReeD
    ' on part du principe que la première double boucle prend 60% de la barre
    Taille = 90

    For I = 3 To Worksheets.Count
         With Worksheets(I)

            '****** LouReeD
            NB_Lignes = .Cells(.Rows.Count, 2).End(xlUp).Row
            Segment_Barre = (Taille / Worksheets.Count) / NB_Lignes

             For y = 3 To NB_Lignes
                If Not IsEmpty(.Cells(y, 3)) Then                       'Vérifie que la cellule à gauche n'est pas vide
                    .Range(.Cells(y, 4), .Cells(y, 10)).ClearContents   'Raz des informations précédentes
                    .Cells(y, 4) = "PE"                                     'Ecriture Pas Essayer "PE"
                    .Columns("G:I").EntireColumn.Hidden = True             ' Choix des colonnes a masquer pour saisir les informations: Columns("G:I") étant la phase corrective sur "N"
                End If

                '****** LouReeD
                Image_barre.Width = Image_barre.Width + Segment_Barre
                Label_barre.Caption = Image_barre.Width * 1.5 & "%"
                DoEvents

             Next y
        End With
    Next I

' En 2- RECUPERE LES NOMS D'ONGLETS ET COMPTE LE NBRE DE "PE" APRES "INIT DOSSIER" PRESENT DANS CHAQUE ONGLET

   Worksheets("DATA").Activate   'Activation Feuille "DATA"

     DerLig_Data = Sheets("DATA").Range("D" & Rows.Count).End(xlUp).Row                 'détermine la dernière ligne
     If DerLig_Data > 8 Then Sheets("DATA").Range("D9:E" & DerLig_Data).ClearContents  'si la dernière ligne est la 8, on fait rien sinon, on efface tout ce qui est en dessous

    ' ******************* LouReeD
    ' on part du principe que la deuxième boucle prend 40% de la barre
    Taille = 60
    Segment_Barre = (Taille / Sheets.Count)

    For I = 1 To Sheets.Count
        If Sheets(I).Name <> "DATA" And Sheets(I).Name <> "ADMINISTRATEUR" Then    'toutes les feuilles sauf "DATA" et "ADMINISTRATEUR"
            PosTiret = InStr(1, Sheets(I).Name, "-", 1) 'relevé de l'emplacement du tiret dans le nom de l'onglet
            Tbl = Left(Sheets(I).Name, PosTiret - 1)
            With Sheets("DATA")    'Choix de la l'onglet "DATA"
                .Cells(9 + I - 3, "D") = Sheets(I).Name 'Nom de l'onglet
                .Cells(9 + I - 3, "G") = Sheets(I).Name 'Nom de l'onglet
                .Range("E" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Statique
                .Range("K" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Dynamique (Pour Datas Courbes Barres)
            End With
        End If

        '****** LouReeD
        Image_barre.Width = Image_barre.Width + Segment_Barre
        Label_barre.Caption = Image_barre.Width * 1.5 & "%"
        DoEvents

    Next I

    DerLig_Data = Worksheets("DATA").Range("D" & Rows.Count).End(xlUp).Row   'détermine la dernière ligne
    If DerLig_Data > 8 Then
        With Sheets("DATA")
            .Range("D9:E" & DerLig_Data).Value = Range("D9:E" & DerLig_Data).Value 'remplacement des formules par leurs valeurs
            .Range("K9:K" & DerLig_Data).Value = Range("K9:K" & DerLig_Data).Value 'remplacement des formules par leurs valeurs

        End With

    End If

' En 3- METTRE A JOURS LA LISTE DES ONGLETS DANS "ADMINISTRATEUR"

    Call MJLIST_Onglet   'Appel module MJLIST_Onglet

     Init_Dossier.Height = 140   'définition hauteur UserForm "Init_Dossier" à la fermeture

    '****** LouReeD
    ' on s'assure que la barre est complète
    Image_barre.Width = 150
    Label_barre.Caption = "100%"

  ' MsgBox "Toutes les feuilles sont mises à jour", vbInformation

' Worksheets("DATA").Visible = False 'Cache la feuille "DATA"

    '****** LouReeD
    ' on efface le USF
    'Unload UserForm_demo

End Sub

Voilà, j'ai compris le principe, mais ne comprends l'erreur à ce jour.

Je reprends ce soir l'analyse

Merci de ton aide jusque là

En espérant que je trouve ou tu (vous) m'apporter l'aide pour résoudre ce problème.

Merci et bonne journée à tous

Bonjour

Le code ne trouve pas l'objet Image_Barre, existe il sur votre USF ?

@ bientôt

LouReeD

Bonjour le forum et LouReed

Merci pour l'aide apporté sur ce post.

J'ai trouvé mon erreur de 'débutant' qui n'a pas pris le temps de bien décortiqué l'exemple pris sur ce forum

Cela fonctionne correctement, le seul petit problème, c'est que j'avais un % qui sur la première partie était de 225 %, j'ai ajusté le multiplicateur 1.5 à 04.

Confirme stp si j'ai bien fait .

Sinon voici le code terminé :

PROCEDURE INIALISATION DU DOSSIER

' En 1- METTRE "PE" DANS COLONNE D A PARTIR DE LA LIGNE 3 SI CELLULE B N'EST PAS VIDE sur toutes les feuilles

Private Sub Btn_InitDossier_Click()
    Dim plage As Range
    Dim I%, y%
    Dim derlig As Long
    Dim Data As Long

    '******************** LouReeD
    Dim Taille_Barre, Segment_Barre, Taille, NB_Lignes

    Application.ScreenUpdating = False  'Désactive l'actualisation de l'écran

    ' ******************* LouReeD
    ' on part du principe que la première double boucle prend 60% de la barre
    Taille = 90

    For I = 3 To Worksheets.Count
         With Worksheets(I)

            '****** LouReeD
            NB_Lignes = .Cells(.Rows.Count, 2).End(xlUp).Row
            Segment_Barre = (Taille / Worksheets.Count) / NB_Lignes

             For y = 3 To NB_Lignes
                If Not IsEmpty(.Cells(y, 3)) Then                       'Vérifie que la cellule à gauche n'est pas vide
                    .Range(.Cells(y, 4), .Cells(y, 10)).ClearContents   'Raz des informations précédentes
                    .Cells(y, 4) = "PE"                                     'Ecriture Pas Essayer "PE"
                    .Columns("G:I").EntireColumn.Hidden = True             ' Choix des colonnes a masquer pour saisir les informations: Columns("G:I") étant la phase corrective sur "N"
                End If

                '****** LouReeD
                Image_barre.Width = Image_barre.Width + Segment_Barre 'Image_Barre Curseur Vert
                Label_barre.Caption = Image_barre2.Width * 0.4 & "%" 'Image_Barre2

                DoEvents    'Actualisation

             Next y
        End With
    Next I

' En 2- RECUPERE LES NOMS D'ONGLETS ET COMPTE LE NBRE DE "PE" APRES "INIT DOSSIER" PRESENT DANS CHAQUE ONGLET

   Worksheets("DATA").Activate   'Activation Feuille "DATA"

     DerLig_Data = Sheets("DATA").Range("D" & Rows.Count).End(xlUp).Row                 'détermine la dernière ligne
     If DerLig_Data > 8 Then Sheets("DATA").Range("D9:E" & DerLig_Data).ClearContents  'si la dernière ligne est la 8, on fait rien sinon, on efface tout ce qui est en dessous

    ' ******************* LouReeD
    ' on part du principe que la deuxième boucle prend 40% de la barre
    Taille = 60
    Segment_Barre = (Taille / Sheets.Count)

    For I = 1 To Sheets.Count
        If Sheets(I).Name <> "DATA" And Sheets(I).Name <> "ADMINISTRATEUR" Then    'toutes les feuilles sauf "DATA" et "ADMINISTRATEUR"
            PosTiret = InStr(1, Sheets(I).Name, "-", 1) 'relevé de l'emplacement du tiret dans le nom de l'onglet
            Tbl = Left(Sheets(I).Name, PosTiret - 1)
            With Sheets("DATA")    'Choix de la l'onglet "DATA"
                .Cells(9 + I - 3, "D") = Sheets(I).Name 'Nom de l'onglet
                .Cells(9 + I - 3, "G") = Sheets(I).Name 'Nom de l'onglet
                .Range("E" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Statique
                .Range("K" & 9 + I - 3) = "=COUNTIF(" & Tbl & "[CONFORME O / N / PE],""PE"")"  'Data Taleau Dynamique (Pour Datas Courbes Barres)
            End With
        End If

        '****** LouReeD
        Image_barre.Width = Image_barre.Width + Segment_Barre   'Image_Barre Curseur Vert
                Label_barre.Caption = Image_barre2.Width * 0.4 & "%"    'Image_Barre2
                DoEvents
    Next I

    DerLig_Data = Worksheets("DATA").Range("D" & Rows.Count).End(xlUp).Row   'détermine la dernière ligne
    If DerLig_Data > 8 Then
        With Sheets("DATA")
            .Range("D9:E" & DerLig_Data).Value = Range("D9:E" & DerLig_Data).Value 'remplacement des formules par leurs valeurs
            .Range("K9:K" & DerLig_Data).Value = Range("K9:K" & DerLig_Data).Value 'remplacement des formules par leurs valeurs

        End With

    End If

' En 3- METTRE A JOURS LA LISTE DES ONGLETS DANS "ADMINISTRATEUR"

    Call MJLIST_Onglet   'Appel module MJLIST_Onglet

     Init_Dossier.Height = 160   'définition hauteur UserForm "Init_Dossier" à la fermeture

    '****** LouReeD
    ' on s'assure que la barre est complète
    Image_barre.Width = 150
    Label_barre.Caption = "100%"

' Worksheets("DATA").Visible = False 'Cache la feuille "DATA"

    Application.Wait Now + TimeValue("00:00:03")
     Unload Init_Dossier     'Fermeture automatique Userform Init_Dossier après 3s

End Sub

J'ai ajouté à la fin ce petit bout de code " Application.Wait ..... pour la fermeture automatique de cette procédure

Dans l'attente de ton retour sur l'ensemble de ce code, (Résolue sera mis après ta validation)

je vous remercie de m'avoir aidé.

Bonne fin de journée à tous

un barre de progression, c'est un idea stupide, je préfères utiliser le "application.statusbar" une fois tout les 50-100 (?) executions.

Si vous ajouter "application.Calculation=xlCalculationManual" au début et automatique à la fin, (dépend du fonctionnement du fichier, si cela peut !), est-ce que vous gagner beaucoup de temps ?

En diminuent le nombre de interactions avec la feuille, on peut gagner beaucoup de temps. Y-a-t'il des possibilités ?

Il s'agit de combien de lignes en moyenne ?

Bonsoir BsAlv

Merci de votre réponse, mais étant très jeune dans le domaine et si cela vous semble stupide, je suis intéressé par votre vision

Si vous avez un ou des exemples à me proposer, je suis preneur.

De non coté je vais regarder

, je préfères utiliser le "application.statusbar" une fois tout les 50-100 (?) executions.

Bonne soirée à tous

Y a-t-il une possibilité de créer un fichier avec des données non-confidentielles avec autant de lignes que habituelle.

Le temps d'executer le macro, il est combien pour le moment ?

Je suppose que ce soit possible de le faire en une fraction (la moitié , 1/3 , ... ?)

Bonjour le Forum.

Bonjour BsAlv, je suis désolé de ne pas avoir vu ton post avant.

Le tps d'exécution de la macro n'est pas trop long, moins de dix secondes

L'application.statusbar" je l'ai regardé, je pense qu'elle se visualise en bas du fichier ?

Si je voulais l'intégrer dans le dernier code de ce post, comment je doit m'y prendre ?

Merci

Bonne fin de journée à tous

Rechercher des sujets similaires à "barre progression"