Bureautique & Productivité

Excel VBA : extraire les données d’une liste de PDF

11 min de lecture

Transformer une pile de PDF en tableau Excel exploitable

Chaque mois, un service comptable reçoit des centaines de factures fournisseurs en PDF. Les saisir manuellement prend 5 minutes chacune, soit 8 heures pour 100 factures. Excel combiné à Power Query ou VBA peut automatiser l’extraction, avec un taux de réussite de 85-95 pour cent sur des PDF bien structurés.

Deux approches

Power Query : natif pour PDF texte, sans code. Limité aux PDF dont le texte est sélectionnable. VBA + API externe : pour PDF scannés (OCR nécessaire), via Tesseract local ou API cloud comme Claude Vision ou AWS Textract.

Méthode 1 : Power Query pour PDF texte

Données > Obtenir des données > À partir d’un fichier > À partir d’un PDF. Excel détecte chaque tableau et chaque page. Sélectionnez les tableaux pertinents. Appliquez les transformations habituelles Power Query : suppression de lignes parasites, renommage colonnes, typage.

Méthode 2 : dossier entier de PDF

Données > À partir d’un dossier, ciblez le dossier contenant les PDF. Excel liste les fichiers, vous cliquez Combiner et Transformer. Résultat : une table consolidée de toutes les factures.

VBA pour PDF non structurés

Sub ExtrairePDF()
 Dim chemin As String, fichier As String
 chemin = "C:\Factures\"
 fichier = Dir(chemin & "*.pdf")
 Do While fichier <> ""
 Dim texte As String
 texte = LireTextePDF(chemin & fichier)
 ' Extraire avec RegEx
 Dim montant As String, numero As String
 montant = ExtraireRegex(texte, "Total TTC[\s:]+([0-9\s]+,\d{2})")
 numero = ExtraireRegex(texte, "Facture N[°o]\s*(\w+)")
 ' Enregistrer dans la feuille
 EnregistrerLigne fichier, numero, montant
 fichier = Dir
 Loop
End Sub

La fonction LireTextePDF utilise la librairie Adobe Acrobat SDK ou, plus simple, l’outil pdftotext.exe de Poppler appelé via Shell.

Fonction RegEx réutilisable

Function ExtraireRegex(texte As String, pattern As String) As String
 Dim regex As Object
 Set regex = CreateObject("VBScript.RegExp")
 regex.Pattern = pattern
 regex.Global = False
 If regex.Test(texte) Then
 ExtraireRegex = regex.Execute(texte)(0).SubMatches(0)
 Else
 ExtraireRegex = ""
 End If
End Function

Méthode 3 : OCR via API Claude Vision

Pour les factures scannées de fournisseurs informels (très courant en Afrique), une IA multimodale lit directement le PDF :

Sub ExtraireViaClaude()
 Dim http As Object
 Set http = CreateObject("MSXML2.XMLHTTP")
 http.Open "POST", "https://api.anthropic.com/v1/messages", False
 http.setRequestHeader "x-api-key", "VOTRE_CLE"
 http.setRequestHeader "content-type", "application/json"
 http.setRequestHeader "anthropic-version", "2023-06-01"
 Dim body As String
 body = "{""model"":""claude-sonnet-4-6"",""max_tokens"":1024,""messages"":[{""role"":""user"",""content"":[{""type"":""document"",""source"":{""type"":""base64"",""media_type"":""application/pdf"",""data"":""" & Base64PDF & """}},{""type"":""text"",""text"":""Extraire : fournisseur, numéro facture, date, montant HT, TVA, montant TTC. Format JSON.""}]}]}"
 http.send body
 ' Parser la réponse
End Sub

Validation et contrôle

Toujours valider les extractions : somme des lignes = montant total, TVA = 18 pour cent du HT (au), date cohérente. En cas d’anomalie, marquer pour révision manuelle.

Intégration comptable

Export final vers Sage, Ciel ou Odoo via CSV normalisé. Les comptes sont pré-mappés selon le fournisseur (plan comptable SYSCOHADA). Un comptable valide les anomalies seulement, gain de 80 pour cent sur le temps de saisie.

Conclusion

L’extraction automatique transforme la comptabilité fournisseurs d’une corvée répétitive en processus de contrôle ciblé. Investissement initial : 2 jours. Économies : quasiment continues. Approche hybride Power Query + VBA + IA = la formule gagnante en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer).

Voir aussi

Étape 1 : Comprendre le défi de l’extraction PDF par VBA

Une comptable à Cotonou reçoit chaque mois 80 factures fournisseurs au format PDF par email. Les ressaisir dans Excel prend deux jours. Avec VBA et la bonne approche, ces données peuvent être extraites en moins de cinq minutes. La clé : choisir le bon connecteur entre VBA et le PDF, car Excel n’a pas de moteur PDF natif.

Trois approches s’offrent à vous. La plus robuste : automatiser Adobe Acrobat Pro via la bibliothèque Acrobat.tlb, qui expose un objet AcroPDDoc. La plus économique : utiliser Word en arrière-plan pour ouvrir le PDF (Word convertit automatiquement en texte depuis 2013). La plus moderne : exécuter pdftotext de Poppler en ligne de commande via Shell. Ce tutoriel privilégie la méthode Word, gratuite et disponible sur toute installation Microsoft 365.

Étape 2 : Activer les références VBA nécessaires

Ouvrez Excel, appuyez sur Alt+F11 pour ouvrir l’éditeur VBA. Allez dans Outils > Références et cochez : Microsoft Word XX.X Object Library, Microsoft Scripting Runtime (pour FileSystemObject). Validez. Sans ces références, le code échouera dès la déclaration des variables Word.

Ajoutez ensuite un module via Insertion > Module. C’est dans ce module que vous écrirez la macro principale. Comment vérifier le bon fonctionnement : aucune erreur jaune lors de l’enregistrement du fichier en .xlsm.

Étape 3 : Lister les fichiers PDF d’un dossier

La première brique consiste à parcourir un dossier et lister les PDF. Saisissez la procédure suivante :

Sub ListerPDF()
    Dim fso As Object
    Dim dossier As Object, fichier As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set dossier = fso.GetFolder("C:\Factures\Mai2026")
    For Each fichier In dossier.Files
        If LCase(Right(fichier.Name; 4)) = ".pdf" Then
            Debug.Print fichier.Path
        End If
    Next fichier
End Sub

Lancez la macro avec F5, ouvrez la fenêtre Exécution avec Ctrl+G. La sortie attendue : la liste des chemins absolus de tous les PDF du dossier s’affiche. Si la fenêtre est vide, vérifiez le chemin du dossier (attention aux backslashes) et la présence effective de fichiers .pdf.

Étape 4 : Ouvrir un PDF avec Word et récupérer le texte

Word 2013 et versions ultérieures peuvent ouvrir directement un PDF et le convertir en document éditable. Ajoutez la fonction suivante :

Function LireTextePDF(cheminPDF As String) As String
    Dim wdApp As Object, wdDoc As Object
    Set wdApp = CreateObject("Word.Application")
    wdApp.Visible = False
    Set wdDoc = wdApp.Documents.Open(FileName:=cheminPDF; ConfirmConversions:=False)
    LireTextePDF = wdDoc.Content.Text
    wdDoc.Close SaveChanges:=False
    wdApp.Quit
    Set wdDoc = Nothing
    Set wdApp = Nothing
End Function

La sortie attendue : la fonction renvoie le texte brut du PDF en une seule chaîne. Word peut afficher un message d’avertissement la première fois ; cliquez sur OK et relancez. À l’usage, l’avertissement disparaît.

Étape 5 : Extraire un montant FCFA avec une expression régulière

Le texte brut contient maintenant la facture entière. Pour isoler le montant total, utilisez une expression régulière. Activez la référence Microsoft VBScript Regular Expressions 5.5 dans Outils > Références, puis ajoutez :

Function ExtraireMontant(texte As String) As Double
    Dim regex As Object, matches As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "(?:Total|Montant\s+a\s+payer|Net\s+a\s+payer)\s*[:]?\s*([0-9\s\.]+),?[0-9]*\s*(?:F\s*CFA|XOF|FCFA)"
    regex.IgnoreCase = True
    regex.Global = False
    Set matches = regex.Execute(texte)
    If matches.Count > 0 Then
        ExtraireMontant = CDbl(Replace(Replace(matches(0).SubMatches(0); " "; ""); "."; ""))
    Else
        ExtraireMontant = 0
    End If
End Function

La sortie attendue : pour une facture indiquant Total : 1 250 000 FCFA, la fonction renvoie 1250000. Le motif gère les variantes courantes en zone OHADA (FCFA, XOF, F CFA), les espaces de milliers, et les libellés en français.

Étape 6 : Extraire la date de facture

Les dates en format français suivent le pattern jj/mm/aaaa. Ajoutez :

Function ExtraireDate(texte As String) As String
    Dim regex As Object, matches As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "(?:Date|Du|Le)\s*[:]?\s*([0-3]?[0-9][\/\-\.][01]?[0-9][\/\-\.](?:20)?[0-9]{2})"
    regex.IgnoreCase = True
    Set matches = regex.Execute(texte)
    If matches.Count > 0 Then
        ExtraireDate = matches(0).SubMatches(0)
    End If
End Function

La sortie attendue : pour Date : 15/04/2026, la fonction renvoie la chaîne 15/04/2026. Une conversion CDate côté Excel transforme ensuite la chaîne en date typée si nécessaire.

Étape 7 : Extraire le numéro de facture et le fournisseur

Le numéro de facture suit souvent un format FAC-2026-0123 ou F2026/0123. Adaptez le pattern selon vos fournisseurs récurrents. Pour le nom du fournisseur, l’approche la plus fiable est d’avoir un dictionnaire interne des fournisseurs connus et de chercher leur raison sociale dans le texte :

Function ExtraireFournisseur(texte As String) As String
    Dim listeFournisseurs As Variant, f As Variant
    listeFournisseurs = Array("Sonatel"; "Senelec"; "SDE"; "Total Senegal"; "Auchan"; "CFAO")
    For Each f In listeFournisseurs
        If InStr(1; texte; CStr(f); vbTextCompare) > 0 Then
            ExtraireFournisseur = CStr(f)
            Exit Function
        End If
    Next f
    ExtraireFournisseur = "Inconnu"
End Function

La sortie attendue : pour une facture Sonatel, la fonction renvoie Sonatel ; pour un fournisseur non répertorié, elle renvoie Inconnu, signalant la nécessité d’enrichir la liste.

Étape 8 : Assembler la macro principale d’extraction par lot

Combinez maintenant tous les blocs dans une procédure unique qui parcourt le dossier, traite chaque PDF, et écrit une ligne dans Excel :

Sub ExtraireToutesFactures()
    Dim fso As Object, fichier As Object
    Dim ws As Worksheet, ligne As Long
    Dim texte As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ws = ThisWorkbook.Sheets("Factures")
    ws.Range("A1:E1").Value = Array("Fichier"; "Fournisseur"; "Date"; "Montant_FCFA"; "Statut")
    ligne = 2
    For Each fichier In fso.GetFolder("C:\Factures\Mai2026").Files
        If LCase(Right(fichier.Name; 4)) = ".pdf" Then
            texte = LireTextePDF(fichier.Path)
            ws.Cells(ligne; 1).Value = fichier.Name
            ws.Cells(ligne; 2).Value = ExtraireFournisseur(texte)
            ws.Cells(ligne; 3).Value = ExtraireDate(texte)
            ws.Cells(ligne; 4).Value = ExtraireMontant(texte)
            ws.Cells(ligne; 5).Value = IIf(ExtraireMontant(texte) > 0; "OK"; "A_VERIFIER")
            ligne = ligne + 1
        End If
    Next fichier
    MsgBox "Extraction terminee : " & (ligne - 2) & " factures traitees"
End Sub

Lancez la macro avec F5. La sortie attendue : la feuille Factures se remplit ligne par ligne, et un message final confirme le nombre de PDF traités. Pour 80 factures, comptez environ trois minutes.

Étape 9 : Gérer les erreurs et les PDF protégés

Certains PDF sont protégés par mot de passe ou contiennent uniquement des images scannées (sans couche texte). Encapsulez l’appel LireTextePDF dans une gestion d’erreur :

On Error Resume Next
texte = LireTextePDF(fichier.Path)
If Err.Number <> 0 Then
    ws.Cells(ligne; 5).Value = "ERREUR_LECTURE"
    Err.Clear
End If
On Error GoTo 0

La sortie attendue : les factures problématiques apparaissent avec le statut ERREUR_LECTURE. Pour les PDF scannés, un OCR préalable via Adobe Acrobat ou Tesseract est nécessaire avant de relancer la macro.

Étape 10 : Optimiser les performances de la macro

Sur 200 PDF, la macro peut prendre quinze minutes parce que Word démarre et s’arrête à chaque fichier. Optimisez en gardant une seule instance Word ouverte pendant toute la boucle :

Dim wdApp As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = False
' boucle sur fichiers, en passant wdApp comme parametre
wdApp.Quit
Set wdApp = Nothing

Désactivez aussi Application.ScreenUpdating et Application.Calculation pendant l’exécution :

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' code...
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

La sortie attendue : le temps d’exécution est divisé par trois ou quatre, ramenant le traitement de 200 factures à environ cinq minutes.

Étape 11 : Auditer les résultats avant intégration comptable

Avant d’importer les données extraites dans le logiciel comptable Sage Saari ou Ciel, faites une vérification manuelle sur 5 % de l’échantillon. Triez la colonne Montant_FCFA par ordre décroissant, repérez les valeurs aberrantes (montants à zéro, montants supérieurs à dix millions). Ouvrez physiquement les PDF correspondants et comparez. Cette discipline d’audit, héritée des cabinets de Plateau et d’Akpakpa, évite qu’une erreur de regex propage des écritures fausses dans la comptabilité.

Pour automatiser le contrôle, ajoutez une mise en forme conditionnelle qui colore en rouge les lignes où Statut vaut A_VERIFIER ou ERREUR_LECTURE. La comptable revoit uniquement ces lignes, ce qui réduit de 95 % le temps de contrôle qualité par rapport à une saisie manuelle complète.

Étape 12 : Sécuriser et déployer la macro

Signez numériquement le module VBA via Outils > Signature numérique avec un certificat auto-signé créé via SelfCert.exe fourni avec Office. Cela évite l’avertissement de sécurité à chaque ouverture du classeur sur les postes des autres collaborateurs.

Pour le déploiement, enregistrez le fichier en .xlam (complément Excel) et copiez-le dans %AppData%\Microsoft\AddIns sur chaque poste. Activez le complément via Fichier > Options > Compléments > Atteindre. La macro devient alors disponible dans tout classeur ouvert sur le poste, sans avoir à dupliquer le code dans chaque fichier.

Étape 13 : Pour étoffer le tableau

Pour des PDF complexes (factures multi-pages avec lignes de détail à extraire), envisagez de basculer vers Python (pdfplumber, PyMuPDF) appelé via Shell depuis VBA. Pour des volumes industriels, regardez les solutions cloud OCR (Azure Document Intelligence, AWS Textract) qui offrent une précision supérieure à 98 % sur des factures variées.

Consultez également nos guides connexes Connecter une API REST avec Power Query et Excel DAX pour calculer le CA cumulé par boutique pour exploiter les données extraites dans des dashboards interactifs adaptés aux PME ouest-africaines.

Partager