XL 2016 Macro pour convertir .PDF en .XLSX

saidoush

XLDnaute Junior
Bonjour,

J'ai tenté de reproduire les instructions d'une video en vu de convertir via une macro un document .pdf en .xlsx.

Chez lui,... ça marche lol 🥹

les seules différence c'est que moi j'utilise Foxit et l'adresse du fichier...(forcément)

Merci pour votre aide!!!
et bon dimanche.


Option Explicit

Sub convert_pdf_doc()

Dim foxitApp As Object
Dim av_doc As Object
Dim pdf_doc As Object
Dim jso_obj As Object

Dim sfile As String
Dim dfile As String
Dim ext As String

ext = "xlsx"
sfile = "C:\Users\FAMILLE\Documents\devis dentaire.pdf"
dfile = Replace(sfile, ".pdf", "." & ext, 1)


Set foxitApp = CreateObject("FoxitPDFReader.Application")

Set av_doc = foxitApp.GetActiveDoc()

If Not av_doc Is Nothing Then

Set pdf_doc = av_doc.GetPDDoc()
Set jso_obj = pdf_doc.GetJSObject

jso_obj.SaveAs dfile, "com.foxitpdf.reader." & ext

av_doc.Close

End If

Set foxitApp = Nothing
Set av_doc = Nothing
Set pdf_doc = Nothing
Set jso_obj = Nothing

End Sub
 

patricktoulon

XLDnaute Barbatruc
si tu veux copier au même format que dans le pdf
il n'y a que deux solutions

soit tu a O365 et tu a les options dans PQ

soit tu a adobe acrobat(DC)PRO (PAYANT) et tes libraires tel que c'est
montré dans la videos fonctionneront

soit tu a adobeacrobat 1.7.3 (vielle version trouvable en version portable)
prévoir de faire les enregistrement de DLL

sinon il y a l'astuce avec l'explorateur internet mais tu récupère tout en vrac texte et pour faire le ménage c'est coton
 

patricktoulon

XLDnaute Barbatruc
un petit exemple pour copier une table d'un pdf dans excel
en commentaire il y a le mode copy/paste qui a l'avantage de garder toutles format et couleur de la table
sinon celle par cell dans une double boucle ligne/colonne par vba

VB:
      Sub CopierContenuPDFVersExcel()
    Dim WordApp As Object, WordDoc As Object, table As Object

    Set WordApp = CreateObject("Word.Application")
    WordApp.Visible = True    'Vous pouvez définir ceci sur False si vous ne souhaitez pas afficher Word
    Set WordDoc = WordApp.Documents.Open("C:\Users\patricktoulon\Desktop\cobaie3.pdf")    'Remplacez le chemin par le chemin de votre fichier PDF

    '////////////////////////////////////////////////////////////

    'Mode 1:   ' Copier le contenu du tableau 1  vers Excel en gardant tout
    ' WordDoc.tables(1).Range.Copy
    'With ActiveSheet
    '.[a1].Select
    '.Paste
    'End With
    'With ActiveSheet
    '.Cells.Clear
    '.[a1].Select
    '.Paste
    'End With
    '////////////////////////////////////////////////////////////

    'Mode 2 :  ' Copier le contenu du tableau 1  vers Excel en le recreant dcellule par cellule

    For Each table In WordDoc.Tables
        For i = 1 To table.Rows.Count
            For j = 1 To table.Columns.Count
                ActiveSheet.Cells(i, j + 1).Value = table.Cell(i, j).Range.Text
            Next j
        Next i
        i = i + 1    ' Ajouter une ligne vide entre les tables (optionnel)
    Next table
  

    '////////////////////////////////////////////////////////////


    WordDoc.Close False: WordApp.Quit    ' Fermer le document Word


    Set WordDoc = Nothing: Set WordApp = Nothing    ' Libérer la mémoire

End Sub

on peut faire la même chose avec le wordDoc.paragrpaphes
 

laurent950

XLDnaute Barbatruc
Bonjour le forum, @patricktoulon , @kiki29 , @Staple1600

Nota : J’ai constaté que l'objet Selection est étroitement lié à l'application Word en cours d'exécution via l'objet Application, et bien que j’arrive à manipuler les paragraphes à travers la sélection, je n’ai pas trouvé de moyen de traiter l'ensemble du code en mémoire (sans avoir besoin d'un document Word actif servant de support au curseur). Cela signifie que le traitement des paragraphes reste tributaire de la sélection dans le document actif.

J'ai trouvé une alternative, mais je remarque que chaque phrase est considérée comme une ligne délimitée par un point. Cela signifie que le nombre de lignes dans un paragraphe est déterminé par le nombre de points, plutôt que par le début et la fin réels de chaque ligne. J'utilise la ligne de code suivante pour tester :
wdParagraphe.Range.Sentences.Item(1).Text
Je cherche toujours une solution pour traiter chaque ligne d'un paragraphe de manière indépendante, sans être lié à la structure basée sur les phrases. Malheureusement, je n'ai pas encore trouvé de moyen de le faire en mémoire, c'est-à-dire sans avoir besoin d'un document Word actif.

Par défaut, le code ci-dessous fonctionne parfaitement avec un document Word, mais il est également exploitable avec un PDF à ouvrir depuis Word.
Il suffit de l'adapter en conséquence.

Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
' Vous pouvez définir ceci sur False si vous ne souhaitez pas afficher
WordSet WordDoc = WordApp.Documents.Open("C:\Users\Dos\Desktop\Word.pdf")

Code : A Tester Directement depuis le VBE Word pour test sur le document Word.
Explication : ci-dessous
  1. Parcours des paragraphes : Le code commence par parcourir chaque paragraphe dans le document Word actif.
  2. Vérification du contenu : Pour chaque paragraphe, il vérifie si le texte qu'il contient est vide ou non. Seuls les paragraphes non vides sont pris en compte.
  3. Traitement des paragraphes simples : Si un paragraphe ne contient qu'une seule ligne, le code sélectionne cette ligne et imprime son contenu.
  4. Traitement des paragraphes multiples : Si un paragraphe contient plusieurs lignes, le code sélectionne chaque ligne individuellement et imprime son contenu.
  5. Gestion des limites : Le code fonctionne efficacement avec des documents Word contenant uniquement du texte.
  6. Affichage dans la fenêtre de débogage : Le contenu de chaque ligne sélectionnée est imprimé dans la fenêtre de débogage pour visualiser les résultats.
En résumé, le code parcourt chaque paragraphe du document, sélectionne et imprime chaque ligne individuellement, en s'assurant d'ignorer les paragraphes vides et de traiter correctement les paragraphes simples ou multiples.

VB:
Option Explicit
Sub SelectionnerTexte()
  ' Déclaration des variables
    Dim wdParagraphe As Paragraph
    Dim wdNbLignesParagph As Integer
    Dim wdLigneIndex As Byte            ' Index de la ligne dans le paragraphe
    Dim wdtexteLigne As String          ' Texte de la ligne sélectionnée
  
  ' Déplacer la sélection au début du document
    Selection.HomeKey wdStory
  
  ' Parcourir chaque paragraphe dans le document actif
    For Each wdParagraphe In ActiveDocument.Paragraphs
        ' Vérifier si le paragraphe n'est pas vide
        If Len(wdParagraphe.Range.Text) > 1 Then
          ' Sélectionner le paragraphe
            wdParagraphe.Range.Select
          ' Calculer le nombre de lignes dans le paragraphe
            wdNbLignesParagph = wdParagraphe.Range.ComputeStatistics(wdStatisticLines)
          
          ' Si le paragraphe a une seule ligne
            If wdNbLignesParagph = 1 Then
              ' Déplacer la sélection au début de la ligne
                Selection.MoveLeft wdCharacter, 1
              ' Étendre la sélection jusqu'à la fin de la ligne et récupérer le texte
                Selection.EndKey wdLine, wdExtend
                wdtexteLigne = Selection.Text
              ' Afficher le texte de la ligne dans la fenêtre de débogage
                Debug.Print wdtexteLigne
            Else
              ' Si le paragraphe contient plusieurs lignes
              ' Parcourir chaque ligne dans le paragraphe
                For wdLigneIndex = 1 To wdNbLignesParagph
                  ' Sélectionner la ligne
                  ' Si c'est la première ligne, déplacer la sélection au début de la ligne
                    If wdLigneIndex = 1 Then
                        Selection.MoveLeft wdCharacter, 1
                    End If
                  ' Étendre la sélection jusqu'à la fin de la ligne
                    Selection.EndKey wdLine, wdExtend
                  ' Récupérer le texte de la ligne sélectionnée
                    wdtexteLigne = Selection.Text
                  ' Afficher le texte de la ligne dans la fenêtre de débogage
                    Debug.Print wdtexteLigne
                  ' Si ce n'est pas la dernière ligne, déplacer la sélection à la ligne suivante
                    If wdLigneIndex <> wdNbLignesParagph Then
                        Selection.MoveRight wdCharacter, 1
                    End If
                Next wdLigneIndex
            End If
        End If
    Next wdParagraphe
End Sub

Je cherche une solution pour substituer l'objet de sélection dans mon script VBA Word par une méthode permettant de passer toutes les données en mémoire de manière efficace.
si vous aves des solutions c'est avec plaisir.
merci
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
par contre que les éléments soient sélectionnés pour travailler dessus j'en suis pas sur
il y a le membre range( début , nombre de caractère)
pour le point espérons qu'il n'y en ai pas un dans une lignes sinon tout ton principe tombe à l'eau
 

patricktoulon

XLDnaute Barbatruc
re
VB:
Sub lire_tout_les_paragraphes()
    Dim Wapp As Object, WdoC As Object, para As Object, line

    Set Wapp = CreateObject("Word.Application")
    Wapp.Visible = False    'facultatif

    ' Ouvrir le document Word
    Set WdoC = Wapp.Documents.Open("C:\Users\patricktoulon\Desktop\1-Prépa-Compétence - Présentation Diaporama.pdf.pdf")

    'boucle sur les paragraphes
    For Each para In WdoC.Paragraphs
        i = i + 1
        Debug.Print "paragraphe (" & i & ")"
        ' Lire le paragraphe ligne par ligne
        For Each line In Split(para.Range.Text, vbCrLf)
            '
            Debug.Print line
        Next line
        Debug.Print "--------------------"
    Next

    WdoC.Close: Wapp.Quit: Set WdoC = Nothing: Set Wapp = Nothing
End Sub
 

laurent950

XLDnaute Barbatruc
Re @patricktoulon

Ouvre un fichier Word vide
copie ci-dessous dans le fichier Word pour Teste
c'est que du Texte uniquement du Texte.

Ci-dessous quand je fais le test.

1 ligne
(Espace entre ligne vide)
1 Paragraphe de (4 lignes)
(Espace entre ligne vide)
1 Ligne
(Espace entre ligne vide)
1 Paragraphe de (7 lignes)
(Espace entre ligne vide)
1 ligne
(Espace entre ligne vide)
1 ligne
(Espace entre ligne vide)
1 ligne
(Espace entre ligne vide)

ci-dessous tu peux copier cela dans le fichier Word

c'est que du texte j'ai pas de fichier je fais des tests que sur du texte uniquement qui se trouve dans un fichier

' *************************************************

alors tes paragraphes sont une ligne mais en wraptext(ajusté automatiquement a la ligne )

alors tes paragraphes sont une ligne mais en wraptext(ajusté automatiquement a la ligne ) y a pas pire comme word donne moi ce word que je l'examine,alors tes paragraphes sont une ligne mais en wraptext(ajusté automatiquement a la ligne ) y a pas pire comme word donne moi ce word que je l'examine

donc le fichier Word tu peux écrire.

alors tes paragraphes sont une ligne mais en wraptext(ajusté automatiquement a la ligne ) y a pas pire comme word donne moi ce word que je l'examine,alors tes paragraphes sont une ligne mais en wraptext(ajusté automatiquement a la ligne ) y a pas pire comme word donne moi ce word que je l'examinealors tes paragraphes sont une ligne mais en wraptext(ajusté automatiquement a la ligne ) y a pas pire comme word donne moi ce word que je l'examine,alors tes paragraphes sont une ligne mais en wraptext(ajusté automatiquement a la ligne ) y a pas pire comme word donne moi ce word que je l'examine

donc le fichier Word tu peux écrire.

donc le fichier Word tu peux écrire.

donc le fichier Word tu peux écrire.
 

Discussions similaires

Statistiques des forums

Discussions
315 091
Messages
2 116 114
Membres
112 663
dernier inscrit
Pauline243