Tableaux word vers Excel

Bonjour,

Je souhaiterais bâtir une macro permettant de copier les tables dont le titre contient le mot clé "liste" disséminées à divers endroits d'un document word, vers une feuille excel, les unes à la suite des autres.

Toutes ces tables ont un format identique (4 colonnes).

Certaines cellules de ces tables contiennent des retours chariot et des listes à puce, qu'il me faut conserver lors de la copie vers excel.

J'ai trouvé des bouts de code à gauche et à droite sur internet, mais soit je ne parviens pas à limiter l'extraction aux tables voulues soit le texte est copié en brut sans respect des retours chariot et des listes à puce. Je suis donc toujours bloqué sur le ligne de départ.

Je vous remercie par avance pour votre aide.

Bonjour,

Auriez vous le fichier Word en question ? Merci

Bonjour Valc,

Je ne travaille pas pour la Nasa mais le contenu de mon word étant plus ou moins confidentiel, j'en ai fais une copie avec un contenu tout à fait quelconque.

Donc dans le fichier joint, l'idée serait de copier les tables 5, 7 et 8 car elles seules ont un titre contenant 'Liste".

Merci,

14word-de-test.docx (47.23 Ko)

Bonjour,

Voici un premiers jet.

Pour que ça fonction il faut renseigner l'adresse du fichier Word et importer la référence Word Libraire

y dans VBA .

16test.xlsm (18.89 Ko)

Merci Valc,

En réutilisant un autre code j'ai pu légèrement modifier le code pour pouvoir aller chercher le fichier word à utiliser.

Sub wrd()
    'necessite d'activer la reference microsoft Word xx.x Object Library

'--------------------------------------
'Détermination du fichier vecteur (programme)
    file_prog = ActiveWorkbook.Name
    file_prog_pth = ActiveWorkbook.Path

    Set X_prog = Workbooks(file_prog).Sheets(1)

    Dim NDF As Variant
Dim WordApp As Object, WordDoc As Object
Dim i As Integer, 

ChDrive Left(ActiveWorkbook.Path, 1)
    ChDir ActiveWorkbook.Path
    NDF = Application.GetOpenFilename
    If Not NDF = False Then
        Set WordApp = CreateObject("Word.Application")
        Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=True)

    i = 2
    For Each unetable In WordDoc.Tables()
          letitre = unetable.Title

          If letitre <> "" Then

            X_prog.Cells(i, 1) = unetable.Columns(1).Cells(2)
            X_prog.Cells(i, 2) = unetable.Columns(2).Cells(2)
            X_prog.Cells(i, 3) = unetable.Columns(3).Cells(2)
            X_prog.Cells(i, 4) = unetable.Columns(4).Cells(2)

            i = i + 1
        End If
    Next

    WordDoc.Close
        WordApp.Application.Quit
        Set WordDoc = Nothing
        Set WordApp = Nothing
    End If

End Sub

On est d'accord que le code ne permet pas actuellement de conserver les retours chariots, puces,etc? Juste histoire de savoir si c'est chez moi que ça ne fonctionne pas

Par contre je me suis mal exprimé, je disais que toutes ces tables avaient un format identique. en fait elles ont toutes 4 colonnes mais peuvent avoir un nombre de ligne variable. Il est possible d'ajouter cette notion au code?

Cordialement,

re,

j'ai pu bidouiller le code pour qu'il s'adapte au nombre de ligne variable dans chaque table.

Sub wrd()
    'necessite d'activer la reference microsoft Word xx.x Object Library

'--------------------------------------
'Détermination du fichier vecteur (programme)
    file_prog = ActiveWorkbook.Name
    file_prog_pth = ActiveWorkbook.Path

    Set X_prog = Workbooks(file_prog).Sheets(1)

    Dim NDF As Variant
Dim WordApp As Object, WordDoc As Object
Dim i As Integer, j As Integer, u As Integer

ChDrive Left(ActiveWorkbook.Path, 1)
    ChDir ActiveWorkbook.Path
    NDF = Application.GetOpenFilename
    If Not NDF = False Then
        Set WordApp = CreateObject("Word.Application")
        Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=True)

    For Each unetable In WordDoc.Tables()
          letitre = unetable.Title
          If letitre <> "" Then
            j = unetable.Rows.Count

            For u = 2 To j '6
            i = Range("A" & Rows.Count).End(xlUp).Row + 1
            X_prog.Cells(i, 1) = unetable.Columns(1).Cells(u)
            X_prog.Cells(i, 2) = unetable.Columns(2).Cells(u)
            X_prog.Cells(i, 3) = unetable.Columns(3).Cells(u)
            X_prog.Cells(i, 4) = unetable.Columns(4).Cells(u)
            Next u
          End If
    Next

    WordDoc.Close
        WordApp.Application.Quit
        Set WordDoc = Nothing
        Set WordApp = Nothing
    End If

End Sub

Il ne reste "plus que" le problème des retours chariots, puces, etc à régler...

Bonjour,

Une solution est de passer par le presse-papier (Clipboard).

Le code (nettoyé) devient alors (rq : avec la bonne ref !) :

Sub wrd()   ' activer la réf MS Forms 2.0 Object Library
Dim NDF As Variant
Dim Feuil As Object, Ttk As DataObject
Dim WordApp As Object, WordDoc As Object, Tbl As Object
Dim lg As Integer, i As Integer, j As Integer

    ChDrive Left(ActiveWorkbook.Path, 1)
    ChDir ActiveWorkbook.Path
    NDF = Application.GetOpenFilename("Fichiers Word; *.doc, *.docx")
    If Not NDF = False Then
        Set Feuil = ActiveWorkbook.Sheets(1)
        Set WordApp = CreateObject("Word.Application")
        Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=True)
        Set Ttk = New DataObject
        For Each Tbl In WordDoc.Tables()
            If Tbl.Title <> "" Then
                lg = Feuil.Range("A" & Rows.Count).End(xlUp).Row + 1
                For i = 2 To Tbl.Rows.Count
                    For j = 1 To Tbl.Columns.Count
                        Tbl.cell(i, j).Range.Copy
                        Ttk.GetFromClipboard
                        Feuil.Cells(lg, j).Value = Ttk.GetText(1)
                    Next j
                    lg = lg + 1
                Next i
              End If
        Next Tbl
        WordDoc.Close
        WordApp.Application.Quit
        Set WordDoc = Nothing
        Set WordApp = Nothing
        Set Ttk = Nothing
        Set Feuil = Nothing
    End If
End Sub

Pierre

Bonjour Pierre,

Impec, ça tourne nikel.

Merci à toi et à Valc.

Bonsoir,

Finalement j'ai une erreur intermittente au niveau de Ttk.GetFromClipboard

Erreur d'exécution '-2147221040 (800401d0':

DataObject:GetFromClipboard Echec de OpenClipboard

Si vous avez une petite idée..

Merci

bon, j'ai essayé de jouer avec les OpenClipboard 0&, EmptyClipboard mais rien n'y fait. Des fois ça marche( c'est rare), des fois ça plante (très souvent)

Rechercher des sujets similaires à "tableaux word"