Classement fichiers

Résolu
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006 - 4 mars 2006 à 00:33
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 9 mars 2006 à 22:44
Bonsoir à tous,
Mon boss m'a confié une 'mission'; le genre de truc impossible vu mon niveau VBA actuel. Aussi, j'en appelle aux maîtres du code ; aux dieux des modules (j'en fais pas trop ? ).
Plus sérieusement, mon problème est le suivant :
j'ai un grand nombre de fichiers déposés dans un dossier. Fichiers du type :
BARDIN_02968_01_2004_JUILLET_H.zip
Le nom du client est de longueur variable
le 1er code est sur 5 position
le 2ème sur 2 positions (pas besoin)
le mois (variable en longueur donc)
une lettre et une extension zip. (pas besoin non plus)
Ma mission donc serait de créer une macro qui permettre d'automatiser le classement de ces fichiers dans des dossiers du type :

Après de longues et fastidieuses recherches (je suis pas un pro je le rappelle) j'ai réussi à créer une macro qui m'extrait le nom de chacun des fichiers puis qui déconcatène (ça se dit ?) le nom trouvé.
Reste le plus dur pour moi... passer ces éléments en paramètres pour 'ventiler' les fichiers dans les bons répertoires... si toutefois c'est la bonne piste ...
Bref, si quelqu'un a ne serait ce qu'un début de solution... je prends !
Un grand merci par avance au forum !

14 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
7 mars 2006 à 15:13
Re,
Ok j'ai compris cette fois, j'ai adapter une partie du code donné ci-dessus.
On va parcourir tout les fichiers se trouvant dans ton répertoire et les déplacer en utilisant une boucle
sRoot est ton dossier où se trouve tes fichiers,

8<--------------------------------------------------------

Dim sRoot As String
sRoot = App.Path
If Right$(sRoot, 1) <> "" Then sRoot = sRoot & ""


Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

For Each file In fso.GetFolder(sRoot).Files
Dim sFile As String
sFile = GetFilename(file)
DeplaceFichier sRoot, sFile
Next

Set fso = Nothing
-------------------------------------------------------->8

Sub DeplaceFichier(root As String, fichier As String)

Dim sNomClient As String
Dim sCode1 As String
Dim sMois As String
Dim sAnnee As String

'Décomposition de la chaine
Dim sTab() As String
sTab = Split(fichier, "_")

'Récupération des chaines
sNomClient = sTab(0)
sCode1 = sTab(1)
sMois = GetOrdinal(sTab(4))
sAnnee = sTab(3)


Name root & fichier As root & sNomClient & " " & sCode1 & "" & sAnnee & "" & sAnnee & sMois & "" & fichier

End Sub


'''Retourne le numéro correspondant au mois
Function GetOrdinal(mois As String) As String


Dim sOrdinal As String
Dim sMois As String
sMois = LCase(mois)


Select Case sMois

Case "janvier": sOrdinal = "01"
Case "fevrier", "février": sOrdinal = "02"
Case "mars": sOrdinal = "03"
Case "avril": sOrdinal = "04"
Case "mai": sOrdinal = "05"
Case "juin": sOrdinal = "06"
Case "juillet": sOrdinal = "07"
Case "aout", "août": sOrdinal = "08"
Case "septembre": sOrdinal = "09"
Case "octobre": sOrdinal = "10"
Case "novembre": sOrdinal = "11"
Case "décembre", "decembre": sOrdinal = "12"

End Select

GetOrdinal = sOrdinal


End Function

Il se peut que tu ais à faire quelques modifs avec la fonction name....après adapte pour tes besoins
J'espère que c'est ok cette fois
3
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
4 mars 2006 à 01:18
Bonsoir,
Avec la capture on verrait mieux pour comprendre :) Met la en ligne sur compte d'un hebergeur.
J'avoue ne pas avoir saisis grand chose
0
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006
4 mars 2006 à 02:23
Bin, je vois pas trop comment expliquer ça autrement...

Ca te semble plus clair ???????
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
4 mars 2006 à 02:36
Ton fichier est en local nous sur le forum on ne voit rien


Je peux meme te donner son emplacement sur ton pc: file:///C:/Documents%20and%20Settings/Perso/Mes%20documents/Mes%20images/Temp/Sans%20titre.JPG
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
4 mars 2006 à 08:44
Salut,

Ce que veut dire Willi, c'est que nous ne voyons pas ton image car elle se trouve sur TON disque.
Si tu possèdes un site perso, places ton image dessus, et fait pointer ton lien vers cette image.

Ou bien crée-toi rapidement un p'tit compte de dépot sur un hébergeur gratuit, et places-y ta photo.



Dernière solution pour expliciter ton problème : des mots.

Manu
0
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006
5 mars 2006 à 00:34
Bonjour Willi, Manu, le Forum,

Désolé... j'avais pas compris le pb
Mon image est dispo sur http://www.monsite.com/my-redge
J'espère qu'elle sera suffisamment explicite !
Encore merci pour votre aide
0
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006
5 mars 2006 à 00:41
Re,
Fallait plutôt lire http://www.tonsite.com/my-redge
Quand ça veut pas...
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 mars 2006 à 13:25
Salut,
Ce que je te propose c'est simplement la création de l'arborescence de tes dossiers comme dans la capture que tu as joinds. Je pense que c'était juste sa ton problème si j'ai tout compris.

Alors comme tu vois dans l'exemple ci-dessous j'ai simulé une liste de nom.
Cette liste passe dans la méthode MakeTrees qui va se charger de construire l'arborescence des dossiers comme sur ta capture.
La méthode GetOrdinal te donnes le numéro du mois lui correspondant.

J'ai utilisé un bouton Command1 pour tester, adapte après selon ton cas.
sRootPath que j'initialise dans le form_load correspond au répertoire de ton appli. C'est dans celui-ci que l'arborescence va se construire.

J'ai également commenté la méthode MakeTrees pour que tu comprennes les étapes de la construction de l'arborescence.

8<--------------------------------------------------------------------------
Dim sRootPath As String



Private Sub Command1_Click()


Dim TabListNom As New Collection

TabListNom.Add "BARDIN_02968_01_2004_JUILLET_H"
TabListNom.Add "BARDIN_02968_01_2004_AOUT_H"
TabListNom.Add "DUPONT_01234_10_2001_JANVIER_H"
TabListNom.Add "BARDIN_04150_05_2006_MARS_H"

MakeTrees TabListNom


End Sub


Private Sub Form_Load()


sRootPath = App.path & ""


End Sub


Sub MakeTrees(TaListe As Collection)


Dim i As Integer

Dim sNomClient As String
Dim sCode1 As String
Dim sMois As String
Dim sAnnee As String


For i = 1 To TaListe.Count

'Décomposition de la chaine
Dim sTab() As String
sTab = Split(TaListe(i), "_")

'Récupération des chaines
sNomClient = sTab(0)
sCode1 = sTab(1)
sMois = GetOrdinal(sTab(4))
sAnnee = sTab(3)

'Création du répertoire client si existe pas
If Dir(sRootPath & sNomClient & " " & sCode1, vbDirectory) = "" Then MkDir sRootPath & sNomClient & " " & sCode1

'Création du sous-répertoire annéee si existe pas
If Dir(sRootPath & sNomClient & " " & sCode1 & "" & sAnnee, vbDirectory) = "" Then MkDir sRootPath & sNomClient & " " & sCode1 & "" & sAnnee

'Création du sous sous répertoire annéee + mois si existe pas
If Dir(sRootPath & sNomClient & " " & sCode1 & "" & sAnnee & "" & sAnnee & sMois, vbDirectory) = "" Then MkDir sRootPath & sNomClient & " " & sCode1 & "" & sAnnee & "" & sAnnee & sMois

Next

End Sub


'''Retourne le numéro correspondant au mois
Function GetOrdinal(mois As String) As String


Dim sOrdinal As String
Dim sMois As String
sMois = LCase(mois)


Select Case sMois

Case "janvier": sOrdinal = "01"
Case "fevrier", "février": sOrdinal = "02"
Case "mars": sOrdinal = "03"
Case "avril": sOrdinal = "04"
Case "mai": sOrdinal = "05"
Case "juin": sOrdinal = "06"
Case "juillet": sOrdinal = "07"
Case "aout", "août": sOrdinal = "08"
Case "septembre": sOrdinal = "09"
Case "octobre": sOrdinal = "10"
Case "novembre": sOrdinal = "11"
Case "décembre", "decembre": sOrdinal = "12"

End Select

GetOrdinal = sOrdinal


End Function

-------------------------------------------------------------------------->8

Bon courage
0
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006
5 mars 2006 à 23:28
Salut,

Bin non... mon objectif n'est pas de créer une arborescence... car elle existe déjà...
En fait mon "but" est de créer une routine qui va déplacer les fichiers du dossier d'origine dans les dossiers d'historique correspondants.
Au fil de mes recherches j'ai vu qu'il existait une instruction "name" ex :
Sub test()
Name "d:Classeur4.XLS" As "d:AutreRepClasseur4.xls"
End Sub
Mon problème est lié à la récupération des éléments constitutifs du nom de fichier pour les passer en paramètres dans l'instruction ('name' si c'est la bonne...) pour déplacer les fichiers correspondants dans les bons dossier (qui eux sont existant).

Cela dit, ton code va peut être m'aider dans la recherche de la bonne arborescence... je vais m'y atteler...
Peux tu m'apporter des éléments liés à l'utilisation de name ou movefile...
Merci pour ton aide
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 mars 2006 à 23:55
QUOI !!!!! J'ai fais sa pour rien j'ai encore rien compris
Oui Name te permet de déplacer un fichier, mais alors ou est-t-on problème si tu arrives à déplacer à fichier ??
0
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006
6 mars 2006 à 23:09
Salut,
Bin c'est vrai que mon problème n'est pas évident... à expliquer tout au moins...
Le fait est que j'ai quelque chose comme 10000 fichiers qui 'tombent' dans mon répertoire d'origine chaque mois !!!
Je souhaite donc automatiser leur rangement dans leurs dossiers respectifs (du type BARDIN02988\2004\200407 pour rappel).
Effectivement, j'arrive à déplacer un fichier avec l'instruction Name ; cependant, comment faire en sorte que tous mes fichiers puissent être classés compte tenu compte tenu des paramètres de nom, code client, année et annéemois issus du nom de mes fichiers ???
En gros, je souhaiterais me servir d'excel comme d'un automate de classement
Et c'est là que je calle...
Un grand merci pour ton suivi (et obstination)
0
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006
7 mars 2006 à 21:57
Excellent... je voyais pas comment construire ma boucle tout en prenant en compte les éléments du fichier
Je teste demain et ferai un petit post pour te dire ce qu'il en est.
En tous cas encore Merci - vraiment sympa de ta part
0
redj00 Messages postés 10 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 9 mars 2006
9 mars 2006 à 22:37
Salut,

Comme promis, ce petit post pour te donner des nouvelles de ma 'mission'
J'ai apporté quelques modifs au code pour l'adapter pil poil à mon besoin... Et CA MARCHE !!!
J'ai encore beaucoup à apprendre sur VB... mais là, je suis comblé (mon boss aussi d'ailleurs ).
Bref, à nouveau un grand MERCI
@+
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
9 mars 2006 à 22:44
Bon courage maintenant
0
Rejoignez-nous