VBA - Renommage de fichiers PDF avec recherche dans le document
Je suis confronté à une colle et je sollicite votre aide... Mes compétences de jeune padawan en VBA se heurtent à un morceau trop gros pour moi.
Pour mon travail, je dois renommer environ 200 PDF afin de les mettre à disposition des collaborateurs de l'association. Pour pousser les PDF (qui sont nominatifs et confidentiels) sur la plateforme qui permettra aux collaborateurs de les récupérer, ces PDF doivent être nommés avec leur numéro AVS (pareil que le numéro de sécu). Le renommage se fait en cherchant le nom du collaborateur dans le PDF (dans le PDF lui-même, pas dans son titre). Pour ça, je dispose d'un fichier Excel qui sert à établir les correspondances.
En gros, la macro devrait ouvrir le premier PDF du dossier, tester dans le fichier Excel des correspondances pour chaque nom un par un (boucler sur la colonne des noms) pour voir si l'un d'entre eux est trouvable dans le PDF. Soit le nom est trouvé et le fichier est renommé, soit il n'est pas trouvé et c'est tant pis. Dans tous les cas, la macro ferme ensuite le PDF, ouvre le PDF suivant et reste tous les noms jsuqu'à trouve rune correspondance, etc.
Pour le renommage, une fois une correspondance établie, la macro décale de une colonne à gauche, récupère le numéro AVS, le combine au nom et renomme le PDF, par exemple: "N° AVS_Yvan-Desclous".
J'ai réussi à coder tout ça pour des fichier .docx, mais c'est pas du tout la même chose pour des PDF.
Quelques détails:
1) Les PDF font une seule page chacun
2) Je peut au besoin disposer d'un accès à Acrobat Pro
3) Dans le fichier Excel qui sert à établir des correspondances, deux colonnes sont pertinentes: E, qui contient les noms, et D, qui contient les numéros AVS.
J'espère que j'ai été clair dans ma demande et qu'un jedi confirmé pourra m'aider.
Merci d'avance et meilleures salutations!
PS : Je joins le code pour renommage des fichiers Word, des fois que ça serve à quelqu'un:
Option Explicit
' Fonction pour supprimer les accents
Function SupprimerAccents(Texte As String) As String
Dim accents As String, sansAccents As String
Dim i As Integer
accents = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝŸàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ"
sansAccents = "AAAAAAACEEEEIIIIDNOOOOOUUUUYYaaaaaaaceeeeiiiidnooooouuuuyy"
SupprimerAccents = Texte
For i = 1 To Len(accents)
SupprimerAccents = Replace(SupprimerAccents, Mid(accents, i, 1), Mid(sansAccents, i, 1))
Next i
End Function
' Macro principale : Parcours et renomme tous les fichiers Word
Sub RenommerFichiersWord()
Dim dossierCible As String, fichier As String, cheminFichier As String
Dim appWord As Object, doc As Object
Dim wbUsine As Workbook, ws As Worksheet
Dim lastRow As Long, i As Long
Dim texteDoc As String, recherche As String, nouveauNom As String
Dim trouve As Boolean
Dim fichiersRenommes As Integer
' Désactiver l'affichage pour éviter les bugs visuels
Application.ScreenUpdating = False
Application.EnableEvents = False
' Sélection du dossier cible
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Sélectionnez le dossier contenant les fichiers Word"
If .Show = -1 Then
dossierCible = .SelectedItems(1) & "\"
Else
Exit Sub ' Annulation de l'utilisateur
End If
End With
' Vérification du dossier
If Dir(dossierCible, vbDirectory) = "" Then
MsgBox "Le dossier sélectionné n'existe pas.", vbExclamation
Exit Sub
End If
' Ouverture du fichier usine
On Error Resume Next
Set wbUsine = Workbooks.Open("C:\Users\Utilisateur\Desktop\Renommage fichiers\usine a renommage.xlsm")
On Error GoTo 0
If wbUsine Is Nothing Then
MsgBox "Impossible d'ouvrir le fichier 'usine a renommage.xlsm'.", vbCritical
Exit Sub
End If
' Sélection de la feuille "Données"
Set ws = wbUsine.Sheets("Données")
' Dernière ligne remplie en colonne E
lastRow = ws.Cells(ws.Rows.Count, 5).End(xlUp).Row
If lastRow < 1 Then
MsgBox "Le fichier 'usine' ne contient pas de données valides.", vbCritical
wbUsine.Close False
Exit Sub
End If
' Création de l'objet Word
On Error Resume Next
Set appWord = GetObject(, "Word.Application") ' Vérifier si Word est ouvert
If Err.Number <> 0 Then
Err.Clear
Set appWord = CreateObject("Word.Application") ' Ouvrir Word si besoin
End If
On Error GoTo 0
appWord.Visible = False ' Garder Word en arrière-plan
fichiersRenommes = 0 ' Compteur de fichiers renommés
' Boucle sur les fichiers .docx du dossier
fichier = Dir(dossierCible & "*.docx")
Do While fichier <> ""
cheminFichier = dossierCible & fichier
trouve = False ' Reset du statut de recherche
' Ouvrir le fichier Word
Set doc = appWord.Documents.Open(cheminFichier, ReadOnly:=True)
texteDoc = doc.Content.Text
doc.Close False ' Fermer après extraction du texte
' Comparaison avec les données du fichier Excel
For i = 1 To lastRow
recherche = SupprimerAccents(ws.Cells(i, 5).Value) ' Supprime les accents
If InStr(1, SupprimerAccents(texteDoc), recherche, vbTextCompare) > 0 Then
' Nouveau format : ColonneD_ColonneB_ColonneC
nouveauNom = ws.Cells(i, 4).Value & "_" & ws.Cells(i, 2).Value & "_" & ws.Cells(i, 3).Value
trouve = True
Exit For
End If
Next i
' Renommage du fichier si une correspondance est trouvée
If trouve Then
Dim nouveauChemin As String
nouveauChemin = dossierCible & nouveauNom & ".docx"
On Error Resume Next
Name cheminFichier As nouveauChemin
If Err.Number = 0 Then
fichiersRenommes = fichiersRenommes + 1
Else
MsgBox "Erreur lors du renommage de " & fichier, vbCritical
Err.Clear
End If
On Error GoTo 0
End If
' Passer au fichier suivant
fichier = Dir
Loop
' Fermeture propre de Word
appWord.Quit
Set appWord = Nothing
' Fermeture du fichier Excel
wbUsine.Close False
' Rétablir l'affichage d'Excel et VBA
Application.ScreenUpdating = True
Application.EnableEvents = True
' Message final avec le nombre de fichiers renommés
MsgBox fichiersRenommes & " fichier(s) renommé(s) avec succès.", vbInformation, "Renommage terminé"
End SubBonjour,
Word est capable d'ouvrir des fichiers PDF. Essaie en remplaçant tes instructions d'ouverture du fichier Docx par
fichier = Dir(dossierCible & "*.pdf")
Do While fichier <> ""
cheminFichier = dossierCible & fichier
trouve = False ' Reset du statut de recherche
' Ouvrir le fichier Word
Set doc = appWord.Documents.Open(cheminFichier, Format:="PDF Files", ConfirmConversions:=False, ReadOnly:=True)Bonjour,
Je te remercie chaleureusement de ta réponse. J'ai essayé d'intégrer tes lignes de code à la place des miennes. Le résultat me semble similaire: la macro ne parvient pas à renommer les PDF. En utilisant des debug, je crois comprendre que la macro ouvre correctement les fichiers PDF, mais que soit la recherche n'aboutit pas, soit le renommage du PDF ne fonctionne pas.
Je joins à ce nouveau message des fichiers bidons, mais qui permettront peut-être de mieux expliquer ce que j'attends. Les PDF "1", "2" et "3" sont les fichiers qui devraient être renommés. Le fichier Excel "Exemple" sert à établir les correspondances. Les PDF devraient être renommés sur la base de la dernière ligne de texte qu'ils contiennent, puisqu'elle contient l'info permettant d'établir la correspondance. A noter que dans les vrais fichiers, l'info n'est pas à la dernière ligne, mais noyée dans une page de texte. Il s'agit donc de scanner chaque fichier en entier.
Si quelqu'un a une idée, je prends volontiers!
bonjour,
ceci fonctionne chez moi. avec tes fichiers, j'ai mis une liste des fichiers pdf trouvés dans le répertoire et le résultat du "renommage". Il te faudra adapter le répertoire où aller chercher les fichiers PDF à renommer.
Excellent. J'essaie ça cette après-midi et je te redis!
Mmmh. Ca ne fonctionne pas. Il doit y avoir quelque chose que je ne comprends pas. A l'issue de l'exécution du code, j'ai un msgbox qui affiche: 0 fichiers scannés 0 fichiers renommés.
Le dossier dans lequel sont les PDF test sur mon PC est ici: "C:\Users\Utilisateur\Desktop\Informatique\Développements\Renommage fichiers". Du coup, j'ai modifié ton code de la façon suivante:
Sub renamepdffiles()
Dim ctr&, ctrf&, dl&, chemin$, fn$, i&, stf$, avs$
Dim objword As Object, pdfdoc As Object, twb As Object
Set twb = ThisWorkbook
With Sheets("feuil1")
dl = .Cells(Rows.Count, 4).End(xlUp).Row
chemin = "C:\Users\Utilisateur\Desktop\Informatique\Développements\Renommage fichiers\Cible"
fn = Dir(chemin & "*.pdf")
Set objword = CreateObject("Word.Application")
Do While fn <> ""
If Left(fn, 3) <> "AVS" Then
ctr = ctr + 1
Set pdfdoc = objword.Documents.Open(Filename:=chemin & fn, Format:="PDF Files", ConfirmConversions:=False)
' Search within tables in selected PDF file
twb.Activate
twb.Sheets("feuil2").Activate
twb.Sheets("feuil2").Cells(ctr, 1) = fn
For i = 2 To dl
stf = .Cells(i, 4)
avs = .Cells(i, 5)
With pdfdoc.Content.Find
.MatchWholeWord = False
.MatchCase = False
.Text = stf
.Execute
If .Found = True Then
pdfdoc.Close
Name chemin & fn As chemin & "AVS" & avs & "-" & stf & ".pdf"
Sheets("feuil2").Cells(ctr, 2) = "renommé " & chemin & "AVS" & avs & "-" & stf & ".pdf"
ctrf = ctrf + 1
Exit For
Else
End If
End With
Next i
If i > dl Then pdfdoc.Close
End If
fn = Dir()
Loop
End With
objword.Quit
MsgBox ctr & " fichiers scannés " & ctrf & "fichiers renommés"
End SubAurais-je raté qqch?
bonjour,
que contient feuil2 après exécution ? si la feuille reste vide, c'est qu'il ne trouve aucun fichier. si cible est un répertoire tu dois mettre un \ à la fin de la chaine: ainsi
chemin = "C:\Users\Utilisateur\Desktop\Informatique\Développements\Renommage fichiers\Cible\"sinon cible sera considéré comme une partie du nom des fichiers à prendre en compte (cible*.pdf)
Hello,
tu es peut-être victime du message d'avertissement de conversion, tu devrais rendre visible Word pour voir ce qui se passe :
Set objword = CreateObject("Word.Application")
objword.Visible = TrueSi il y a le message d'avertissement cocher la case pour qu'il n'apparaisse plus.
Ami calmant, J.P
J'ai gagné! Merci de votre aide!