Intégration d'une barre de progression dans le déroulement d'une suite de macro
jackypirate
Messages postés3Date d'inscriptionvendredi 21 novembre 2008StatutMembreDernière intervention16 décembre 2008
-
11 déc. 2008 à 16:49
jackypirate
Messages postés3Date d'inscriptionvendredi 21 novembre 2008StatutMembreDernière intervention16 décembre 2008
-
16 déc. 2008 à 11:06
Bonjour
Travaillant dans une brasserie, j'ai crée classeur Excel qui me permet de rentrée différente information au courant de la semaine passée (Volumes soutirés, consommables utilisés, personnel présent, exct.....). En fin de semaine, par l'intermédiaire d’une macro, je sauvegarde dans un dossier le classeur en court et je crée un nouveau classeur vierge de donnés pour la semaine suivante. Mon problème, le déroulement de ma macro étant assez longue, comment intégré une macro Progress Bar qui me montre l'avancement de l’exécution de ma macro de sauvegarde. J'ai une maro Progress Bar téléchargée sur le site qui fonctionne seule, mais je ne sais pas comment l'intégré dans la mienne.
A voir également:
Barre de progression pendant l'exécution d'une macro
jackypirate
Messages postés3Date d'inscriptionvendredi 21 novembre 2008StatutMembreDernière intervention16 décembre 2008 11 déc. 2008 à 21:54
Bonjour Orohena
Merci pour l'intérêt porté à ma question
La macro téléchargé fonctionne avec un contrôle Frame, contrôle Label et un 3 ème contrôle Label pour l'affichage en pourcentage de la progression.
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 11 déc. 2008 à 23:25
Salut,
Ci-dessous une fonction qui te permetra de piloter une progressbar: Cette fonction fonctionne avec un userform qui contient 2 controles label et un controle progressbar. Note que le poucentage de progression apparait dans la barre de titre de la form.
la forme s'appel ProgressBar
le premier label s'appel ActionEnCours
le second labe s'appel SousActionEnCours
Cette fonction est a mettre dans un module
Function UpdtProgressBar(Optional Msg1ProgressBar As String, Optional Msg2ProgressBar As String, Optional Target As Long, Optional MyTimer As Double 0, Optional MyStep As Long 0, Optional NumberOfStep As Long = 1)
Dim PrgBar As Long
With ProgressBar 'Ma form If Msg1ProgressBar "" Then Msg1ProgressBar .ActionEnCours.Caption
.ActionEnCours.Caption = Msg1ProgressBar 'le premier label
.SousActionEnCours.Caption = Msg2ProgressBar ' le second label
If Not MyStep = 0 Then 'si pas de d'etape intermediaire on prend alors en compte uniquement la valeur objective reçu
' la progressbar attend un long ors le nombre d'etape n'est peut etre pas un multiple de la valeur objective
' il va donc falloir adapter la valeur pour atteindre la valeur objective uniquement par des longs
' par exemple si la valeur objective est 5 et qu'il y a 3 etapes les valeurs de ces etapes seront : 1 2 2 ' autre exemple: Target 9, NumberOfStep 4 donc MyStep vaudra dans l'ordre de passage 2 2 2 3
If MyStep <= NumberOfStep - (Target Mod NumberOfStep) Then
PrgBar = Int(Target / NumberOfStep)
Else
PrgBar = Int(Target / NumberOfStep) + 1
End If
Else
PrgBar = Target
End If
If .ProgressBar1.Value + PrgBar > .ProgressBar1.Max Then
.ProgressBar1.Value = .ProgressBar1.Max
Else
.ProgressBar1.Value = .ProgressBar1.Value + PrgBar
End If
.Caption = "Processing " & .ProgressBar1.Value & "%"
End With
DoEvents
If MyTimer > 0 Then
Dim start As Double
start = Timer ' Set start time.
Do While Timer < start + MyTimer
DoEvents ' Yield to other processes.
Loop
End If
End Function
Comment l'utiliser :
1\ tu dois definire les etapes de deroulement de ton code pour determiner les endoits ou tu vas appeler cette fonction.
2\ definir la valeur maxi de du controle progressbar en generale jutilise 100 pour 100%
3\ definir la valeur de progression de chaque etape en generale je divises la valeur maxi par le nombre d'etape pour determiner la valeur de progression moyenne. Pourquoi moyenne et bien de temps en temps je vais donner moins de poid a certaines etapes et plus de poid a d'autres. Par exemple si tu a 10 etapes la moyenne sera de 10% mais tu peux considerer que certaines etapes ne valent que 5% de la progression et que d'autres valent 15%.
4\ utiliser la fonction ci-dessus a chaque etape dans ton code.
Dans l'exemple suivant je crees la liste des fichiers a copier par une recherche dans le repertoire specifier et sur un server, puis je copies ces fichiers dans le repertoir temp de l'utilisateur
A mettre dans un module cela peut etre le meme que le module de la fonction
Option Explicit
Dim ListFiles() As String
Sub start()
ProgressBar.Show
End Sub
Sub CreationListFiles()
Dim i As Long, FolderPath As String, NbFiles As Long, PartFileName As String
UpdtProgressBar "Connecting to the server...", , 5
'path
FolderPath = "\\server\Data\Public\R&D\Activity TimesSheet" '<---- a modifier
If Right(FolderPath, 1) <> "" Then FolderPath = FolderPath & "" '<---- a modifier
' the files will be reconize by the following string
PartFileName = "Activity_TimesSheet_"
' search for the files
On Error Resume Next
With Application.FileSearch
.NewSearch
.LookIn = FolderPath 'Look in path
.Filename = PartFileName & "*.xls" 'all files names that contain this string will be selected
.SearchSubFolders = False
.Execute
NbFiles = .FoundFiles.Count 'how many files ?
If NbFiles = 0 Then 'if finally no file found
MsgBox "Cannot find any file. Please, check the path specified. ", vbCritical, "Files error..."
Exit Sub
End If
ReDim ListFiles(NbFiles) 'we dimension the table according the file(s) number
'Write the file(s) infos
For i = 1 To NbFiles 'for each files found
ListFiles(i) = .FoundFiles(i)
UpdtProgressBar "Creating files list...", "File: " & Replace(LCase(.FoundFiles(i)), LCase(FolderPath & PartFileName), ""), 45, 0.05, i, NbFiles
Next i
.LookIn = ""
End With
UpdtProgressBar , ""
CopyFiles
End Sub
Sub CopyFiles()
Dim i As Long, TmpPath As String, FileNumber As Long
'we take the path of the current user temp directory
TmpPath = Environ("TEMP") & "\Activity Time Synthesis"
FileNumber = UBound(ListFiles())
If Dir(TmpPath, vbDirectory) = "" Then MkDir TmpPath
For i = 1 To FileNumber
UpdtProgressBar "Copying files " & Dir(ListFiles(i)), "To: " & TmpPath, 50, , i, FileNumber
On Local Error Resume Next
FileCopy ListFiles(i), TmpPath & Dir(ListFiles(i)) If Err 0 Then ListFiles(i) TmpPath & Dir(ListFiles(i))
Next
End Sub
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 11 déc. 2008 à 23:42
ok, la macro que tu as téléchargée doit faire à peu près comme le Sub Demo() ci-dessous. Je te propose de l'essayer. Tu peux le paramétrer selon tes préférences, je t'ai indiqué les paramètres par des commentaires.
Sub demo()
Dim i As Double
barreProgression action:="CREER"
For i = 0 To 100 Step 0.5
DoEvents
barreProgression action:="METTRE_A_JOUR", pourcentage:=i
Next
barreProgression action:="SUPPRIMER"
End Sub
<hr />
Sub barreProgression(ByVal action As String, Optional pourcentage As Double)
Dim s As Shape
Dim pc As Double
Dim couleur As Long
Static large As Integer
' Paramètres
Const HAUTEUR_BARRE = 10 ' hauteur de la barre de progression en points
Const LARGEUR_INFO = 30 ' largeur de la barre de progression en points
Const MARGE = 20 ' largeur de la marge latérale en points
Const MARGE_INFERIEURE = 40 ' hauteur de la marge inférieure en points
Const TAILLE_CARACTERE = 8 ' taille de la police de caractères
couleur = RGB(128, 128, 128) ' couleur de la zone variable de la barre de progression
Select Case action
Case "CREER"
Dim bas As Integer
large = ActiveWindow.UsableWidth - 2 * MARGE - LARGEUR_INFO
bas = ActiveWindow.UsableHeight - MARGE_INFERIEURE
For Each s In ActiveSheet.Shapes
If Left(s.Name, 6) = "progb_" Then s.Delete
Next
ActiveSheet.Shapes.AddShape(msoShapeRectangle, MARGE, bas, large, HAUTEUR_BARRE).Select
Selection.Name = "progb_cadre"
ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, large + MARGE - LARGEUR_INFO, bas, _
LARGEUR_INFO, HAUTEUR_BARRE).Select
Selection.Name = "progb_info"
Selection.Characters.Font.Size = TAILLE_CARACTERE
Selection.HorizontalAlignment = xlCenter
ActiveSheet.Shapes.AddShape(msoShapeRectangle, MARGE, bas, 0, HAUTEUR_BARRE).Select
With Selection
.ShapeRange.Fill.ForeColor.RGB = couleur
.ShapeRange.Line.Visible = msoFalse
.Name = "progb_curseur"
End With
Case "SUPPRIMER"
For Each s In ActiveSheet.Shapes
If Left(s.Name, 6) = "progb_" Then s.Delete
Next
Case "METTRE_A_JOUR"
pc = IIf(Abs(pourcentage) > 100, 100, Abs(pourcentage))
ActiveSheet.Shapes("progb_curseur").Width = (large - LARGEUR_INFO) * pourcentage / 100
ActiveSheet.Shapes("progb_info").TextFrame.Characters.Text = Fix(pc) & "%"
Case Else
MsgBox "Le parametre action est invalide"
End Select
End Sub
Amicalement
Vous n’avez pas trouvé la réponse que vous recherchez ?
jackypirate
Messages postés3Date d'inscriptionvendredi 21 novembre 2008StatutMembreDernière intervention16 décembre 2008 16 déc. 2008 à 11:06
Salut
Je reviens à mon problème, qui n'ai toujours pas résolut. J'ai testé les deux codes sans résultat (code de Bigfish_le vrai et de Orohena merci encore à vous 2).
Pour faire plus facile j'ai copié le code dans lequel j'aimerais intégrer une barre de progression, ce code se déroule en 5 étapes.
1_ copie des données graphiques
2_création de la nouvelle semaine
3_éffacement des données
4_sauvegarde sur le server (lecteur partagé N)
5_fermeture de la semaine
LecteurRéseauPasConnecté: Select Case MsgBox("Voulez-vous vous connecter au lecteur réseau N. Login KI00087 - Mot de passe K2pl56018", vbYesNo)
Case vbYes
MyAppID = Shell("D:\LOCAL\PLUS_IBD\NewLogin\LoginBK")
Sauvegarde_sur_N
Case vbNo
ActiveWorkbook.Protect "8973", Structure:=True, Windows:=False
ActiveWorkbook.Save
End Select