Import pdf vers Excel variable selon la taille du pdf
Bonjour,
un outil professionnel me permet d'extraire en pdf la commande de nos agents. Je souhaite pouvoir extraire de ce pdf les données qui sont sous forme de tableau.
En utilisant l'enregistreur de macros, j'ai obtenu ce code.
Sub Macro6()
'
' Macro6 Macro
'
ActiveWorkbook.Queries.Add Name:="Table001 (Page 1-3)", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Pdf.Tables(File.Contents(""C:\Users\JJ\Desktop\Pointage\agents.pdf""), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & " Table001 = Source{[Id=""Table001""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Type modifié"" = Table.TransformColumnTypes(Table001,{{""Column1"", Int64.Type}, {""Column2"", type text}, {""Column3"", type text}, {""Column4"", type text}, {""Column5" & _
""", type text}, {""Column6"", type text}, {""Column7"", type text}, {""Column8"", type text}, {""Column9"", type text}, {""Column10"", type text}, {""Column11"", type text}, {""Column12"", type text}, {""Column13"", type text}, {""Column14"", type text}, {""Column15"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Type modifié"""
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Table001 (Page 1-3)"";Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Table001 (Page 1-3)]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table001__Page_1_4"
.Refresh BackgroundQuery:=False
End With
End Sub
Généralement le pdf contient 3 pages par jours mais lorsqu'il en contient moins la macro ne comptabilise pas le même nombre de colonnes.
J'aimerai donc pouvoir améliorer ce code afin de le rendre universel dans l'importation de mes données.
Merci d'avance de votre aide afin que je puisse comprendre le fonctionnement dans l'importation d'un pdf vers excel.
Bonjour
Aujourd’hui on utilise plutôt PowerQuery que VBA et sans exemple de 2 pdf illustrant les 2 structures on peut difficilement t'aider
Bonjour et merci,
Oui je comprends que l'aide est difficile sans les fichiers sources malheureusement des données confidentielles professionnelles sont incluses donc non partageables.
Cependant j'ai réussi à l'adapter pour que ça passe en supprimant simplement une partie du code pour ne laisser que les 2 premières colonnes
, {""Column3"", type text}, {""Column4"", type text}, {""Column5" & _
""", type text}, {""Column6"", type text}, {""Column7"", type text}, {""Column8"", type text}, {""Column9"", type text}, {""Column10"", type text}, {""Column11"", type text}, {""Column12"", type text}, {""Column13"", type text}, {""Column14"", type text}, {""Column15"", type text}
L'import du pdf se fait bien avec une variation entre 13 et 15 colonnes selon le contenu de celui-ci.
Maintenant j'aimerai qu'il puisse fonctionner qu'importe le PC sur lequel se trouve mon fichier Excel et les fichiers pdf
j'ai donc essayé de remplacer cette partie de code
(""C:\Users\JJ\Desktop\Pointage\agents.pdf"")
par
Dim Path_name As String
Dim Complete_File_name As String
Path_name = ThisWorkbook.Path
Complete_File_name = Path_name & "\agents.pdf"
..................................................................
......... Pdf.Tables(File.Contents(""Complete_File_name"").... ........
En msgbox, le Complete_file_name s'affiche bien en indiquant le positionnement complet du fichier pdf.
J'ai essayé en retirant 1" puis les 2" mais ça ne fonctionne pas. Peut-être n'est ce pas du String qui est attendu ?
Merci d'avance de votre aide
Bonjour,
Pour être plus précis sur la suite de ma demande, je recherche à remplacer
Source = Pdf.Tables(File.Contents(""C:\Users\Patrice\Desktop\Pointage\Données\PS JS agents1.pdf"")
Par
Source = Pdf.Tables(File.Contents("" & Complete_File_name & "")
Après avoir reconstitué l'emplacement du fichier pdf dans
Complete_File_name
(Mon fichier source Excel étant dans le dossier "Pointage"
J'ai testé
Source = Pdf.Tables(File.Contents("" & Complete_File_name & "")
Source = Pdf.Tables(File.Contents(" & Complete_File_name & ")
Source = Pdf.Tables(File.Contents(Complete_File_name)
mais rien n'y fait ... Merci de votre aide
Sub Macro2()Dim Path_name As String
Dim Complete_File_name As String
Path_name = ThisWorkbook.Path ' renvoi C:\Users\Patrice\Desktop\Pointage
Complete_File_name = Path_name & "\Données\PS JS agents1.pdf" ' renvoi C:\Users\Patrice\Desktop\Pointage\Données\PS JS agents1.pdf
Application.CutCopyMode = False
'*** Début Code Origine ***
' ActiveWorkbook.Queries.Add Name:="Table001 (Page 1-3)", Formula:= _
' "let" & Chr(13) & "" & Chr(10) & " Source = Pdf.Tables(File.Contents(""C:\Users\Patrice\Desktop\Pointage\Données\PS JS agents1.pdf""), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & " Table001 = Source{[Id=""Table001""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Type modifié"" = Table.TransformColumnTypes(Table001,{{""Column1"", Int64.Type}, {""Column2" & _
' """, type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Type modifié"""
'*** Fin Code Origine ***
'*** Début Code Modifié pour remplacer C:\Users\Patrice\Desktop\Pointage\Données\PS JS agents1.pdf par Complete_File_name ***
ActiveWorkbook.Queries.Add Name:="Table001 (Page 1-3)", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Pdf.Tables(File.Contents("" & Complete_File_name & ""), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & " Table001 = Source{[Id=""Table001""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Type modifié"" = Table.TransformColumnTypes(Table001,{{""Column1"", Int64.Type}, {""Column2" & _
""", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Type modifié"""
'*** Fin Code Modifié ***
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Table001 (Page 1-3)"";Extended Properties=""""" _
, Destination:=Range("ici!$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Table001 (Page 1-3)]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table001__Page_1_3"
.Refresh BackgroundQuery:=False
End With
End Sub
Bonjour,
Si dans la fenêtre d'exécution de VBA Project vous faites
debug.Print "let" & Chr(13) & "" & Chr(10) & " Source = Pdf.Tables(File.Contents("" & Complete_File_name & ""), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & " Table001 = Source{[Id=""Table001""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Type modifié"" = Table.TransformColumnTypes(Table001,{{""Column1"", Int64.Type}, {""Column2" & _
""", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Type modifié"""
Voilà ce que vous obtenez
let
Source = Pdf.Tables(File.Contents(" & Complete_File_name & "), [Implementation="1.3"]),
Table001 = Source{[Id="Table001"]}[Data],
#"Type modifié" = Table.TransformColumnTypes(Table001,{{"Column1", Int64.Type}, {"Column2", type text}})
in
#"Type modifié"
Il y a donc un problème dans les guillemets
Perso ce que je fais pour faciliter leur utilisation, c'est d'utiliser Chr(34)
"let" & Chr(13) & "" & Chr(10) & " Source = Pdf.Tables(File.Contents(" & Chr(34) & Complete_File_name & Chr(34) & "), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & " Table001 = Source{[Id=""Table001""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Type modifié"" = Table.TransformColumnTypes(Table001,{{""Column1"", Int64.Type}, {""Column2" & _
""", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Type modifié"""
Cette ligne semble donner le résultat souhaité
A+
Bonjour
De façon générale ce n'est pas la bonne approche de coder entièrement une requête PowerQuery
On crée une requête ou une fonction PowerQuery qui prévoit d'utiliser des paramètres ou des variables et on limite le code VBA au passage de ceux-ci
Le chemin d'accès ou le nom du fichier est la variable la plus fréquente : on passe soit par une cellule nommée Excel, soit par un paramètre PowerQuery
Exemple pour changer le paramètre nommé Fichier
ThisWorkbook.Queries("Fichier").Formula = _
"""T:\TEMP\recettes.xlsx"" meta [IsParameterQuery=true, Type=""Text"", IsParameterQueryRequired=true]"
Quand à la confidentialité, rien ne t'empêche de créer des fichiers anonymes mais représentatifs
EDIT : salut Bruno ;-)
Bonjour et merci BrunoM45.
Le Chr(34) était simplement la solution à mon problème ;-)