Pb dans 1 boucle (je crois)

Signaler
Messages postés
104
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
14 janvier 2004
-
cs_Gendarmette
Messages postés
104
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
14 janvier 2004
-
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

Dim SourceFile1, SourceFile2, DestinationFile1, DestinationFile2 As String
SourceFile1 = "D:\Christine\Rep1" & Fichier(i, FichierNom)
SourceFile2 = "D:\Christine\Rep2" & Fichier2(j, FichierNom)
DestinationFile1 = "D:\Christine\Rapport" & Fichier(i, FichierNom)
DestinationFile2 = "D:\Christine\Rapport" & Fichier2(j, FichierNom)

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)
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 !

Merci d’avance

>:) Gendarmette >:)

4 réponses

Messages postés
139
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
3 juillet 2003

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

Ensuite tu y verras déjà plus clair...

A+

,.~*`'^~.(^. :question) .^),.~^'`*~.
Messages postés
104
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
14 janvier 2004

G essayé d'incrementer n ms sans succés.
Pr le 1er probleme, ça plante (indice en dehors de la plage) quand je met le nom d fichiers ds la boucle.

>:) Gendarmette >:)
Messages postés
139
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
3 juillet 2003

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

,.~*`'^~.(^. :question) .^),.~^'`*~.
Messages postés
104
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
14 janvier 2004

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!

>:) Gendarmette >:)