Barre de progression

Bonjour,

J'ai besoin d'afficher une barre de progression pendant l'execution de ma longue macro qui doit insérer des tableaux dans chaque onglet. est ce qu'il y a quelqu'un qui pourrait m'aider Svp ?

Merci d'avance

Bonjour,

Une solution possible est de créer un Userform avec une image a fond coloré qui augmente sa largeur suivant la progression de ta macro qui insert les tableaux

Un texte peu aussi indiquer le % de progression

image
24barre-progression.zip (158.30 Ko)

Bonjour Geof52, merci pour ta réponse, pourrais tu me dire ou je peux insérer ma macro ci-dessous ? car je suis débutante dans le VBA

Sub Delai()
    UserForm_BarreProgression.afficher
For i = 0 To 100
UserForm_BarreProgression.actualiser (1 * i)
pause 0.1
Next i

End Sub

Sub pause(duree As Double)
Dim finpause As Double
finpause = Timer + duree
Do While Timer < finpause
DoEvents
Loop
End Sub

Pas de probleme, c'est juste un exemple (puisqu'il y a plusieurs façon de faire, si plus tard tu veux créer toi meme ta barre de progression).
1 ) - Ici pour l'exemple je choisis de démarrer la progression avec un temps (qui va de 0% a 100% avec la ligne For i = 0 to 100)

2 ) On peut imaginer que tu as plusieurs étape pour ta macro déja créé et on peut directement donner un pourcentage a la barre (moins fluide mais plus réaliste du temps passé et qui reste a faire.

______________________________________

On va voir le cas 1
Dans Module 1

Sub Delai()
    'On affiche l'userform de la barre de progression
    UserForm_BarreProgression.afficher
...
End Sub

Dans l'userform clic droit sur pour acceder au code qu'il contient

Il faut savoir que le nom de l'image est "Barre"
le Label 2 qui indique le % est "BarreTexte"

image
Public Sub UserForm_initialize()
Me.Left = Application.Left + Application.Width / 2 - Me.Width / 2
Me.Top = Application.Top + Application.Height / 2 - Me.Height / 2
End Sub

La procedure d'initialisation se lancera toujours en premier quand l'userform s'ouvre.

Ici Me.Left et Me.Top vont seulement positionner l'userform au centre du classeur
(la formule traduite c'est => la gauche de l'userform = le positionnement du classeur a gauche + moitié de la taille du classeur - moitier de l'userform)

    UserForm_BarreProgression.afficher

Dans le module 1 on a appelé l'userform_barre progression.afficher

Sub afficher()
    Me.Show 0
End Sub

Ici Me.show 0 va ouvrir l'userform en modal ce qui fait qu'il n'arrete pas les évenements qui se passe en meme temp comme ta macro pour tableau.

__________________________________

L'affichage de l'userform fait maintenant on se retrouve de nouveau dans le module 1 pour :

For i = 0 To 100
UserForm_BarreProgression.actualiser (1 * i)
pause 1
Next i

Pour simplifier je vais expliquer avec Pause 1

Je prend une boucle "FOR" qui va prendre la valeur de "i" pour le pourcentage donc je suis parti de 0 a 100.

=> UserForm_BarreProgression.actualiser [tu te retrouve dans l'userfom et la partie Actualiser
=> (1 x i ) va indiquer le pourcentage a la place de taux dans cette partie ci dessous

Sub actualiser(taux As Integer)
    Barre.Width = BarreTexte.Width * taux / 100
    BarreTexte = taux & " %"

    If taux = 100 Then
        Application.Wait (Now + TimeValue("00:00:02"))
        Unload Me
    End If
    DoEvents
End Sub

Barre. width controle la largeur de l'image qui va correspondre au taux / 100
BarreTexte = taux pour indiquer la progression en texte

If Taux = 100 n'est pas necessaire c'est seulement pour que le 100% reste 2 seconde avant que l'userform se ferme pour bien montré qu"il a été au bout du poucentage.

DoEvents permet de mettre a jour les données changées.

La partie actualiser est passé de i = 0 on se retrouve sur Pause 1

For i = 0 To 100
UserForm_BarreProgression.actualiser (1 * i)
pause 1
Next i

Pause 1 fait appel a la procedure juste dessous

Sub pause(duree As Double)
Dim finpause As Double
finpause = Timer + duree
Do While Timer < finpause
DoEvents
Loop
End Sub

En gros si "pause 1" c'est une temporisation de 1 seconde donc dans "pause 0.1" tu vas 10x plus vite qu'une seconde.

Next i

Pause 1 est effectué on passe a "next i" donc la boucle For passe de 0 a 1

_________________________________________

For i passe de 0 a 100

a i = 100 la procedure attend 2 seconde et se ferme avec

Unload Me

N'hésite pas si c'est pas clair mais si tu as compris le princpe :

______________________________________________

La 2°) façon de faire que je parle au début a juste besoin d'une valeur i entre 0 et 100 entre chaque étape de ta macro creation de tableau grace a :

UserForm_BarreProgression.actualiser 0
UserForm_BarreProgression.actualiser 12
UserForm_BarreProgression.actualiser 34
UserForm_BarreProgression.actualiser 67
UserForm_BarreProgression.actualiser 100

______________________________________________

Pour info peut-etre que les fenetre propriétés et variables locales ne sont pas actifs tu devrais les mettres pour simplifier la vie

image

Tu peux décomposer la macro aussi en mode "pas a pas" avec la touche [F8] quand tu es sur Sub Delai() ([F8] pour chaque étape)

_______________________________________________________________________________________________________________________________________________

Pour savoir ou placer ta macro, (sans savoir ce que tu as fais) je te dirais de mettre Delai au début de ta macro comme ça la progression commence au debut de ta macro et il faudra adapter le temps de progression donc soit jouer avec pause 1 [en pause 0.5 / pause 1.75 / ou autre]
Ou changer le for 1 to 100 et le (1 * i ) [en i=0 to 50 (2*i) / i=0 to 33 (3*i) / ...] qui te permet de faire plusieurs pourcentage en 1 seconde

Test et n'hésite pas a poster ce que tu as fait seulement si il n'y a pas d'information confidentielle.

A+

Bonsoir à vous deux !

la question que l'on peut se poser est : Pourquoi la macro est si longue ?

Autant avec une retouche du code cette barre de progression n'est plus utile !
Dans les applications que je propose j'en ai mise une à disposition, mais comme c'est indiqué c'est du "cosmétique", car une simple "WaitBox" peut suffire sans alourdir le code VBA.

Mais pour avancer dans ce projet un fichier nous serait utile.

@ bientôt

LouReeD

Bonsoir LouReeD,

Effectivement, c'etait la premiere question a poser.
Personnellement j'ai eu besoin de cette barre de progression pour faire de la manipulation sendkeys et j'ai volontairement temporisé la macro pour que chaque poste utilisateur fonctionne correctement.

A+

Bonjour,

@Geof52 merci d'avoir pris le temps de m'expliquer, c'est gentil..

@LouReeD, je ne sais pas trop si ça vaut vraiment la peine d'utiliser cette barre de cosmétique pour mon fichier, alors que ça ne pourrait qu'alourdir ma macro qui devrait normalement s'executer en quelques secondes.
Je voulais vous partager mon fichier Excel avec la macro (taille 1,90 Mo) mais impossible de le charger car il semble plus volumineux, mais je vous ai partagé ci-dessous ma macro pour vous donner une idée..

Sub Copier_Tableaux()

Application.ScreenUpdating = False

'----------------------------------------------------
'------------------------ HD ------------------------
'----------------------------------------------------

Worksheets("HD").Unprotect

Sheets("HD").Range("A8:AE42").Copy
Sheets("HD").Rows("8:8").Resize(36).Insert Shift:=xlDown
Sheets("HD").Range("A8:AE42").PasteSpecial xlPasteAll

For Each cell In Sheets("HD").Range("A8:AE42")
    If Not cell.Locked Then
    cell.ClearContents
    End If
Next cell

Sheets("HD").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("HD").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"

Application.CutCopyMode = False

ActiveSheet.Range("A43:AE76").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

Worksheets("HD").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("HD").Range("A1").Select

'----------------------------------------------------
'------------------------ SPT -----------------------
'----------------------------------------------------

Worksheets("SPT").Unprotect

Sheets("SPT").Range("A8:AE43").Copy
Sheets("SPT").Rows("8:8").Resize(37).Insert Shift:=xlDown
Sheets("SPT").Range("A8:AE43").PasteSpecial xlPasteAll

For Each cell In Sheets("SPT").Range("A8:AE43")
    If Not cell.Locked Then
    cell.ClearContents
    End If
Next cell

Sheets("SPT").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("SPT").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"

Application.CutCopyMode = False

ActiveSheet.Range("A43:AE78").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

Worksheets("SPT").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("SPT").Range("A1").Select

'----------------------------------------------------
'------------------------ FI ------------------------
'----------------------------------------------------

Worksheets("FI").Unprotect

Sheets("FI").Range("A8:AE72").Copy
Sheets("FI").Rows("8:8").Resize(66).Insert Shift:=xlDown
Sheets("FI").Range("A8:AE72").PasteSpecial xlPasteAll

For Each cell In Sheets("FI").Range("A8:AE72")
    If Not cell.Locked Then
    cell.ClearContents
    End If
Next cell

Sheets("FI").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("FI").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"

Application.CutCopyMode = False

ActiveSheet.Range("A73:AE136").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

Worksheets("FI").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("FI").Range("A1").Select

'----------------------------------------------------
'-----------------------IRC--------------------------
'----------------------------------------------------

Worksheets("IRC").Unprotect

Sheets("IRC").Range("A8:AE37").Copy
Sheets("IRC").Rows("8:8").Resize(31).Insert Shift:=xlDown
Sheets("IRC").Range("A8:AE37").PasteSpecial xlPasteAll

For Each cell In Sheets("IRC").Range("A8:AE37")
    If Not cell.Locked Then
    cell.ClearContents
    End If
Next cell

Sheets("IRC").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("IRC").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"

Application.CutCopyMode = False

ActiveSheet.Range("A38:AE66").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

Worksheets("IRC").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("IRC").Range("A1").Select

'----------------------------------------------------
'-----------------------PIAE-------------------------
'----------------------------------------------------

Worksheets("PIAE").Unprotect

Sheets("PIAE").Range("A8:AE35").Copy
Sheets("PIAE").Rows("8:8").Resize(29).Insert Shift:=xlDown
Sheets("PIAE").Range("A8:AE35").PasteSpecial xlPasteAll

For Each cell In Sheets("PIAE").Range("A8:AE35")
    If Not cell.Locked Then
    cell.ClearContents
    End If
Next cell

Sheets("PIAE").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("PIAE").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"

Application.CutCopyMode = False

ActiveSheet.Range("A36:AE62").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

Worksheets("PIAE").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("PIAE").Range("A1").Select

'----------------------------------------------------
'-----------------------IMMO RI-------------------------
'----------------------------------------------------

Worksheets("Immo RI").Unprotect

Sheets("Immo RI").Range("A8:AE36").Copy
Sheets("Immo RI").Rows("8:8").Resize(28).Insert Shift:=xlDown
Sheets("Immo RI").Range("A8:AE36").PasteSpecial xlPasteAll

For Each cell In Sheets("Immo RI").Range("A8:AE36")
    If Not cell.Locked Then
    cell.ClearContents
    End If
Next cell

Sheets("Immo RI").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("Immo RI").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"

Application.CutCopyMode = False

ActiveSheet.Range("A37:AE63").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

Worksheets("Immo RI").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("Immo RI").Range("A1").Select

'----------------------------------------------------
'-----------------------MESURE ET STRATÉGIE-------------------------
'----------------------------------------------------

Worksheets("Mesures et stratégie").Unprotect

Sheets("Mesures et stratégie").Range("A8:AC209").Copy
Sheets("Mesures et stratégie").Rows("8:8").Resize(201).Insert Shift:=xlDown
Sheets("Mesures et stratégie").Range("A8:AC209").PasteSpecial xlPasteAll

For Each cell In Sheets("Mesures et stratégie").Range("A8:AC209")
    If Not cell.Locked Then
    cell.ClearContents
    End If
Next cell

Sheets("Mesures et stratégie").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("Mesures et stratégie").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"

Application.CutCopyMode = False

ActiveSheet.Range("A210:AC411").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

Worksheets("Mesures et stratégie").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("Mesures et stratégie").Range("A1").Select

'---------------------------------------------------------------
'-------------------CONSOLIDÉ MINISTÉRIEL-----------------------
'---------------------------------------------------------------

Worksheets("Consolidé ministériel").Unprotect
Worksheets("Consolidé plat").Unprotect

Sheets("Contrôle_Tab").Range("A2:S140").Copy
Sheets("Consolidé ministériel").Rows("2:2").Resize(140).Insert Shift:=xlDown
Sheets("Consolidé ministériel").Range("A2:S140").PasteSpecial xlPasteAll
Sheets("Consolidé ministériel").Range("C2").Value = "Suivi " & Year(Date) & "-" & Format(Date, "mm") & "N" & " (au " & DateSerial(Year(Date), Format(Date, "mm") + 1, 0) & ")"
Sheets("Consolidé ministériel").Range("L3").Value = "Écart prévisionnel " & Year(Date) & "-" & Format(Date, "mm") & "N" & " / " & Year(Date) & "-" & Format(CDate(Year(Date) & "/" & Month(Date) - 1 & "/" & Day(Date)), "mm") & "N"

Application.CutCopyMode = False
Sheets("Consolidé ministériel").Range("A2:R140").Replace What:="#", Replacement:="="

'--------------------------------------------------------------
'-------------------------CONSOLIDÉ PLAT-----------------------
'--------------------------------------------------------------

Sheets("Contrôle_Tab").Range("A148:T180").Copy
Sheets("Consolidé plat").Rows("4:4").Resize(34).Insert Shift:=xlDown
Sheets("Consolidé plat").Range("A4:T36").PasteSpecial xlPasteAll

Application.CutCopyMode = False

Sheets("Consolidé plat").Range("F4").Value = DateSerial(Year(Date), Month(Date) + 1, 0)
Sheets("Consolidé plat").Range("F4").Copy Destination:=Sheets("Consolidé plat").Range("F5:F36")
Sheets("Contrôle_Tab").Range("G146:T146").Copy
Sheets("Consolidé plat").Range("G2:T2").PasteSpecial xlPasteAll

Sheets("Consolidé plat").Range("G2:T36").Replace What:="#", Replacement:="="

'------------------------------------------------------------------
'-----------------------------CONTROLE TAB--------------------------
'------------------------------------------------------------------

'Date de mise à jour

Sheets("Contrôle_Tab").Range("K1") = Now

Worksheets("Consolidé plat").Protect Password:=""
Worksheets("Consolidé ministériel").Protect Password:=""

Sheets("Contrôle_Tab").Activate
Sheets("Contrôle_Tab").Range("A1").Select

Application.ScreenUpdating = True

End Sub

Encore merci à vous

A++

bonjour le fil,

moi, je n'aime pas un bar de progression, j'ajoute uniquement des message au statusbar et cela au max une par seconde.

je vois par exemple

ActiveSheet.Range("A210:AC411").Select
For Each cell In Selection
    If Not cell.Locked Then
    cell.Locked = True
    End If
Next cell

ou 

ActiveSheet.Range("A210:AC411").Locked = True
   

Bonsoir,

BsAlv bonsoir !

une proposition de simplification :

'----------------------------------------------------
'------------------------ HD ------------------------
'----------------------------------------------------

Worksheets("HD").Unprotect
Sheets("HD").Range("A8:AE42").Copy
Sheets("HD").Rows("8:8").Resize(36).Insert Shift:=xlDown
Sheets("HD").Range("A8:AE42").PasteSpecial xlPasteAll
' on efface toute la plage 
Sheets("HD").Range("A8:AE42").ClearContents
Sheets("HD").Range("A8").Value = "Suivi budgétaire " & Year(Date) & "-" & Format(Date, "mm") & "N"
Sheets("HD").Range("A9").Value = Year(Date) & "-" & Format(Date, "mm") & "N"
' on "lock" toute la plage
ActiveSheet.Range("A43:AE76").Locked = True
Worksheets("HD").Protect Password:="", UserInterfaceOnly:=True
ActiveSheet.Protect AllowFiltering:=True, AllowFormattingColumns:=True
Sheets("HD").Range("A1").Select

A voir si cela fait toujours ce qui est attendu ! En fait suppression des boucles sur les cellules "individuellement", la plage est gérée en une seule fois.
Les autres boucles sont faites sur le même principe, alors...

@ bientôt

LouReeD

Bonjour,

J'ai ajusté ma macro, ça l'a rendue plus souple.

Merci à vous tous

Rechercher des sujets similaires à "barre progression"