Solution pour renommer des fichiers en masse?

pierreg

XLDnaute Occasionnel
Bonjour à tous,

Après plusieurs heures de recherche, je n'arrive pas à résoudre mon problème.

Je cherche à renommer des milliers de dossiers (je précise que ces dossiers contiennent des images que je ne désire pas renommer, juste les dossiers donc).

J'ai un fichier Excel avec:
En colonne "A" toutes mes références (qui sont les numéros actuels des dossiers)
En colonne "B" les nouvelles références (qui sont les nouveaux numéros)

En cherchant, j'ai trouvé bon nombre de macro sur ce thème mais je ne suis arrivé à aucun résultat si ce n'est que changer les valeurs dans mon tableau Excel, ce qui ne m'intéresse pas.

Je désire intervenir directement sur les dossiers pour changer les noms.

Y a t-il une macro ou autre solution pouvant effectuer ce travail?
Les logiciels de renommages sont inefficaces, ils se bornent à rajouter ou enlever des mentions.

Je suis débutant, très peu de connaissance en VBA.

Merci d'avance.
 

Dranreb

XLDnaute Barbatruc
Re : Solution pour renommer des fichiers en masse?

Bonjour
L'instruction Name devrait faire l'affaire.
[h=1]Name, instruction[/h]
Renomme un fichier, un répertoire ou un dossier sur un disque.
Syntaxe
Name oldpathname As newpathname
La syntaxe de l'instruction Name comprend les éléments suivants :
ÉlémentDescription
oldpathnameExpression de chaîne indiquant le nom et le chemin du fichier. Cet argument peut contenir le répertoire ou dossier et le lecteur.
newpathnameExpression de chaîne indiquant les nouveaux nom et chemin du fichier. Cet argument peut préciser le répertoire ou le dossier et le lecteur. Le nom de fichier indiqué dans l'argument newpathname ne peut pas correspondre à un fichier existant.

Remarques
L'instruction Name renomme un fichier et le déplace le cas échéant vers un nouveau répertoire ou dossier. Elle permet aussi de déplacer un fichier d'un lecteur à un autre, mais elle ne peut renommer un dossier existant que si les arguments newpathname et oldpathname concernent le même lecteur. L'instruction Name ne permet pas de créer un nouveau fichier ou dossier.
Si vous appliquez Name à un fichier ouvert, vous provoquez une erreur. Les fichiers ouverts ne peuvent être renommés avant d'avoir été fermés. Les arguments de Name ne peuvent comporter de caractères génériques (* : multicaractères, ? : caractère unique).
Cordialement.
 

pierreg

XLDnaute Occasionnel
Re : Solution pour renommer des fichiers en masse?

A Staple1600,
Merci.
J'ai essayé la solution mais ca ne fonctionne malheureusement pas.

J'ai pourtant installé comme indiqué les fichiers dans un dossier différent:
J'ai comme erreur
"Le programme a rencontré 2 erreurs correspondant à des fichiers corrompus ou à des caractères
interdits dans le nom de fichiers." (Concernant cette erreur, je n'ai aucun caractère interdit, que des lettres ou chiffres sans espaces, virgules ou autres symboles...)
D'un autre côté je ne sais pas quoi mettre à cette ligne:
TypeFichier = "*.txt"
Me concernant il s'agit de dossiers: j'ai essayé comma ca: TypeFichier = " "
ou encore TypeFichier = "*."

Je ne connais pas l'abréviation à utiliser pour les dossiers, peut être que ca vient de là?

A Dranreb,
Merci.
Sauf erreur, cette solution semble appropriée pour renommer des fichiers individuellement, je ne vois pas comment m'en sortir de cette manière car j'ai des milliers de dossiers.

Une solution?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Solution pour renommer des fichiers en masse?

Il n'y a généralement pas de point dans les noms de dossiers.
Instruction Dir.
[h=1]Dir, fonction[/h]
Renvoie une valeur de type String représentant le nom d'un fichier, d'un répertoire ou d'un dossier correspondant à une chaîne de recherche, à un attribut de fichier ou au nom de volume d'un lecteur.
Syntaxe
Dir[(pathname[, attributes])]
La syntaxe de la fonction Dir comprend les éléments suivants :
ÉlémentDescription
pathnameFacultatif. Expression de chaîne définissant un nom de fichier. Cet argument peut préciser le répertoire ou dossier et le lecteur. Une chaîne de longueur nulle est renvoyée si l'argument pathname est introuvable.
attributesFacultatif. Constante ou expression numérique, dont la somme définit des attributs de fichier. Si cet argument est omis, tous les fichiers sans attributs correspondant à l'argument pathname sont renvoyés.

Valeurs
L'argument attributes peut prendre les valeurs suivantes :
ConstanteValeurDescription
vbNormal0(Par défaut) Spécifie les fichiers sans attributs.
vbReadOnly1Spécifie les fichiers accessibles en lecture seule ainsi que les fichiers sans attributs.
vbHidden2Spécifie les fichiers cachés ainsi que les fichiers sans attributs.
vbSystem4Spécifie les fichiers système ainsi que les fichiers sans attributs. Non disponible sur le Macintosh.
vbVolume8Spécifie un nom de volume ; si un autre attribut est spécifié, la constante vbVolume est ignorée. Non disponible sur Macintosh.
vbDirectory16Spécifie les dossiers ainsi que les fichiers sans attributs.
vbAlias64Le nom du fichier spécifié est un alias. Disponible uniquement sur le Macintosh.

Note Ces constantes sont définies par Visual Basic pour Applications et peuvent remplacer des valeurs réelles partout dans votre code.
Remarques
Dans Microsoft Windows, La fonction Dir permet d'utiliser des jokers ou caractères génériques (* ou ?) pour sélectionner plusieurs fichiers. Sur le Macintosh, ces caractères sont considérés comme des caractères de noms de fichiers valides et ne peuvent être utilisés comme caractères génériques pour spécifier des fichiers multiples.
Étant donné que le Macintosh ne gère pas les caractères génériques, utilisez le type de fichier pour identifier les groupes de fichiers. Vous pouvez utiliser la fonction MacID pour indiquer le type de fichier au lieu d'utiliser les noms de fichier. Par exemple, l'instruction suivante renvoie le nom du premier fichier TEXT dans le dossier courant :

Dir("Chemin d'accès", MacID("TEXT")) Pour faire une itération sur tous les fichiers d'un dossier, indiquez une chaîne vide :

Dir("") Si vous utilisez la fonction MacID à l'aide de l'instruction Dir dans Microsoft Windows, une erreur se produit.
Toute valeur de l'argument attribute supérieure à 256 est considérée comme une valeur MacID.
Vous devez définir l'argument pathname lors du premier appel de la fonction Dir, ou une erreur se produit. Si vous indiquez des attributs de fichier, l'argument pathname doit être présent.
La fonction Dir renvoie le premier nom de fichier correspondant à l'argument pathname. Pour extraire d'autres noms de fichier correspondant à l'argument pathname, appelez de nouveau la fonction Dir sans préciser d'arguments. Quand tous les fichiers ont été indiqués, la fonction Dir renvoie une chaîne de longueur nulle (""). Lorsqu'une chaîne de longueur nulle a été renvoyée, vous devez indiquer l'argument pathname dans les appels ultérieurs de la fonction ou une erreur se produit. Vous pouvez indiquer un nouvel argument pathname sans avoir extrait tous les noms de fichier correspondant à l'argument pathname courant. Il est cependant impossible d'appeler la fonction Dir de manière récursive. Les appels Dir comportant l'attribut vbDirectory ne renvoient pas continuellement les sous-dossiers.
Conseil Les noms de fichiers extraits n'étant pas classés, vous pouvez les stocker dans un tableau, puis trier ce dernier.
À +
 

Dranreb

XLDnaute Barbatruc
Re : Solution pour renommer des fichiers en masse?

L'inconvénient si on ne spécifie pas ".*" derrière "*" au Dir c'est qu'il renvoie aussi bien des noms de fichiers que de dossiers.
La fonction GetAttr permet de savoir à quoi on a à faire
GetAttr, fonction


Renvoie une valeur de type Integer indiquant les attributs du fichier ou du dossier.
Syntaxe
GetAttr(pathname)
L'argument pathname est une expression de chaîne définissant un nom de fichier. L'argument pathname peut préciser le répertoire ou le dossier et le lecteur.
Valeurs renvoyées
La valeur renvoyée par GetAttr est la somme des valeurs d'attributs ci-dessous :
ConstanteValeurDescription
vbNormal0Normal
vbReadOnly1Lecture seule
vbHidden2Caché
vbSystem4Système. Non disponible sur le Macintosh.
vbDirectory16Répertoire ou dossier
vbArchive32Fichier modifié depuis la dernière sauvegarde. Non disponible sur le Macintosh.
vbAlias64Le nom du fichier spécifié est un alias. Disponible uniquement sur le Macintosh.

Note Ces constantes sont définies par Visual Basic pour Applications. Vous pouvez les utiliser partout dans votre code pour remplacer des valeurs réelles.
Remarques
Pour déterminer les attributs du fichier, utilisez l'opérateur And pour effectuer une comparaison au niveau du bit de la valeur renvoyée par la fonction GetAttr et de la valeur de l'attribut de fichier concerné. Si le résultat est différent de zéro, le fichier comporte l'attribut indiqué. Par exemple, la valeur renvoyée pour l'expression And ci-dessous est zéro si l'attribut Archive n'est pas défini :

Result = GetAttr(FName) And vbArchive Une valeur non nulle est renvoyée si le fichier comporte l'attribut Archive.
Il y a aussi une voie complètement différente qui peut finir par l'emporter quand même en simplicité sur ces vieux dispo classiques, lorsque la gymnastique qu'on a à y faire est un peu complexe:
Ajoutez la référence "Microsoft Scripting Runtime" à votre projet VBA. J'ai Tendance pour ma part à la mettre systématiquement à tous les classeurs.
Outre les Dictionary qui sont très pratiques, elle vous donnera accès nottamment à un objet Folder contenant une collection SubFolders d'objets Folder. Déclarez des variables As Scripting. …et la suite vous sera suggérée. Ce sont des objets, il doivent être initialisés par des Set. Des boucles de ce genre sont ensuite typiques: For Each SSDos In Doss.SubFolders
Et SSDos.Name = …
 
Dernière édition:

pierreg

XLDnaute Occasionnel
Re : Solution pour renommer des fichiers en masse?

A Dranreb,
Merci quand même;
Mais là j'ai absolument rien compris.
Si j'avais ce niveau, je pense que j'aurai même pas posé de question sur ce forum.
Je suis débutant de chez débutant, je vois pas comment m'en sortir comme ca.
:(
 

Dranreb

XLDnaute Barbatruc
Re : Solution pour renommer des fichiers en masse?

Qu'est ce que vous voulez que j'y fasse ? Vous n'exigez quand même pas que je crée un nouveau classeur et y fasse tout votre boulot ? On ne sait même pas si votre colonne A contient des chemins entiers ou seulement des noms de dossiers dans une racine spécifiée ailleurs.
Sans classeur joint on ne peut rien développer à votre place, il ne vous reste qu'à chercher vous même ou demander des précisions sur ce que vous ne comprenez pas.
P.S. Mais à priori, comme le problèmes est présenté au départ, si ce sont juste des noms de dossiers en A et B c'est simplement une boucle avec des Name Chemin & Cells(L, 1).Value As Chemin & Cells(L, 2).value
 
Dernière édition:

pierreg

XLDnaute Occasionnel
Re : Solution pour renommer des fichiers en masse?

J’exige rien de votre part et si vous en avez rien à faire, faut pas répondre.
j'ai posé une question en espérant avoir une réponse appropriée mais vos explications s'adressent à des gens expérimentés.

Concernant le fichier si ca peut permettre de résoudre le problème, je joins un exemple mais rien de mirobolant.
En colonne "A" toutes mes références (qui sont les numéros actuels des dossiers)
En colonne "B" les nouvelles références (qui sont les nouveaux numéros)

Au total plusieurs milliers de références.

Comme dans l'explication de Dormeur74, j'ai créé 2 répertoires:
c:\origine
c:\destination

Mes dossiers devant être renommés sont dans le répertoire "origine", ils sont censés se retrouver
dans le répertoire "destination" une fois la macro enclenchée.
Mon classeur Excel avec macro se trouve dans mon dossier "destination".

Merci à tous ceux qui pourront faire avancer les choses.
 

Pièces jointes

  • Test.xlsm
    16.3 KB · Affichages: 128
  • Test.xlsm
    16.3 KB · Affichages: 133
  • Test.xlsm
    16.3 KB · Affichages: 121
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Solution pour renommer des fichiers en masse?

J'ai ouvert votre fichier, mais ce n'est pas clair.
Confirmez moi si j'ai compris:
La colonne A de feuil1 contient des noms de sous dossiers sources de "c:\origine",
la colonne B de feuil1 contient des noms de sous dossiers destinataires de "c:\destination",
et vous voulez transférer tous les fichiers des dossiers sources dans les dossiers destinataires correspondants, en remplaçant dans les noms de fichiers tous les moins et blancs soulignés par des espaces sauf pour le 4ième et 5ième élément, s'il y en a 5, à relier par un moins ?

P.S. Mais vous dites aussi que vous ne voulez pas renommer de fichiers. Alors les colonnes A et B sont-elles plutôt des débuts de noms de sous répertoires de "c:\origine" et "c:\destination" dont les noms comportent 4 ou 5 éléments, le 1èr étant chaque fois les débuts en question ?

P.S.2 Ou bien est-ce le début de ma 1ère interprétation qui est juste mais ce ne sont pas les fichiers que vous voulez renommer mais tous les sous-sous-répertoires ?

Donnez un exemple pour la 1ère ligne de ce qu'il peut exister comme chemin complet à partir de "c:\" contenant un élément "J53N0775" et comment ça doit se retrouver sous un autre chemin avec "5879Y510" à la place, car là ce n'est vraiment pas clair.
Peut être vaudrait il mieux le faire en 2 temps: d'abord établir une liste de ce qui est trouvé en source et comment ce serait renommé d'après les règles éclaircies. Une liste à corriger manuellement des cas particuliers tordus, et ensuite une macro qui renomme simplement ce qui y figure. Ce serait plus prudent à mon avis.
À +
 
Dernière édition:

pierreg

XLDnaute Occasionnel
Re : Solution pour renommer des fichiers en masse?

Bonsoir,
En fait j'ai suivi la procédure de Dormeur74.
Lien supprimé

Toutefois je ne suis pas sur que cela soit très efficace dans mon cas de figure, car je souhaite renommer des dossiers (ou sont insérés des photos*: que je ne souhaite pas renommer) et ces dossiers ne sont pas des fichiers finaux, du coup je ne sais pas si cela est aussi simple.

Ce que je cherche à faire:

J'ai dans ma colonne A les noms de mes dossiers existant.
Je voudrais les renommer avec les nouveaux noms se trouvant dans la colonne B

Chaque nom de chaque ligne doit correspondre.
Exemple 1ere ligne: mon dossier actuellement nommé J53N0775 devra s'appeler 5879Y510
2eme ligne le dossier S5307R82 s’appellera 25879440
et ainsi de suite...
J'ai des milliers de dossiers à traiter, y a t-il une solution ou c'est peine perdu*? Est ce que Excel peut se charger de ca*? Je commence à avoir des doutes sur la faisabilité.
 

Dranreb

XLDnaute Barbatruc
Re : Solution pour renommer des fichiers en masse?

Bon ben alors c'est très simple, il n'y a pas de Dir à effectuer, mais simplement suivre ce qui est écrit dans la feuille:
VB:
Sub BoucleFichiers()
Dim T() As Variant, L As Long
T = Feuil1.[A1:B1].Resize(Feuil1.[A65536].End(xlUp).Row).Value
For L = 1 To UBound(T)
   Name "C:\origine\" & T(L, 1) As "C:\destination\" & T(L, 2)
   Next L
End Sub
C'est trop simple, non ? Ça doit sans doute pas encore être ça !

Et c'était quoi alors dans le code toute ces instructions avec des Split et des tests sur "-" et "_" ?

D'après ce que vous dites rigoureusement, on a même l'impression que les dossiers doivent rester sur "C:\origine".
Dans ce cas (mais attention aux nouveaux nom qui existeraient déjà pour autre chose comme anciens) :
VB:
Sub BoucleFichiers()
Dim T() As Variant, L As Long
ChDrive "C": ChDir "C:\origine"
T = Feuil1.[A1:B1].Resize(Feuil1.[A65536].End(xlUp).Row).Value
For L = 1 To UBound(T)
   Name T(L, 1) As T(L, 2)
   Next L
End Sub
À +
 
Dernière édition:

pierreg

XLDnaute Occasionnel
Re : Solution pour renommer des fichiers en masse?

Bonjour Dranreb,

Malheureusement je n'arrive plus à faire fonctionner le code vba.

Y a t-il une particularité avec le fait que mes fichiers à renommer sont cette fois ci des fichiers finaux*?
Je souhaite renommer des photos en extension .jpg, la dernière fois je souhaitais renommer des fichiers ou étaient inclus des photos, ca fonctionnait très bien mais cette fois ci dès que j’essai de renommer les photos, la méthode ne fonctionne plus.

J'ai essayé avec les 2 codes vba et j'ai systématiquement la même erreur:
fichier introuvable
sur le premier code vba il me surligne:
Name "C:\origine\" & T(L, 1) As "C:\Nouveau dossier1\" & T(L, 2)

Sur le 2eme code vba il me surligne
Name T(L, 1) As T(L, 2)

Mes photos sont placées dans C:\origine (aucun sous dossier)

Y a t-il une modification du code à apporter du fait qu'il ne s'agit plus de dossiers à renommer mais de fichiers*?

Merci d'avance.
 

Pièces jointes

  • test2.xlsm
    14.1 KB · Affichages: 94
  • test2.xlsm
    14.1 KB · Affichages: 104
  • test2.xlsm
    14.1 KB · Affichages: 99

Discussions similaires

Statistiques des forums

Discussions
312 890
Messages
2 093 352
Membres
105 696
dernier inscrit
FrancisR