Macro obtenir des données à partir d'un fichier PDF
Salutations,
J'essaie de faire une macro qui extrait les données d'un fichier pdf (celui que l'utilisateur sélectionne) et colle les tableaux dans une feuille Excel, mon objectif est que la macro travaille avec le fichier que l'utilisateur sélectionne.
Il y a un problème récurrent "la macro ne reconnaît pas le mot source"
Je vous remercie beaucoup pour votre aide
Bonjour
Quel intérêt de coder toute une requête ?
Il suffit de la mettre dans le classeur modèle, de prévoir juste le code permettant de lui passer en paramètre le nom du fichier choisi
Salut,
Merci pour ta réponse.
Le but est d'avoir les informations de tout le fichier pdf sur une seule feuille.
J'ai réussi à le faire avec un emplacement de fichier spécifique mais je n'ai pas pu le faire avec l'emplacement que l'utilisateur sélectionne.
J'ai joint les fichiers de test
Private Sub btntelechargerpdf_Click()
Dim Fichero As String
Fichero = Me.txtnomfichierpdf.Value
ActiveWorkbook.Queries.Add Name:="Table001 (Page 1)", _
Formula:="let" & vbCrLf & " Source = Pdf.Tables(File.Contents(" & Fichero & "), [Implementation=""1.3""])," & _
vbCrLf & " Table001 = Source{[Id=""Table001""]}[Data]," & _
vbCrLf & " #""Type modifié"" = Table.TransformColumnTypes(Table001,{{""Column1"", type text}})" & _
vbCrLf & "in" & _
vbCrLf & " #""Type modifié"""
With ActiveSheet.ListObjects.Add(SourceType:=0, _
Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source = $Workbook$;Location=""Table001 (Page 1)"";Extended Properties=""""", _
Destination:=Range("$V$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Table001 (Page 1)]")
.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"
.Refresh BackgroundQuery:=True
End With
Application.CutCopyMode = False
Application.CutCopyMode = False
Application.CutCopyMode = False
ActiveWorkbook.Queries.Add Name:="Table002 (Page 1)", _
Formula:="let" & vbCrLf & " Source = Pdf.Tables(File.Contents(" & Fichero & "), [Implementation=""1.3""])," & _
vbCrLf & " Table002 = Source{[Id=""Table002""]}[Data]," & _
vbCrLf & " #""En-têtes promus"" = Table.PromoteHeaders(Table002, [PromoteAllScalars=true])," & _
vbCrLf & " #""Type modifié"" = Table.TransformColumnTypes(#""En-têtes promus"",{{""Localisation"", type text}, {""soumis"", Int64.Type}, {""Column3"", type text}, {""p/r au prix DSPR"", type text}, {""Column5"", type text}, {""Column6"", type text}, {""p/r estimation"", type text}, {""Column8"", type text}, {""Column9"", type text}})" & _
vbCrLf & "in" & _
vbCrLf & " #""Type modifié"""
With ActiveSheet.ListObjects.Add(SourceType:=0, _
Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source = $Workbook$;Location=""Table002 (Page 1)"";Extended Properties=""""", _
Destination:=Range("$V$10")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Table002 (Page 1)]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table002__Page_1"
.Refresh BackgroundQuery:=False
End With
Application.CutCopyMode = False
Application.CutCopyMode = False
ActiveWorkbook.Queries.Add Name:="Table003 (Page 1)", _
Formula:="let" & vbCrLf & " Source = Pdf.Tables(File.Contents(" & Fichero & "), [Implementation=""1.3""])," & _
vbCrLf & " Table003 = Source{[Id=""Table003""]}[Data]," & _
vbCrLf & " #""En-têtes promus"" = Table.PromoteHeaders(Table003, [PromoteAllScalars=true])," & _
vbCrLf & " #""Type modifié"" = Table.TransformColumnTypes(#""En-têtes promus"",{{""code d'ouvrage"", type text}, {""Désignation de l'ouvrage"", type text}, {""Écart"", Int64.Type}, {""Column4"", type text}, {""% de l'écart"", type text}, {""Appréciation"", type text}})" & _
vbCrLf & "in" & _
vbCrLf & " #""Type modifié"""
With ActiveSheet.ListObjects.Add(SourceType:=0, _
Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source = $Workbook$;Location=""Table003 (Page 1)"";Extended Properties=""""", _
Destination:=Range("$V$20")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Table003 (Page 1)]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table003__Page_1"
.Refresh BackgroundQuery:=False
End With
Application.CutCopyMode = False
Application.CutCopyMode = False
ActiveWorkbook.Queries.Add Name:="Page001", _
Formula:="let" & vbCrLf & " Source = Pdf.Tables(File.Contents(" & Fichero & "), [Implementation=""1.3""])," & _
vbCrLf & " Page1 = Source{[Id=""Page001""]}[Data]," & _
vbCrLf & " #""En-têtes promus"" = Table.PromoteHeaders(Page1, [PromoteAllScalars=true])," & _
vbCrLf & " #""Type modifié"" = Table.Tr" & "ansformColumnTypes(#""En-têtes promus"",{{""Column1"", type text}, {""[image]"", type text}, {""Column3"", type text}, {""Column4"", type text}, {""Column5"", type text}, {""Column6"", type text}, {""Column7"", type text}, {""Column8"", type text}, {""Column9"", Int64.Type}, {""AUTORISATION DU SOUS-MINISTRE ADJOINT(SMECI)"", type text}, {""Column11"", Percentage.Typ" & "e}, {""Column12"", type text}, {""Column13"", type text}, {""Column14"", type text}, {""Column15"", type text}, {""Column16"", type text}, {""Column17"", type text}, {""Column18"", type text}, {""Column19"", type text}, {""Column20"", Int64.Type}, {""Column21"", type text}, {""Column22"", type text}, {""Column23"", type text}, {""Column24"", Percentage.Type}})" & _
vbCrLf & "in" & _
vbCrLf & " #""Type modifié"""
With ActiveSheet.ListObjects.Add(SourceType:=0, _
Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source = $Workbook$;Location=Page001;Extended Properties=""""", _
Destination:=Range("$V$40")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Page001]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Page001"
.Refresh BackgroundQuery:=False
End With
Range("F4:H4").Select
End SubBonjour
Tu n'as pas compris ma réponse et de toute évidence tes requêtes ne correspondent pas au fichier pdf fourni : on ne trouve pas les en-tête de colonnes prévues
Ci-joins un modèle :
- on choisit le pdf à traiter depuis l'onglet Fichier_Source
- le chemin et nom de fichier est passé en paramètre à PowerQuery
- la requête FichierSource initialise le lien avec le pdf
- les autres requêtes, qui s'affichent dans l'onglet PDF, sont actualisées.
Elles sont issues de ton code mais basées sur la requête FichierSource et sont donc à adapter en raison du problème d'entête - le fichier est débarrassé du bouton de choix de fichier et enregistré sous le nom du pdf suivi de Traité en xlsx
- le modèle peut donc resservir pour tout autre fichier
Salut
,
J'ai essayé de tout appliquer mais je n'y arrive pas.
L'idée est que les données se trouvent toujours sur une feuille d'un fichier qui contient plusieurs feuilles. Lorsque j'essaie de mettre à jour les données, il m'affiche toujours les mêmes données, c'est-à-dire qu'il ne prend pas les données du fichier sélectionné par l'utilisateur.
J'ai aussi essayé de monter les tables horizontalement pour ne pas avoir de problèmes avec les colonnes.
Merci encore
Bonjour
Comme je l'ai déjà signalé tes requêtes ne peuvent exploiter correctement cette structure de pdf : les alignements et donc les tableaux ne sont pas détectés correctement et notamment la longueur du numéro de 2ème fichier change totalement la façon dont PowerQuery le découpe dans Table1
J'avais oublié de paramétrer l’actualisation en arrière plan à false mais les actualisations ne fonctionnent pas avec les tableaux trop près les uns des autres et surtout le fait que d'un fichier à l'autre le nombre de colonnes détectées varie
En décalant cela s'actualise mais le problème évoqué ci-dessus persiste
Salut,
Sur le fichier que tu m'as envoyé ça marche très bien, mais quand j'essaie de le copier dans mon fichier de travail ça ne marche pas, ça ne met pas à jour les tables.
Si je copie la feuille et que je la colle dans une autre fichier, le résultat est le même, il ne met pas à jour les données avec le fichier sélectionné.
J'ai déjà fait plusieurs tests mais le résultat est le même, ça doit être quelque chose de très simple mais je n'arrive pas à l'identifier
RE
J'avais oublié de paramétrer l’actualisation en arrière plan à false mais les actualisations ne fonctionnent pas avec les tableaux trop près les uns des autres et surtout le fait que d'un fichier à l'autre le nombre de colonnes détectées varie
As-tu
- désactivé l'actualisation en arrière plan de toutes les requêtes ?
- réglé le problème de l'alignement des tableaux
Si tu actualise manuellement : Données, Actualiser tout que se passe-til ?
Il ne suffit de pas de coller la feuille PDF dans un autre fichier car cela ne va pas y coller les requêtes...
