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 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 SubPas 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 SubDans 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"
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 SubLa 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.afficherDans le module 1 on a appelé l'userform_barre progression.afficher
Sub afficher()
Me.Show 0
End SubIci 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 iPour 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 SubBarre. 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 iPause 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 SubEn 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 iPause 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 MeN'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
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
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 SubEncore 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").SelectA 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
