Classement fichiers

[Résolu]
Signaler
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006
-
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
-
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

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 70 internautes nous ont dit merci ce mois-ci

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006

Bin, je vois pas trop comment expliquer ça autrement...

Ca te semble plus clair ???????
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
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
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006

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
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006

Re,
Fallait plutôt lire http://www.tonsite.com/my-redge
Quand ça veut pas...
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006

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
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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 ??
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006

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)
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006

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
Messages postés
10
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
9 mars 2006

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
@+
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Bon courage maintenant