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 ;-)

Rechercher des sujets similaires à "import pdf variable taille"