sfab41
Messages postés28Date d'inscriptionvendredi 27 mars 2009StatutMembreDernière intervention 9 juillet 2009
-
6 mai 2009 à 12:55
sfab41
Messages postés28Date d'inscriptionvendredi 27 mars 2009StatutMembreDernière intervention 9 juillet 2009
-
6 mai 2009 à 22:57
Bonjour!
J'ai fais une macro qui me permet de mettre à jour une liste à partir d'un dossier en 2 temps
1) pour chaque cellule de la plage, si le contenu n'est pas retrouvé dans les noms de fichier du dossier alors suppression contenu cellule
2) pour chaque fichier du dossier, si le nom n'est pas retrouvé dans la plage, alors copie du nom dans celle-ci
Voilà le code:
Private Sub CommandButton2_Click()
'Met la liste à jour où indique que c'est déjà fait
Dim fs As Object, objShell As Object, strFileName As Object
Dim objFolder As Folder
Dim reference
Dim comptage
Dim source
source = GetSetting("Mes paramètres", "Label1", "Valeur Label1")
Set fs = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(source)
reference = Range("D7").Value
With Worksheets(1).Range("D8:D500")
For Each cell In Range("D8:D500")
If Not IsEmpty(cell) Then
If cell.Font.ColorIndex = 3 Then
With Application.FileSearch
.NewSearch
.LookIn = source
.SearchSubFolders = False
.FileName = cell.Value
.Execute
If .FoundFiles.Count = 0 Then cell.ClearContents
End With
End If
End If
Next
End With
With Application.FileSearch
.NewSearch
.RefreshScopes
.SearchSubFolders = False
.FileTypes.Add msoFileTypeAllFiles
.FileType = msoFileTypeAllFiles
.LookIn = source
comptage = .Execute(SortBy:=msoSortByLastModified, SortOrder:=msoSortOrderAscending, AlwaysAccurate:=True)
If reference = comptage Then
MsgBox ("Déjà à jour !!!"), vbInformation
Else: For Each strFileName In objFolder.Items
With Worksheets(1).Range("D8:D500")
Set recherche0 = .Find(strFileName, Lookat:=xlWhole)
If recherche0 Is Nothing Then Range("D5").Value = strFileName
End With
Next
End If
End With
Range("D2").Select
End Sub
Note : S'il y a possibilité d'élaguer je suis preneur.
Le problème que je rencontre est le suivant : je souhaite avoir une progressbar qui correspond au temps de déroulement de la macro. Je sais qu'il faut incrémenter mais je n'ai absolument aucune idée de comment le faire.
Pourrais-je avoir un coup de main sur ce coup?
jmf0
Messages postés1566Date d'inscriptionmardi 26 décembre 2000StatutMembreDernière intervention 5 avril 20138 6 mai 2009 à 20:07
Bonsoir,
on ne compte en général pas le temps écoulé (car lié à la rapidité de ta machine), mais le nombre de traitement effectués.
Tu peux fort bien :
- mettre à 0 la propriété min de ta progressbar
- commencer par déterminer le nombre de fichiers contenus dans le dossier et définir à ce nombre la propriété max de ta progressbar
- faire progresser la propriété value de ta progressbar de 1 à chaque fin de traitement de ta 2èeme étape
Si tu y tiens : tu peux faire quelquechose d'identique pour ton 1er traitement (max = nombre de cellules et tu avances de 1 la propriété Value pour chaque cellule traitée ...)
tout cela est simple.
jmf0
Messages postés1566Date d'inscriptionmardi 26 décembre 2000StatutMembreDernière intervention 5 avril 20138 6 mai 2009 à 22:47
Quel lien avec la cellule traitée ?
Ta boucle for .... next traite toutes les cellules de ta plage, cellule par cellule.
Tu n'as nullement à te préoccuper de quelle cellule il s'agit. Chaque fois que ta boucle arrive au next (qui veut dire suivant), tu passes à la cellule suivante (et tu as donc traité une cellule de plus)
Tu dois donc augmenter de 1 unité la propriété Value de ta progressbar...
où est le problème ?
et qu'est cette affaire de i = i + 1 dans ta boucle For i.... Next ?
J'ai la malheureuse impression que tu as surtout à apprendre le fonctionnement (simple) d'une boucle for ...
Ton aide en ligne est à consulter (et elle est on ne peut plus claire sur ce point !!!)
bonne étude
sfab41
Messages postés28Date d'inscriptionvendredi 27 mars 2009StatutMembreDernière intervention 9 juillet 2009 6 mai 2009 à 20:24
Merci de me répondre jmf0.
En fait, j'avais exactement le même raisonnement en tête, mais je débute en programmation et je ne sais pas comment incrémenter à chaque fin de cellule traitée par exemple.
Avec un exemple expliqué je m'en sortirai, mais il me faudrait juste une base.
sfab41
Messages postés28Date d'inscriptionvendredi 27 mars 2009StatutMembreDernière intervention 9 juillet 2009 6 mai 2009 à 22:28
J'aurais bien mis le système d'incrémentation à cet endroit mais c'est la procédure que je ne sais pas écrire.
En cherchant, j'ai ressorti des éléments du type :
For i = 1 To 100
i = i + 1
UserForm1.ProgressBar1.Value = UserForm1.ProgressBar1.Value + 1
Seulement, je ne vois vraiment pas comment peut-être fait le lien avec la cellule traitée. Merci de votre aide.
sfab41
Messages postés28Date d'inscriptionvendredi 27 mars 2009StatutMembreDernière intervention 9 juillet 2009 6 mai 2009 à 22:57
Bon et bien en fait c'était on ne peu plus simple. Désolé d'avoir dérangé avec ce souci puisque je m'étais seulement embrouillé avec les "i" qui n'étaient même pas nécessaire.
Pour le reste, j'ai bien compris le système de boucle mais je ne pensais pas qu'en écrivant simplement "UserForm1.ProgressBar1.Value = UserForm1.ProgressBar1.Value + 1" ça incrémenterait.