cs_Gendarmette
Messages postés104Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention14 janvier 2004
-
13 juin 2003 à 13:18
cs_Gendarmette
Messages postés104Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention14 janvier 2004
-
13 juin 2003 à 15:25
Voici mon programme (désolé de vous imposer ça !)
'Lister le contenu de 2 répertoires dans 2 tableaux (1 tableau par répertoire) _
(noms et dernières dates de modificaton des fichiers)
Public oFs, oFs2 As Scripting.FileSystemObject
Public oFolder, oFolder2 As Scripting.Folder
Public oSubFolder, oSubFolder2 As Scripting.Folder
Public oFile, oFile2 As Scripting.File
Private Fichier(100, 1) As String
Private Fichier2(100, 1) As String
Private Fichier3(100, 1) As String
Const FichierNom = 0
Const DateFichier = 1
Private Sub BtQuitter_Click()
Form2.Hide
Form1.Show
End Sub
Private Sub BtStart_Click()
Dim sFolder As String
Set oFs = CreateObject("Scripting.FileSystemObject")
sFolder = "D:\Christine\Rep1"
Rechercher_Fichiers sFolder
Rechercher_Tout sFolder
Dim sFolder2 As String
Set oFs2 = CreateObject("Scripting.FileSystemObject")
sFolder2 = "D:\Christine\Rep2"
Rechercher_Fichiers2 sFolder2
Rechercher_Tout2 sFolder2
MsgBox "Les deux répertoires ont été listés : " & List1.ListCount & " fichier(s) trouvé(s) dans " & sFolder & " et " & List2.ListCount & " fichier(s) trouvé(s) dans " & sFolder2
End Sub
Private Sub Rechercher_Fichiers(sFolder As String)
Dim i As Integer
i = 0
Set oFolder = oFs.GetFolder(sFolder)
For Each oFile In oFolder.Files
List1.AddItem oFile.Name
Fichier(i, FichierNom) = oFile.Name
Fichier(i, DateFichier) = oFile.DateLastModified
i = i + 1
Next
End Sub
Private Sub Rechercher_Fichiers2(sFolder2 As String)
Dim j As Integer
j = 0
Set oFolder2 = oFs2.GetFolder(sFolder2)
For Each oFile2 In oFolder2.Files
List2.AddItem oFile2.Name
Fichier2(j, FichierNom) = oFile2.Name
Fichier2(j, DateFichier) = oFile2.DateLastModified
j = j + 1
Next
End Sub
Private Sub Rechercher_Tout(sFolder As String)
Dim sName As String
Set oFolder = oFs.GetFolder(sFolder)
For Each oSubFolder In oFolder.SubFolders
sName = sFolder & oSubFolder.Name & ""
Rechercher_Fichiers sName
Rechercher_Tout sName
Next
End Sub
Private Sub Rechercher_Tout2(sFolder2 As String)
Dim sName2 As String
Set oFolder2 = oFs2.GetFolder(sFolder2)
For Each oSubFolder2 In oFolder2.SubFolders
sName2 = sFolder2 & oSubFolder2.Name & ""
Rechercher_Fichiers2 sName2
Rechercher_Tout2 sName2
Next
End Sub
Private Sub BtComparer_Click()
Dim MaxTableauSource1 As Integer
Dim MaxTableauSource2 As Integer
Dim i As Integer
' Compteur Fichier1
Dim j As Integer
' Compteur Fichier2
Dim n As Integer
' Compteur Fichier3
For i = 0 To MaxTableauSource1
For j = 0 To MaxTableauSource2
If Fichier(i, FichierNom) = Fichier2(j, FichierNom) Then
If Fichier(i, DateFichier) < Fichier2(j, DateFichier) Then
Fichier3(n, 0) = Fichier2(j, FichierNom)
Fichier3(n, 1) = Fichier2(j, DateFichier)
FileCopy SourceFile2, DestinationFile2
ElseIf Fichier(i, DateFichier) > Fichier2(j, DateFichier) Then
Fichier3(n, 0) = Fichier(i, FichierNom)
Fichier3(n, 1) = Fichier(i, DateFichier)
FileCopy SourceFile1, DestinationFile1
End If
ElseIf Fichier(i, FichierNom) <> Fichier2(j, FichierNom) Then
Fichier3(n, 0) = Fichier(i, FichierNom)
Fichier3(n, 1) = Fichier(i, DateFichier)
FileCopy SourceFile1, DestinationFile1
Fichier3(n, 0) = Fichier2(j, FichierNom)
Fichier3(n, 1) = Fichier2(j, DateFichier)
FileCopy SourceFile2, DestinationFile2
End If
Next j
ProgressBar1.Value = i
Next i
Label2.Visible = True
'Tableau avec MSGridFlex (2 colonnes)
Dim x As Integer
Flex.Row = 1
Flex.TextMatrix(0, 0) = "Nom du fichier"
Flex.TextMatrix(0, 1) = "Dernière modification"
Flex.ColWidth(0) = 2000
Flex.ColWidth(1) = 1850
For x = 0 To 100
Flex.AddItem Fichier3(x, 0) & vbTab & Fichier3(x, 1)
Next
Label3.Visible = True
Flex.Visible = True
End Sub
Fichier représente le tableau contenant les fichiers du premier répertoire (Rep1 qui contient les fichiers Doc.txt, Doc1.doc, Doc2.doc et Doc3.doc)
Fichier2 représente le tableau contenant les fichiers du second répertoire (Rep2 qui contient les fichiers Doc1.doc, Doc2.doc et Doc3.doc)
Les fichiers Doc1.doc, Doc2.doc et Doc3.doc sont les mêmes dans les 2 répertoires, seule leur date de dernière modification change.
Fichier3 est un tableau qui « trie » Rep1 et Rep2. 2 fichiers au nom identique ne peuvent pas apparaître dans Fichier3, seul le fichier à la date de modification la + récente apparaît.
Le tableau MSGridFlex me permet d’afficher Fichier3 sur ma form active.
Les fichiers contenus dans Fichier3 sont copiés / collés dans le répertoire final (DestinationFile).
Je rencontre différents problèmes :
Seul le Doc3.doc de Rep2 apparaît dans le tableau MSFlexGrid
Les seuls fichiers copiés / collés dans le répertoire final sont Doc.txt et le Doc3.doc du Rep2
Il doit y avoir une erreur dans ma boucle mais je ne la trouve pas.
Si quelqu’un a le courage de lire tout ça et de me proposer une solution, je lui en serai très reconnaissante !
UnExPeCtEdSpy
Messages postés139Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention 3 juillet 2003 13 juin 2003 à 13:41
Re
Visiblement tu as deux soucis.....
Premierement :
Tu initialises SourceFile1 etc Hors de la boucle
SourceFile1 = "D:\Christine\Rep1" & Fichier(i, FichierNom) (...)
Donc c'est variable string prendront une valeur qui restera toujours la meme dans toute te fonction
et quand tu crois copier les bon fichier dans ta boucle avec
FileCopy SourceFile1, DestinationFile2
en fait tu copie toujours le meme (idem pour tout les dource et destination...)
donc A INTEGRER LE NOM DES FICHIERS EN DYNAMIQUE DANS TA BOUCLE/b.
Ensuite :
Tu utilises une belle variable n dans
Fichier3(n, 0) = Fichier(i, FichierNom) et cet index tu ne le géres pas
donc INTEGRER UNE INCREMENTATION DE L'INDEX n/b
UnExPeCtEdSpy
Messages postés139Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention 3 juillet 2003 13 juin 2003 à 14:59
Voila en gras ce que moi concretement je te proposais :
Private Sub BtComparer_Click()
Dim MaxTableauSource1 As Integer
Dim MaxTableauSource2 As Integer
Dim i,j,n As Integer
Dim SourceFile, DestinationFile As String
MaxTableauSource1 = UBound(Fichier)
MaxTableauSource2 = UBound(Fichier2)
ProgressBar1.Min = 0
ProgressBar1.Max = MaxTableauSource1
ProgressBar1.Value = 0
For i = 0 To MaxTableauSource1
For j = 0 To MaxTableauSource2
If Fichier(i, FichierNom) = Fichier2(j, FichierNom) Then
If Fichier(i, DateFichier) < Fichier2(j, DateFichier) Then
Fichier3(n, 0) = Fichier2(j, FichierNom)
Fichier3(n, 1) = Fichier2(j, DateFichier)
n = n+1
SourceFile = "D:\Christine\Rep2" & Fichier2(j, FichierNom)
DestinationFile = "D:\Christine\Rapport" & Fichier2(j, FichierNom)
FileCopy SourceFile, DestinationFile
ElseIf Fichier(i, DateFichier) > Fichier2(j, DateFichier) Then
Fichier3(n, 0) = Fichier(i, FichierNom)
Fichier3(n, 1) = Fichier(i, DateFichier)
n = n+1
SourceFile = "D:\Christine\Rep1" & Fichier(i, FichierNom)
DestinationFile = "D:\Christine\Rapport" & Fichier(i, FichierNom)
FileCopy SourceFile, DestinationFile
End If
ElseIf Fichier(i, FichierNom) <> Fichier2(j, FichierNom) Then
Fichier3(n, 0) = Fichier(i, FichierNom)
Fichier3(n, 1) = Fichier(i, DateFichier)
n = n+1
FileCopy SourceFile1, DestinationFile1
Fichier3(n, 0) = Fichier2(j, FichierNom)
Fichier3(n, 1) = Fichier2(j, DateFichier)
n = n+1SourceFile "D:\Christine\Rep2" & Fichier2(j, FichierNom) DestinationFile "D:\Christine\Rapport" & Fichier2(j, FichierNom)
FileCopy SourceFile, DestinationFile
End If
Next j
ProgressBar1.Value = i
Next i
Label2.Visible = True
'Tableau avec MSGridFlex (2 colonnes)
Dim x As Integer
Flex.Row = 1
Flex.TextMatrix(0, 0) = "Nom du fichier"
Flex.TextMatrix(0, 1) = "Dernière modification"
Flex.ColWidth(0) = 2000
Flex.ColWidth(1) = 1850
For x = 0 To n-1
Flex.AddItem Fichier3(x, 0) & vbTab & Fichier3(x, 1)
Next
Label3.Visible = True
Flex.Visible = True
End Sub
Par contre, je m'apperçois d'un truc dans ta logique..
le dernier if:
ElseIf Fichier(i, FichierNom) <> Fichier2(j, FichierNom) Then
En regardant la succession de tes test dans la boucle, j'en déduis que le dernier if ne sera jamais vrai cer pour y arriver il faut que la deux premier soit vrai dont l'égualité au début !!
A mon avis, ça marchera pas comme tu voudra et c'est la qu'il va falloir creuser, ceux qui sont présent dans A et B tu prend celui dont la date te conviens, par contre ceux qui non pas de doublon dans A ou dans B les copier tel quelle dans le repertoire. La logique précédente marché mieux a mons avis, en passant avec ce code là tu as perdu des choses ...
bon courage c'est loin d'être fini lol pourtant le pb est assez simple
cs_Gendarmette
Messages postés104Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention14 janvier 2004 13 juin 2003 à 15:25
Ton code devrait bien m'aider, je vais faire un mix des 2.
C'est vrai qu'au départ l'idée est simple mais pour l'appliquer...
Et pis ça fait même pas 4 semaines que je fais du VB et je suis plutôt fière de moi = )
Merci beaucoup pour ton aide!