Extrait de Table des Matières Word dans Excel SANS num de Page

Bonjour à tous,

Afin d'automatiser une tache que l'on fait presque tous les jours dans mon nouveau boulot, j'aimerai extraire une table des matières Word dans Excel, sans passer par "Copier / Coller".

En cherchant un peut sur internet je suis arriver à bidouiller des morceaux de code pour arriver à ceci:

Sub ImporterNomenclature()
   'Importe la table des matière d'un WordDoc

   Dim WordDoc         As Object
   Dim NomDeDoc   As Variant
   Dim TabMat, Champ

   NomDeDoc = Application.GetOpenFilename("Word files (*.doc*),*.doc*", , _
     "Browse for file containing table to be imported")

   If NomDeDoc = False Then Exit Sub '(si l'utilisateur annule l'ouverture du WordDoc)

   Set WordDoc = GetObject(NomDeDoc)  'Ouvre le WordDoc
   Set TabMat = WordDoc.TablesOfContents(1)

i = 2
For Each Champ In TabMat.Range.Fields
tString = Champ.Result.Text
i = i + 1
Range("A" & i).Value = Left(tString, Len(tString))
Next
End Sub

Mon problème ici est que ce qui apparait dans excel inclus les numéros de page, et même sous deux formes différentes:

-Numéro de page une ligne sur deux, facile à supprimer avec un petit bout de code supplémentaire

-Mais SURTOUT, Numéro de page collé au dernier mot de chaque titre!

C'est ce deuxième point qui me pose souci. J'ai pensé à supprimer les numéro en bout de "String" mais certain de mes titre sont sensés se terminer par un chiffre et je perdrais donc la un morceau de mon texte.

Je me doute qu'une solution existe pour importer la nomenclature sans les num de page mais étant débutant sur VBA, je n'ai pas trouvé la solution.

Merci à vous d'avoir lu mon pavé,

Bonne journée!

Bonjour

Dans Word La table des matières (TableOfContents) est constituée des titres de différents niveaux (en principe 1 à 3)

Plutot que de récupérer la table des matières, mieux vaut parcourir le corps du document à la recherche des paragraphes de styles "Titre xx"

Dim p As Paragraph
Dim cntParagraphs As Long
Dim iPar As Long
cntParagraphs = ActiveDocument.Paragraphs.Count
For iPar= 1 to cntParagraphs
  Debug.Print ActiveDocument.Paragraphs(iPar).Range.Text
  Set p = ActiveDocument.Paragraphs(iPar)
  if p.Range.Style = wdStyleHeading1 Then
    Debug.Print p.Range.Text
  End if
Next iPar

Bonjour Scrapper, merci beaucoup pour ton retour!

Je comprends la logique de ton raisonnement et je cherche en effet bien au final à importer des titres de 1 à 3. Cependant impossible de définir p comme "Paragraph", la seule option chez moi est "ParagraphFormat2".

Excuse moi si je pose des question bête, je suis tout a fait novice sur VBA, mais le fait que tu fasses référence à "ActiveDocument" signifie-t-il que tu fait tout ça dans Word? Puis-je remplacer ton "ActiveDocument" par mon "WordDoc" (qui correspond à un fichier Word ouvert avec un explorateur de fichier).

En tout cas merci quand même!

Excuses moi aussi j'ai tapé cela sans prendre le temps de tester.

Tout le monde est plus ou moins novice, voilà longtemps (une dizaine d'années) que je ne travaille plus avec Word, mais que je fais uniquement du reporting avec Excel.

Pour traiter à la fois des objets Word et des objets Excel, il faut mettre en références Word et Excel.

Pour instancier un objet Paragraph il faut peut être le définir ainsi

Dim p as Word.Paragraph

Pour que cela passe à la compilation.

Donc, je réponds oui à : "Puis-je remplacer ton "ActiveDocument" par mon "WordDoc""

J'ai un doute sur ton code :

Set WordDoc = GetObject(NomDeDoc) 'Ouvre le WordDoc

la méthode GetObject n'ouvre pas un document mais une instance de WinWord.exe

Il y a donc deux étapes

Set wordDoc = GetObject(, "Word.Application")
wordDoc.Visible = True 
wordDoc.Documents.Open CheminDeDoc & NomDeDoc

Bonjour Scaper, merci pour tes retours.

Cependant je crains ne pas réussir a faire fonctionner tes lignes de code:

- je ne peux pas définir p as "WordParagraph"

-Les deux étapes que tu m'as décrites dans ton dernier message ne fonctionnent pas et pour le coup, je n'ai pas les capacité de savoir pourquoi... ^^

En tout cas merci de m'avoir consacré du temps!

Bonjour à tous

As-tu bien sélectionné la référence Word comme te l'indiquais scraper ?

(Outils, Références dans l'éditeur VBA)

Bonjour Chris,

Ahah, non, je n'avais pas compris qu'il y avais cette manip a faire. J'ai maintenant en effet accès au élément de type "as Paragraph". Je teste tous cas et je vous tiens au courant.

Merci beaucoup!

Bonjour Chris, bonjour Scaper.

Je reviens vers vous pour deux point, disons que mon code se décompose en deux partie: ouvrir le fichier word, et en extraire les titres de paragraphe.

-Lorsque je garde la première partie de mon code original puis que j'utilise le code de Scraper pour extraire les paragraphes, cela "fonctionne" puis plante. En gros, le code m'écrit les première ligne de ma page de garde (du texte type "normal") puis plante lorsqu'il arrive a ma table des matières. Autant vous dire que ce qui m'intéresse se trouve justement après la table des matières ^^

-Lorsque je remplace également la première partie de mon code comme suggéré, il plante au niveau de l'ouverture du Word (message d'erreur "propriété ou méthode non gérée par cet objet")

Je vous mets ci dessous mon code:

Sub Test2()
Dim p As Word.Paragraph
Dim cntParagraphs As Long
Dim iPar As Long
Dim WordDoc As Object
Dim NomDeDoc   As Variant
Dim NomFeuille As String

 NomDeDoc = Application.GetOpenFilename("Word files (*.doc*),*.doc*", , _
     "Browse for file containing table to be imported")

   If NomDeDoc = False Then Exit Sub '(si l'utilisateur annule l'ouverture du WordDoc)

   Set WordDoc = GetObject(, "Word.Application") 'Ouvre le WordDoc
   WordDoc.Visible = True
   WordDoc.Document.Open (NomDeDoc)

cntParagraphs = WordDoc.Paragraphs.Count
For iPar = 1 To cntParagraphs
  Cells(iPar + 2, 1) = WordDoc.Paragraphs(iPar).Range.Text
  Set p = WordDoc.Paragraphs(iPar)
 If p.Range.Style = wdStyleHeading1 Then
  Debug.Print p.Range.Text
  End If
Next iPar

End Sub

Autant je comprends les éléments simple d'excel et la manière de les manipuler via VBA, autant je suis complètement perdu avec ce code ^^ Peut etre me suis-je attaque à un tros gros morceau pour moi?

Je vous remercie dans tous les cas!

Bonjour BaptGTLLR

Je pense que l'on va y arriver, il ne faut pas désespérer, envoie nous le document Word, avec la macro à l'intérieur (.docm) et on t'aidera.

Je sais que tu veux le piloter depuis Excel mais on verra l'intégration après.

re bonjour Scraper,

Je n'ai pas de macro dans mon Word mais je te le mets tout de même ici en format .docm

En fait la raisin pour laquelle je voulais tout piloter depuis excel est que je voudrait dans différence feuille d'un meme Excel, importer les tables de matières de Words différents (mais avec la même structure, issus du même "modèle")

Ton but ici est d'écrire une code qui génère la table des matières dans Word, puis de "retranscrire" ce code dans excel?

PS: Pour information, je cherche même "seulement" à extraire la table des matières à partir de l'article 3 (3ème itération de mon "titre 1"). Je ne me suis pas focalisé la dessus car je vois assez bien comment supprimer automatiquement tout ce qui ne m'intéresse pas dans excel. Je te donne juste l'information au cas ou cela facilite la chose, sinon restons en à l'objectif de départ, extraire cette table!

Un grand merci à toi.

Re,

Alors je replonge dans le traitement de document Word, pour avoir plusieurs Tables des matières, et bien les gérer, il faut un document maitre, et des sous documents, il faut alors bien gérer la numérotation débutantes de chaque sous-document : Cela me replonge des années en arrière.

Pour traiter de l'extraction des titres d'un seul document, voila une macro qui crée dans ton répertoire USERPROFILE de WINDOWS c:\users\.. (ton profil)... le fichier doc3.txt.

 Sub Test2()
Dim p As Word.Paragraph
Dim cntParagraphs As Long
Dim iPar As Long
Dim iNumTitre As Long
Dim sFic As String

Open Environ("USERPROFILE") & "\doc3.txt" For Output As #1
cntParagraphs = ActiveDocument.Paragraphs.Count
For iPar = 1 To cntParagraphs
  Set p = ActiveDocument.Paragraphs(iPar)
  'ici on extrait les éléments de la table des matières
  If InStr(1, p.Style, "TM") Then
  ''Debug.Print p.Range.Text
  End If
  If InStr(1, p.Range.Text, "DESCRIPTION DES TRAVAUX") Then
    iPar = iPar  'pour mettre un point d'arret qui intervient deux fois pour le style TM 3 et le style Titre 3
  End If
  'ici on extrait vraiment les paragraphes titres 1 à 3
  If InStr(1, p.Style, "Titre 1") Or InStr(1, p.Style, "Titre 2") Or InStr(1, p.Style, "Titre 3") Then  'And InStr(1, UCase(p.Range.Text), "DESCRIPTION DES TRAVAUX")
    Debug.Print p.Range.Text
    Print #1, p.Range.Text
    iNumTitre = iNumTitre + 1
  End If
Next iPar
Close #1
End Sub
Le fichier résultat obtenu est
14doc3.txt (3.96 Ko)
j'enverrai le document Word avec la macro dans sa version finale ensuite, je vais prendre mon train et j'arrive chez moi vers 19h où je reviendrai vers ce forum pour tes remarques. A ce soir

Merci beaucoup pour ces précisions Scraper, j'ai copier coller ton code dans mon Word et j'arrive au même fichier que toi! Me reste maintenant à bien le comprendre..

Est -il possible d'extraire également le "numéro" de titre (du genre 1.2.2.)? J'aimerai les afficher dans mon excel et ils me servais pour faire de la mise en forme conditionnelle par la suite (mettre les titre de même niveau hiérarchique dans le même style).

En tous cas merci beaucoup pour ton investissement. Je ne serais malheureusement pas sur mon PC jusque Lundi, donc bon Week End à toi.

je viens de rentrer c'est presque 20h pour avoir la table des matières sous le test if instr(1, p.range.Text, "TM") Change la ligne

''Debug.Print p.Range.Text

En

Print #1, p.Range.Text

Salut Scraper,

Je reviens sur le sujet et j'ai tester ta dernière suggestion. Ca donne un truc super: un fichier texte avec les "numéro", "titre" et "pages" séparés par des tabulations. Donc aucuns souci pour importer ca dans excel et me refaire une petite macro pour la mise en page!

C'est donc une solution assez concluante pour moi sur le résultat. Par contre pour ce qui est du côté pratique, il faut que je lance la macro dans chaque Word pour en extraire ce fichier txt puis l'ouvrir dans Excel. La manip est "satisfaisante" dans le sens ou on utilise une belle astuce pour extraire chaque titre de paragraphe mais concrètement, cela prends au final plus de temps que de copier la table des matière et de la coller (collage spécial) dans Excel, ce qui arrive au même résultat.

Peut être voyais tu ca comme une étape avant d'utiliser ce code dans Excel?

En tous cas, encore une fois merci pour ton temps!

Je ne vois pas l'intérêt de ce fichier excel. T'es-tu posé la question. Lorsque un document est modifié comment être sûr de mettre a jour la table des matières extraite?

cette manipulation ne permet pas d'accéder au document depuis excel, quel intérêt ? Plusieurs rédacteurs?

Tu dis : cette macro était une étape , lancer la macro dans chaque word, pour faire un copier/coller dans excel.

tous les documents Word sont t'ils dans un répertoire, sont t'ils mélangés avec des documents pour lesquels la macro ne serait pas utile?

j'en reviens au but de ce fichier excel, j'imagine qu'il permet de contrôler quelque chose : l'exhaustivité des paragraphes ? Oui/non?

Dans une automatisation, il est bon de connaître toutes les étapes, et l'aspect du résultat final : exemple colonne A le nom des fichiers, colonne B, les tables des matières condensées dans une cellule à droite du nom du fichier, faut-il ajouter la date de dernière mise à jour du document, ...

un petit fichier résultat de ce qui est attendu serait le bienvenu.

Bonjour Scraper,

Excuse moi, je ne t'ai pas donné assez de contexte.

Je suis architecte et les document Word sont des "CCTP" (Cahier des Clauses Techniques Particulières). Ils décrivent par Lot (gros œuvre, électricité, cloison, peinture...) les éléments que l'artisant doit chiffrer pour le projet. Pour chaque projet nous avons environs un quinzaine de Lots (donc 15 CCTP). Ces CCTP sont toujours organisés de la même maniere: les deux premier Article (titre 1) sont plus ou moins des généralités et l'Article 3 décrit les travaux concrètement.

Pour accompagner le CCTP vient le DPGF (Décomposition des Prix Globale et Forfaitaire). Celui ci sert de "listing" à l'artisant pour chiffrer son offre et il reprends rigoureusement les paragraphe de l'article 3 du CCTP.

Par exemple dans le word que je t'ai envoyé, le point de l'article 3 sont cloisons, faux plafond etc. Le CCTP decris par exemple les matériaux à employer quand le DPGF donne le nombre de m² de cloison ou de plafond.

J'ai donc dans un dossier les 15 Word par lot et le but et de faire un excel avec 15 feuilles correspondants aux 15 Lots.

Comme je te disais, il y a ensuite de la mise en page à faire, mais je ne pense pas que cette partie me pose problème.

Je te joins un .xlsm avec en feuille 2 un exemple de DPGF.

6exemple-dpgf.xlsm (19.33 Ko)

Merci à toi.

Pardon monsieur l'architecte que je salue.

Je regarderai votre fichier et j'automatiserai.

Avec quelques efforts l'automatisation est prête : pilotage de Word depuis excel

Oulala! Quel travail! Merci beaucoup Scraper!

Je me penche dessus, je test tout ça et je reviens vers toi!

Rechercher des sujets similaires à "extrait table matieres word num page"