Ouvrir tout fichier d'un même répertoire, les renommer selon data à l'intér
Bonjour le forum,
Voilà je souhaiterai (si possible) :
1_ouvrir tout les fichiers (.xlsm) et qui aurait tous des noms différents, d'un même répertoire
2_Trouver 2 infos à l'intérieur (EmployeeName =Last and First Name)
3_Renommer donc chaque fichier par une nomenclature qui leur "presque" propre, seul EmployeeName changerai bien sur.
4_Fermer chaque fichier
Sub RenommerFichier()
Dim EmployeeName As String
Rep = "C:\Users\moi\Desktop\Répertoire\"
fic = Dir(Rep & "*.xlsm")
Workbooks.Open "C:\Users\moi\Desktop\Répertoire\*.xlsm"
'Nom de la feuille dans le classeur fermé
NomFeuille = "CHECKED"
'Trouve le nom de famille dans le fichier
Set Row = Rows(6).Find(what:="LAST NAME ?", LookAt:=xlWhole)
If Not Row Is Nothing Then col = Row.Select
Set LastName = ActiveCell.Offset(0, 4)
'Trouve le prénom dans le fichier
Set Row = Rows(6).Find(what:="FIRST NAME ??", LookAt:=xlWhole)
If Not Row Is Nothing Then col = Row.Select
Set FirstName = ActiveCell.Offset(0, 1)
EmployeeName = LastName & FirstName
'Fermer fichier
Workbooks("QSH_Expense claim_" & mois & "_" & EmployeeName & ".xlsm").Close SaveChanges:=True
'renommer fichier
Name Rep & fic As Rep & "QSH_Expense claim_" & mois & "_" & EmployeeName & ".xlsm"
'Fermer fichier
Workbooks("QSH_Expense claim_" & mois & "_" & EmployeeName & ".xlsm").Close SaveChanges:=True
End SubLe problème étant d'ouvrir ces fichiers sans connaitre leur nom initial, puis de réaliser le travail en boucle.
Enfin j'imagine !! sur de rien sinon je ne serais pas sur le forum :D
Merci d'avance pour les lecteurs, et bon courage a tous pour ce 2ième confinement..
Bonjour,
un essai d'une solution possible, si j'ai tout compris :
Dim Fic As String, Rep As String, WB As Workbook, WS As Worksheet
Rep = "C:\Users\moi\Desktop\Répertoire\"
Fic = Dir(Rep & "*.xlsm")
Do While Fic <> "" ' Commence la boucle.
Set WB = Workbooks.Open(Rep & Fic)'variable pour le nouveau classeur ouvert
Set WS = WB.Worksheets("CHECKED") 'variable pour la feuille du nouveau classeur
'Trouve le nom de famille dans le fichier
Set Trouve = WS.Rows(6).Find(what:="LAST NAME ?", LookAt:=xlWhole) 'remplacer Row par Trouve car mot "réservé" VBA
If Not Trouve Is Nothing Then LastName = Trouve.Offset(0, 4)
'Trouve le prénom dans le fichier
Set Trouve = WS.Rows(6).Find(what:="FIRST NAME ??", LookAt:=xlWhole)
If Not Trouve Is Nothing Then FirstName = Trouve.Offset(0, 1)
WB.Close 'ferme le classeur
'EmployeeName = LastName & FirstName
Name Rep & Fic As Rep & LastName & FirstName & ".xlsm" 'renomme le classeur )
Fic = Dir ' Extrait le fichier suivant.
LoopIl faudrait sans doute gérer le cas où le nom ou le prénom n'existe pas pour éviter un plantage.
A tester
A+
Salut AlgoPlus,
Merci pour ta réponse
J'ai donc copié le code, l'ai modifié pour le chemin, et l'ai testé il s'exécute bien, mais le nouveau nom de mon fichier s'appelle toujours ".xslm" quoiqu'il arrive. Lorsque j'en met 2 forcément, le code s’arrête m'indiquant que le ".xslm" est déjà attribué, logique.
j'ai testé en enlevant TROUVE LastName et ai mis :
LastName = WS.Range("A1")Un truc simple avec un prénom, idem rien n'a été remonté, et le fichier s'est appelé ".xslm". Les cellules où se trouvent les LastName et FirstName étaient fusionnées et en format standard, je l'ai ai donc dé fusionnées, mais pareil.
Encore merci,
si le fichier s'appelle toujours ".xlsm" , c'est que les variables FirstName et LastName ne sont pas initialisées ou bien initialisées avec ...rien.
a priori les noms et prénoms se trouvent en ligne 6 , sont ils toujours au même endroit pour tous les fichiers ? si oui il est possible de simplifier leur recherche
Le test avec
LastName = WS.Range("A1")devrait fonctionner dans la mesure où il y a quelque chose en A1 du (des) fichier (s) ouvert(s).
A+
Oui effectivement, je n'ai ni déclaré les variables LastName et FirstName as string. j'ai une question sur l'initialisation de la variable; ici c'est annoncer que LastName= qqch ?
Donc que cela soit avec LastName = Trouve.Offset(0, 4) ou bien avec LastName = WS.Range("A1") c'est la même chose ?
Euh oui sinon je te confirme les noms et prénoms se trouvent en ligne 6 et sont toujours au même endroit pour tous les fichiers. ^^'
Merci à toi,
Si les nom et prénom sont toujours au même endroit (et dans la même feuille "CHECKED") , (par exemple en C6 et G6)
'Trouve le nom de famille dans le fichier
LastName = WS.Range("C6").Value
'Trouve le prénom dans le fichier
FirstName = WS.Range("G6").Valuele reste sans changement.
ça simplifie et évite que le Find ne trouve pas "LAST NAME ?" ou "FIRST NAME ??" (un espace en + ou - ...) et donc que les variables ne soient pas initialisées.
A+
AlgoPlus salut,
Oui ça simplifie FORTEMENT les choses!! et ça fonctionne du coup ^^
Merci à toi :D (des fois j'aime bien me compliquer les choses on dirait
a +