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 estj'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.
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!