Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 VBA - Renommer des fichiers avec Name (ancienne et nouvelles valeurs dans une table)

lumiexcel

XLDnaute Nouveau
Bonjour,
Je cherche a renommer des fichiers listes dans une colonne pour un nom listé dans une autre colonne.
J'ai une table "Old-to-New-filename" (cree via Power Query) dans cette table, entre autre, j'ai mon nom de fichier actuel, et le nom final (j'ai aussi le chemin si necessaire, ou je peux combiner les deux dans ma table).
Ma colonne avec l'ancien nom s'appelle "Old-Filename" celle avec le nouveau "New-Filename"

Note : J'ai besoin que le code prenne les colonnes de la table, et non pas les colonnes du fichier excel, car les tables sont souvent deplacees dans le fichier ( par contre generalement les tables ne changent pas de nom ni les colonnes (elles sont utilisees dans Power Automate)).


Par exemple dans le grand nombre de code que je trouve, celui ci me parait un des plus simple et proche de ce que je voudrais faire, mais il ne prends pas en compte des colonnes de table. De plus, ma maigre connaissnace du VBA bloque sur la facon dont rcell est compris, et donc comment on passe d'une valeur sur une colonne de celle correspondante sur une autre colonne.


Code:
Sub ReName()
Dim rFiles As Range, rCell As Range
Dim strNewName As String, strOld As String
Dim strPath As String
Dim wbOpen As Workbook

Application.ScreenUpdating = False

Set rFiles = Range("A1", Range("A65536").End(xlUp))
strPath = "c:\My Documents\"

For Each rCell In rFiles
Old = strPath & rCell
strNewName = strPath & rCell(1, 2)
Name strOld As strNewName
Next rCell
Application.ScreenUpdating = True

End Sub

le code suivant semble bien faire reference a une colonne de ma table, peut etre est-ce un point de depart ?
VB:
'Reference parts of a table using the range object (as if it were a standard range object.)
ActiveSheet.Range("Old-to-New-filename[Old-Filename]").Select

J'avoue, j'ai l'habitude de passer par un fichier batch intermediaire, mais la on me demande d'en faire un standard pour tous mes collegues sur un fichier template, avec un bouton a presser, et je m'embrouille avec le code VBA.

Pouvez-vous m'aider ?
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Essayez comme ça :
VB:
Sub ReName()
   Dim TAncNouv(), L&
   ChDrive "C": ChDir "C:\My Documents"
   TAncNouv = ActiveSheet.Range("Old-to-New-filename[Old-Filename]").Resize(, 2).Value
   For L = 1 To UBound(TAncNouv, 1)
      Name TAncNouv(L, 1) As TAncNouv(L, 2)
      Next L
   End Sub
 

lumiexcel

XLDnaute Nouveau
Merci
Est-ce que je peux avoir plus d'explications (oui je suis une ch ** qui aime comprendre ce qu'elle met )? > C'est ligne par ligne ( bon la premiere ca va, c'est mon niveau

L2. j'ai deja vu le & dans du code VBA, mais quand je cherche il ne me l'indique que comme un signe de concatenation. Est ce le cas aussi dans les Dim ? Si c'est le cas j'ai bien peur de ne pas comprendre ce que vous cherchez a faire pourriez vous detailler? >> Oh, en fait en regardant de plus pres UBound, je viens de voir que & represente Long dans les declarations. Alors maintenant la question subsidiaire : si L est un Long, TAncNouv lui devrait etre un array non? si oui est ce les () qui permettent de le declarer comme tel?

L3 . mon chemin complet est dans ma cellule (il est pris par rapport ou est sauve le fichier excel), je n'ai donc pas besoin de la 3e ligne, ou est-ce qu'il faut que je la remplace par autre chose ?

L4. pour la 4e ligne, a quoi correspond le resize ? ( dans la documentation je vois qu'il s'agit de redimensionner le "range" > je croyais que le fait d'avoir une table evitait ca, et que je nommais la ma table "Old-to-New-filename", puis la colonne "Old-filename" > est-ce que je me suis trompe et j'appelais autre chose ?
Faudrait il que j'appelle d'abord ma table (ou mes deux colonnes doivent absolument etre cote a cote(et au debut, ce qui n'est pas le cas actuellement :/)), puis mes deux colonnes nominalement ? comment ?
Ou est-ce que le resize permet justement de se baser sur Old-filename (ou que la colonne soit dans la table), puis la colonne a cote ?

L5. Nous sommes d'accord que le L correspond au Dim de Ligne1 ?
[Noob mode} Comment Excel comprends t'il qu'il s'agit d'une ligne ? grace au fait que le Ubound va chercher les limites de mon array? ou il ne comprends rien a ce niveau du code et c'est le fait de l'utiliser ensuite en 1e place de l'array en Ligne 6 qui fait qu 'il est compris en ligne ?


Merci d'avance pour la personne qui aura la patience d'essayer de me faire comprendre

PS s'il y a un moyen de le faire avec des colonnes nommees je prends, sinon il y aura une restriction de plus dans le fichier template
PS2 : desole pour les accents, clavier qwerty de portable ou les alt codes ne marchent pas
 

Dranreb

XLDnaute Barbatruc
Bonjour.
L2) — Oui, '()' derrière un nom de variable le déclare comme un tableau dynamique.
L3) — Au cas ou le CurDir aurait changé: ChDrive ThisWorkbook.Path: ChDir ThisWorkbook.Path
L4) — La méthode Resize de l'objet Range renvoie un nouvel objet Range représentant une plage commençant par la même cellule mais redimensionnée comme spécifié. Si vos deux colonne ne sont plus contiguës il vaudrait peut être mieux utiliser deux tableaux dynamiques.
L5) — Le second paramètre de la fonction UBound indique la dimension interrogée: 1 pour lignes et 2 pour colonnes. Et oui, un élément de tableau 2 dimensions se désigne derrière son nom par (ligne, colonne).
 

lumiexcel

XLDnaute Nouveau
Parfait ca marche et je comprends pourquoi

Question subsidiaire

Si je voulais faire apparaitre une fenetre indiquant le nombre de documents renommes est ce possible ?
d'apres ce que je comprends il faudrait au minimum que j'ai un element declare en long avec la derniere cellule ?
Ceci pourrait il marcher ?

VB:
Sub ReName()
   Dim TAncNouv(), L&, Fin&
   ChDrive ThisWorkbook.Path: ChDir ThisWorkbook.Path
   TAncNouv = ActiveSheet.Range("Old-to-New-filename[Old-Filename]").Resize(, 2).Value
   Fin = ActiveSheet.Range("Old-to-New-filename[Old-Filename]").End
   For L = 1 To UBound(TAncNouv, 1)
      Name TAncNouv(L, 1) As TAncNouv(L, 2)
      Next L
   MsgBox Fin & "documents ont ete renommes"
   End Sub

Par contre on est d'accord que cela ne marche (dans le cas ou je ne me suis pas gourree) que si tous les documents sont bien renommes. Y-a-t-il un moyen de compter les boucles qui reussissent ?
[Edit] Code reconstruit, pas seulement element que je veux rajouter]
 

Dranreb

XLDnaute Barbatruc
Ben le nombre de lignes c'est UBound(TAncNouv, 1)
Si certains risquent d'échouer mettez devant On Error Resume Next
et derrière If Err Then MsgBox Err.Description Else NbSucc = NbSucc + 1
NbSucc déclaré As Long.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…