IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lire dans un pdf et modifier le nom du pdf en fonction du texte rechercher


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut Lire dans un pdf et modifier le nom du pdf en fonction du texte rechercher
    Bonjour,
    Je souhaiterais lire dans un pdf et modifier le nom du pdf en fonction du texte rechercher.

    Je m'explique, j'ai, d'une part, une liste de noms et d'autre part un dossier plein de pdf.

    Je souhaiterais faire tourner un code pour ouvrir chaque pdf, vérifier la présence de l'un de ces noms et, en cas de présence du nom, modifier le nom du pdf en y incluant le nom en question.

    J'ai un code qui fait le boulot, sauf, la lecture dans le pdf et la modification du nom (je pense qu'il faut fermer le pdf et modifier son nom ensuite s'il est ouvert?)


    Quelqu'un voit une solution?



    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 678
    Par défaut
    Salut,

    le renommage du fichier pdf n'est pas un défi, par contre la recherche dans le pdf par un code VBA c'est plus compliqué, utilisant des librairies Acrobat par exemple.

    Est-ce qu'au moins ton pdf est exploitable pour une recherche de mot ? Tu as des exemples de code ici et là sur le web anglophone
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Ce ne sont pas des scannes mais des pdf générés dans lesquels on peut faire du contrôle f par exemple

  4. #4
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 249
    Par défaut
    Bonjour

    on peut lire facilement dans un pdf avec Power Query

    exemple pour récupérer un tableau pris au hasard sur le site de l'INSEE (https://www.insee.fr/fr/statistiques...FTLo1_prod.pdf, page 4)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let
        Source = Pdf.Tables(Web.Contents("https://www.insee.fr/fr/statistiques/fichier/1906517/ENTFRA15g_FTLo1_prod.pdf"), [Implementation="1.3"]),
        Table001 = Source{[Id="Table008"]}[Data]
    in
        Table001
    Stéphane

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Comment je l'intègre dans mon code vba et comment gérer la recherche d'un mot donné?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Je crains que la solution ne s'applique pas à un pdf "texte" dans lequel chercher un mot un peu comme par un controle f? Cette solution ne s'applique t elle pas uniquement aux fichiers pdf comportant des tableaux?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    La il s'agit plutôt de courriers.

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 179
    Par défaut
    Hello,
    Power Query arrive aussi à lire des PDF sans tableau du moment que le texte à l'intérieur n'est pas sous forme image.
    En pièces jointes :
    1 fichier PDF avec du texte pas en tableau (champignons.pdf)
    1 classeur Excel avec une requête Power Query qui va chercher un mot dans le texte du PDF. les paramètres de la requête sont dans le tableau structuré TabParams qui contient le nom du fichier PDF et ce que l'on recherche dedans.
    Voici la requête (à simplifier, optimiser, corriger) car je ne suis pas un spécialiste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let
        Params = Excel.CurrentWorkbook(){[Name="TabParams"]}[Content]{0},
        Source = Pdf.Tables(File.Contents(Params[Fichier]), [Implementation="1.3"]),
        #"FiltrePages" = Table.SelectRows(Source, each ([Kind] = "Page")),
        #"Data développé" = Table.Combine (#"FiltrePages"[Data] ),
        #"Fusionné" = Table.CombineColumns(#"Data développé", Table.ColumnNames(#"Data développé"), Combiner.CombineTextByDelimiter(" ", QuoteStyle.None), "Trouvé"),
        #"Résultat" = Table.SelectRows(#"Fusionné", each Text.Contains([Trouvé], Params[Recherche],Comparer.OrdinalIgnoreCase))
    in
        #"Résultat"
    Résultat sous Excel 2019 :
    Nom : PowerQueryPDF.png
Affichages : 990
Taille : 25,0 Ko

    Ami calmant, J.P
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    J'ai trouvé ce code pour passer en VBA mais n'arrive pas à transposer:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim myConnection As WorkbookConnection
    Dim mFormula As String
    mFormula = _
    "let Source = Csv.Document(File.Contents(""C:\data.txt""),null,""#(tab)"",null,1252) in Source"
    query1 = ActiveWorkbook.Queries.Add("query1", mFormula)

  10. #10
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 179
    Par défaut
    Citation Envoyé par Kestion100 Voir le message
    Je m'explique, j'ai, d'une part, une liste de noms et d'autre part un dossier plein de pdf.
    La liste de noms se trouve où ? Dans un tableau structuré ?
    On pourrait mettre l'ensemble des noms des fichiers du dossier plein de pdf dans un tableau structuré aussi avec le chemin et le nom du PDF et une colonne avec le nom modifié.
    Faire une requête qui vient lire tous les noms de cette liste et chercher pour chaque pdf si un des noms de la liste des noms est présent et modifier alors le nom du fichier PDF si un des noms est trouvé

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Ca doit donner quelque chose de semblable à ça:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim myConnection As WorkbookConnection
    Dim Formula As String
    ActiveWorkbook.Queries.Add Name:=NomRequête, Formula:= _
    "let Source = Pdf.Tables(File.Contents(Params[Fichier]), [Implementation="1.3"]), _
        #"FiltrePages" = Table.SelectRows(Source, each ([Kind] = "Page")), _
        #"Data développé" = Table.Combine (#"FiltrePages"[Data] ), _
        #"Fusionné" = Table.CombineColumns(#"Data développé", Table.ColumnNames(#"Data développé"), Combiner.CombineTextByDelimiter(" ", QuoteStyle.None), "Trouvé"), _
        #"Résultat" = Table.SelectRows(#"Fusionné", each Text.Contains([Trouvé], Params[Recherche],Comparer.OrdinalIgnoreCase))
    in
        #"Résultat"
    Mais la gestion des guillemets n'est pas simple et me reste à définir me semble-t-il

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    La liste de noms se trouve où ? Dans un tableau structuré ?
    On pourrait mettre l'ensemble des noms des fichiers du dossier plein de pdf dans un tableau structuré aussi avec le chemin et le nom du PDF et une colonne avec le nom modifié.
    Faire une requête qui vient lire tous les noms de cette liste et chercher pour chaque pdf si un des noms de la liste des noms est présent et modifier alors le nom du fichier PDF si un des noms est trouvé
    Je crois comprendre que cela correspond bien à ce que je veux faire.
    J'ai procédé en rentrant tous les noms dans une variable tableau et j'en suis à chercher les nom dans les pdf avec et je comptais fermer le pdf et renommer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Fermer_Un_Programme (Acrobat.exe)
     
         Name Fichier As Dossier & ENSTAB(i) - Fichier
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fermer_Un_Programme (Acrobat.exe)
    =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Fermer_Un_Programme(Prog As String)
    Dim StrComputer As String, objWMIService As Object
    StrComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!" & StrComputer & "rootcimv2")
    Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = '" & Prog & "'")
    For Each objProcess In colProcessList
    objProcess.Terminate
    Next
     
    End Sub

  13. #13
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Je me disais, peut-être bêtement, qu'il me manque ma brique de lecture dans le pdf pour chercher un nom donner dans ma boucle et s'il est trouver, renommer le fichier avec le nom cherché et trouvé

  14. #14
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 249
    Par défaut
    Bonjour

    Un exemple qui ne répond pas exactement à votre besoin mais dont vous pouvez vous inspirer

    Les factures éditées en pdf dans mon système de facturation sont déversées dans un dossier mais le nom donnés automatiquement est du type chrono date + heure d'édition. J'aimerai avoir le n° de facture à la place

    Je me retrouve donc avec des factures ayant comme nom : 20230315_145030.pdf
    Dans les pdf, le n° de facture est en ligne 1 de la page 1 (mais je ne connais pas le n° de colonne) je sais juste que ça commence par "Facture" ou par "Avoir"


    j'ai donc créé une requête Power Query nommée "Factures" (en dur, pas en VBA)
    en rouge, le choix de la page 1, de la ligne 1, et recherche du n° de facture ou d'avoir - A adapter pour vous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let
        Source = Folder.Files("C:\Temp\Factures"),
        Filtre_pdf = Table.SelectRows(Source, each [Extension] = ".pdf" ),
        Choix_Colonne1 = Table.SelectColumns(Filtre_pdf,{"Content", "Name"}),
        Contenu_Page1 = Table.AddColumn(Choix_Colonne1, "Personnalisé", each Pdf.Tables([Content]){[Name="Page001"]}[Data]{0}),
        Recherche_numéro = Table.AddColumn(Contenu_Page1, "Nouveau_Nom", each List.Select(Record.FieldValues([Personnalisé]),each Text.StartsWith(_,"Facture") or Text.StartsWith(_,"Avoir")){0}),
        Nom_Colonne = Table.RenameColumns(Recherche_numéro,{{"Name", "Ancien_Nom"}}),
        Suppression_Erreur = Table.RemoveRowsWithErrors(Nom_Colonne, {"Nouveau_Nom"}),
        Choix_Colonne2 = Table.SelectColumns(Suppression_Erreur,{"Ancien_Nom", "Nouveau_Nom"})
    in
        Choix_Colonne2
    En VBA j'actualise la requête Power Query et je crée une copie des factures avec le bon nom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        ActiveWorkbook.Connections("Requête*-*Factures").Refresh
     
        For i = 1 To Range("Factures").Rows.Count
            FileCopy "C:/Temp/Factures/" & Range("Factures").Cells(i, 1), "C:/Temp/Factures renommées/" & Range("Factures").Cells(i, 2) & ".pdf"
        Next i
    Attention, "Requête*-*Factures" les * sont des espaces insécables

    Stéphane

  15. #15
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Ca ressemble bien en effet.
    Si je pouvez passer uniquement en VBA ca serait parfait mais sinon je ferai requête +vba

  16. #16
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 179
    Par défaut
    Les recherches risquent d'être très longues :
    1 - Quel est le nombre de mots dans la liste de recherche ? Quel genre de mots ?
    2 - Combien y-a-t-il de fichiers pdf à balayer ?
    3 - Le mot à rechercher dans le fichier PDF est-il toujours au même endroit dans le fichier PDF ? y a t il une balise qui permet de repérer son emplacement ?

  17. #17
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    A, non, le mot n'est pas toujours au même endroit.
    La tâche peut prendre un certain temps sans poser de pb, elle n'est pas récurrente et peut être faite en fond (pas 3 jours non plus....)

  18. #18
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 010
    Par défaut
    Bonjour,
    Si vous avez la chance d'avoir la version Acrobat Pro (version payante) vous pouvez rechercher un mot dans un fichier PDF avec le code suivant.
    Sinon cela servira peut-être à ceux qui ont Acrobat Pro et que le sujet intéresse :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    '------------------------------------------------------------------------------------------------------
    Public Function Rechercher_Mot_Dans_PDF(ByVal FichierSource As String, ByVal MotCherché As String, _
                                            ByVal RespecterCasse As Boolean, ByVal MotEntier As Boolean, _
                                            Optional ByRef ListePages As String = "", _
                                            Optional ByRef NbPage As Long = 0, _
                                            Optional ByRef TotalPage) As Long
    '------------------------------------------------------------------------------------------------------
    ' Recherche un mot dans un document PDF.
    '------------------------------------------------------------------------------------------------------
    ' FichierSource : le nom complet du fichier (avec son chemin).
    ' MotCherché : le mot cherché.
    ' RespecterCasse : True s'il faut respecter la casse, False si l'on ne gère pas la casse.
    ' MotEntier : True s'il faut prendre la totalité du mot, False si une partie suffit.
    ' ListePages : ne pas renseigner, contiendra la liste des numéros de page où le mot est trouvé.
    ' NbPage : ne pas renseigner, contiendra le nombre de pages où le mot est trouvé.
    ' TotalPage : ne pas renseigner, contiendra le nombre de pages du document.
    '------------------------------------------------------------------------------------------------------
    ' Renvoie : le nombre de fois que le mot est trouvé (donc zéro si rien n'est trouvé), ou -1 si erreur.
    '------------------------------------------------------------------------------------------------------
    ' Sources:
    'https://stackoverflow.com/questions/15161209/find-certain-text-in-pdf-then-return-page-number-found-on-to-another-section-no
    'https://www.developpez.net/forums/d431662-20/logiciels/microsoft-office/general-vba/contribuez/excel-word-pdf-adobe-acrobat-pro-pdfcreator-1-7-3-obsolete/
    '------------------------------------------------------------------------------------------------------
    Dim AcroApp As Object
    Dim AcroAVDoc As Object
    Dim AcroAVPage As Object
    Dim AcroPDDoc As Object
    Dim PageNum As Object, PageContent As Object, AcroTextSelect As Object
    Dim iPage As Long
    Dim sContent As String, sChar As String, Trouve As Boolean
    Dim j As Long, PremPage As Long, AncPage As Long
    Dim bReset As Byte
    Dim AncCursor As Integer
    Dim NbTrouve As Long
     
    ' Gestion des erreurs:
    On Error GoTo Gest_Err
    Err.Clear
     
    ' Initialisation des variables:
    bReset = 1
    NbPage = 0
    ListePages = ""
    AncCursor = Application.Cursor
     
    ' Création des objets:
    Set AcroApp = CreateObject("AcroExch.App")
    Set AcroAVDoc = CreateObject("AcroExch.AVDoc")
     
    ' Ouverture du fichier PDF:
    Call AcroAVDoc.Open(FichierSource, "")
     
    ' Laisse Excel au premier plan = il faut installer les API concernées (hors sujet dans cette discussion):
    'BringWindowToTop Application.hWnd
    'SetForegroundWindow Application.hWnd
     
    ' Pointe sur la première page:
    Set AcroAVPage = AcroAVDoc.GetAVPageView()
    AcroAVPage.GoTo 0
     
    ' Renseigne le nombre de pages du document:
    Set AcroPDDoc = AcroAVDoc.GetPDDoc
    TotalPage = AcroPDDoc.GetNumPages
     
    ' Si le document est valide:
    If AcroAVDoc.IsValid = True Then
     
        ' Curseur en mode attente:
        Application.Cursor = xlWait
     
        ' Premiere recherche:
        If AcroAVDoc.FindText(MotCherché, RespecterCasse, MotEntier, bReset) = True Then
     
            ' Identification de la page concernée:
            iPage = AcroAVPage.GetPageNum
     
            ' Compte le nombre de pages:
            NbPage = 1
            ' Et mémorise le numéro de la page de la première solution trouvée:
            PremPage = iPage
            AncPage = iPage
     
            ' Sélectionne la page:
            Set PageNum = AcroPDDoc.AcquirePage(iPage)
            Set PageContent = CreateObject("AcroExch.HiliteList")
            If PageContent.Add(0, 9000) <> True Then GoTo Gest_Err
            Set AcroTextSelect = PageNum.CreatePageHilite(PageContent)
     
            ' Boucle sur tous les mots de la page:
            For j = 0 To AcroTextSelect.GetNumText - 1
     
                sContent = AcroTextSelect.GetText(j)
                Trouve = False
     
                ' Si le mot peut éventuellement correspondre:
                If InStr(1, LCase$(sContent), LCase$(MotCherché)) > 0 Then
     
                    Select Case MotEntier
     
                        Case False
     
                        ' Si le mode est "Partie du mot" Et "Sans casse":
                        If RespecterCasse = False Then
                            ' Il est donc trouvé:
                            Trouve = True
                        ' Si le mode est "Partie du mot" Et "Avec casse":
                        Else
                            ' Il faut vérifier avec la casse:
                            If InStr(1, sContent, MotCherché) > 0 Then
                                Trouve = True
                            End If
                        End If
     
                        Case True
     
                        ' Ne pas retenir l'éventuel espace de fin du mot:
                        sContent = RTrim(sContent)
                        ' Si le mot a un ou des caractères de plus (un point, une virgule, retour ligne, etc):
                        If Len(sContent) > Len(MotCherché) Then
                            ' Quel est le caractère supplémentaire:
                            sChar = Mid(sContent, Len(MotCherché) + 1, 1)
                            ' S'il n'est pas une lettre ordinaire alors l'accepter:
                            If (sChar >= "A" And sChar <= "Z") Or (sChar >= "a" And sChar <= "z") Or Asc(sChar) > 159 Then
                                Trouve = False
                            Else
                                sContent = Left(sContent, Len(MotCherché))
                            End If
                        End If
                        ' Analyse si le mot est celui recherché:
                        If RespecterCasse = True Then
                            If sContent = MotCherché Then Trouve = True
                        Else
                            If LCase$(sContent) = LCase$(MotCherché) Then Trouve = True
                        End If
     
                    End Select
     
                    ' Si le mot a été trouvé:
                    If Trouve = True Then
                        NbTrouve = NbTrouve + 1
                        ListePages = ListePages & iPage + 1 & ";"
                    End If
     
                End If
     
            Next j
     
            ' Boucle sur éventuels autres mots trouvés de la page pour sortir de cette page:
            For j = 2 To NbTrouve
                Call AcroAVDoc.FindText(MotCherché, RespecterCasse, MotEntier, bReset)
            Next j
     
            ' Boucle tant que le texte cherché est trouvé:
            Do While AcroAVDoc.FindText(MotCherché, RespecterCasse, MotEntier, bReset) = True
     
                ' Identification de la page concernée:
                iPage = AcroAVPage.GetPageNum
     
                '  Si elle est la première analysée alors c'est la fin du traitement :
                If iPage = PremPage Or iPage < AncPage Then Exit Do
     
                ' Sinon compte nombre de mots trouvés et leur page:
                NbTrouve = NbTrouve + 1
                ListePages = ListePages & iPage + 1 & ";"
     
                ' Et compte le nombre de page concernée:
                If iPage <> AncPage Then NbPage = NbPage + 1
                AncPage = iPage
     
                DoEvents ' Cas d'une boucle sans fin pour ouvrir l'EDI.
     
            Loop
     
        End If
     
    End If
     
    ' Gestion des erreurs:
    Gest_Err:
     
    ' Message si erreur:
    Application.Cursor = AncCursor
    If Err.Number <> 0 Then
        MsgBox "Erreur : " & Err.Number & vbCrLf & vbCrLf _
             & "Description : " & Err.Description & vbCrLf & vbCrLf _
             & "Source : " & Err.Source & vbCrLf & vbCrLf _
            , vbCritical, "L'application ''Rechercher_Mot_Dans_PDF'' rencontre une erreur de traitement"
        Rechercher_Mot_Dans_PDF = -1
    Else
        Rechercher_Mot_Dans_PDF = NbTrouve
    End If
     
    ' Fermeture du document et des objets:
    On Error Resume Next
    AcroAVDoc.Close True
    AcroApp.Exit
    Set AcroApp = Nothing
    Set AcroAVDoc = Nothing
    Set AcroAVPage = Nothing
    Set AcroPDDoc = Nothing
    Set PageNum = Nothing
    Set PageContent = Nothing
    Set AcroTextSelect = Nothing
     
    Err.Clear
    End Function
    '------------------------------------------------------------------------------------------------------



    Bonne continuation

  19. #19
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 179
    Par défaut
    Hello,
    En python c'est plus facile à faire en utilisant le module pypdf pour lire le texte des PDF , et les expressions régulières pour faire la recherche de mots.
    Voici un script qui balaie tous les fichiers PDF d'un répertoire et qui regarde dans chaque pdf si il y a la présence d'un des mots définis dans une liste. A chaque lecture de fichier PDF on affiche le fichier lu et les mots de la liste trouvés dans le texte du PDF.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # import packages
    from pypdf import PdfReader
    import re
    import glob
    regexes= 'Mot1', 'Mot2', 'Mot3', 'Mot4'
    combinedRegex = re.compile('|'.join('(?:{0})'.format(x) for x in regexes))
    fichiersPDF = glob.glob("d:\\temp\\*.pdf")
    for fichier in fichiersPDF:
        print(fichier)
        reader = PdfReader(fichier)
        number_of_pages = len(reader.pages)
        # extract text and do the search
        for page in reader.pages:
            text = page.extract_text()
            #print(text)
            res = combinedRegex.findall(text)
            if res:
                print(res)

    Ami calmant, J.P

  20. #20
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Ok, je vois qu'il est possible de travailler avec du python sous Excel mais là je suis complètement novice.

    J'ai trouvé ça sur internet:

    https://forum.excel-pratique.com/exc...sur-vba-145131

    D'un côté, je vois qu'un fichier python est un fichier texte mais de l'autre, je vois un fichier .py, ne faut-il pas un éditeur et un compilateur pour créer ces fichiers.

    Possible de coder directement dans Excel VBA? je travail sur un ordi pro verrouillé et je ne peux rien installer dessus.....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/01/2022, 10h04
  2. lire un fichier pdf afin de l'inclure dans une base de donnée
    Par arfman dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 15/05/2009, 10h09
  3. ajout d'un element dans une liste et modifier son nom
    Par fibi007 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/04/2008, 17h50
  4. lire un fichier pdf dans un lecteur flash
    Par Totuch dans le forum Intégration
    Réponses: 2
    Dernier message: 14/01/2008, 04h01
  5. Modifier le nom d'un champ dans une requête
    Par Neuromancien2 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 01/10/2007, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo