Word Extraire un glossaire à partir des liens et d'un style

gerardphi

XLDnaute Junior
Bonjour,

J'aurai besoin de ton aide!

Je souhaiterais, à partir du fichier "ED_TM_1.docx" en PJ. En extraire un tableau (glossaire ci-dessous) construit suivant : les liens (bleu), les définitions (avec un style une "coche") et le/les paragraphes auxquels ils appartiennent.

Merci de votre aide!


1708079756350.png
 

Pièces jointes

  • ED_TM_1.docx
    592.6 KB · Affichages: 6
Solution
Bonjour gerardphi, le forum,

Ton dernier fichier n'était pas le même que celui précédemment fourni (au post #9) : il manquait la table à alimenter.

Tu trouveras ci-joint ton dernier fichier avec cette table créée (avec les en-têtes et une première ligne vide). La macro fonctionne bien.

A+

mromain

XLDnaute Barbatruc
Bonjour gerardphi, le forum,

Le traitement que tu souhaites automatiser semble réalisable.
On peut envisager parcourir tous les liens hypertextes et récupérer :
  • le texte affiché – équivalent à ta colonne Nom ;
  • l'adresse du lien hypertexte – équivalent à ta colonne Déf/Lien ;
  • le titre de niveau 1 précédent le lien hypertexte – équivalent à ta colonne Titre ;
  • le titre de niveau 2 précédent le lien hypertexte – équivalent à ta colonne Paragraphe.
Reste à savoir où tu souhaites afficher ton tableau récapitulatif.
Si c'est dans Word, tu n'auras pas les filtres.
Si c'est dans Excel, tu pourras avoir les filtres.

Si cette solution t'intéresse, il faudra retoucher la définition de tes titres (au moins les titres de niveau 1 et 2).
Actuellement, leur niveau hiérarchique est considéré comme du corps de texte.

A+
 

gerardphi

XLDnaute Junior
Bonjour mromain,
Merci de ton message, et de tes suggestions!!!!!;););)
Après réflexion, peux-tu installer le tableau dans word et à la page 2 (avant la TM). Serait-il possible de trier les noms par ordre alphabétique.
J'ai d'autres fichier basé sur le même modèle, peux-tu prévoir une exportation du tableau sous excel.
Merci!!!
Bonne soirée et merci!!!!
Cdt
 

mromain

XLDnaute Barbatruc
Bonjour gerardphi, le forum,

Tu trouveras ci-joint une solution intermédiaire permettant d'extraire les liens dans un tableau Excel.
Libre à toi ensuite de trier les infos et copier le tableau où tu veux dans le document.

Il te faudra au préalable redéfinir le niveau hiérarchique de tes titres 1 et 2 :
NiveauHierarchique.png


Ensuite, une fois le fichier Extraction.xlsm ouvert et les macros activées, il faut exécuter la macro ExtractLinks et sélectionner ton document Word.
Tu devrais alors obtenir ce résultat :
ExempleResultat.png


A+
 

Pièces jointes

  • Extraction.xlsm
    16.9 KB · Affichages: 5

gerardphi

XLDnaute Junior
Re bonjour,
  • Après réflexion, je te propose de faire l'extraction que des définitions avec "les coches (en vertes)"
  • Ci-dessous le résultat de l'extraction avec le fichier "ED_TM_1.docx". Dans l'onglet "Feuille1", j'ai joint le tableau que je souhaiterais avoir dans word, à la page 2 (avant la TM). Serait-il possible de trier les noms par ordre alphabétique.
  • J'ai d'autres fichier basé sur le même modèle de word, peux-tu prévoir une exportation du tableau dans excel en ajoutant 2 autres colonnes : le lien du nom et le document. Ex : Acide silicique (lien: .../ED_Roches 2023v2/2.5 Roches issues du magma primaire/Acide silicique
  • Je viens d'essayer la macro avec un autre fichier "ED_Roches 2023v2.docm", mais j'ai "l'erreur 4680". J'ai aussi modifier le niveau hiérarchique, lien ci-dessous https://we.tl/t-rRnonnsR4i
  • Peux-tu faire la macro à partir du fichier "ED_Roches 2023v2.docm". A quoi est dû l'erreur?
Merci!!!
Bonne fin de journée et merci!!!!
Cdt
 

Pièces jointes

  • mRomain_v1 Extraction de ED_TM_1.xlsm
    25.1 KB · Affichages: 3
Dernière édition:

mromain

XLDnaute Barbatruc
Bonjour gerardphi, le forum,

Après réflexion, je te propose de faire l'extraction que des définitions avec "les coches (en vertes)"
Je t'avoue ne pas très bien comprendre ce que tu veux...
Est-ce qu'il faut extraire uniquement les liens qui sont sous un titre de niveau 3 ?

Peux-tu faire la macro à partir du fichier "ED_Roches 2023v2.docm". A quoi est dû l'erreur?
L'erreur est due au fait que certains liens hypertexte sont sur des images.
La nouvelle version ci-jointe ignore les images.

En plus sur cette version :
  • les doublons sont supprimés ;
  • les données sont triées par Nom ;
  • l'ordre des colonnes a été modifié, tu as bien en premier les trois colonnes que tu veux mettre dans le document ;
  • deux colonnes ont été ajoutées avec le nom et le path du document traité.

A+
 

Pièces jointes

  • Extraction.xlsm
    17.6 KB · Affichages: 2

gerardphi

XLDnaute Junior
Bonjour mromain,
Désolé d'avoir mal formulé ma "demande";)
Suite à l'extraction des liens et après réflexion, j'avais exclu un tableau dans un fichier Excel car le résultat serait compliqué à exploiter.:(

Ci-joint, le fichier Word "ED_Roches 2023v3"avec son tableau (grisé) qui est inséré avant la table des matières.
Le tableau, par ordre alphabétique, est extrait à partir des noms avec le style "Géo_Déf T1" ("les coches (en vertes)").
Peux-tu en faisant un "CTRL+clic" sur un nom du tableau, faire un renvoi dans le document. Ex: "CTRL+ acide silicique" renvoie à: "l'acide silicique à la page 27"

Merci encore;););)
Cdt
 

mromain

XLDnaute Barbatruc
Bonjour gerardphi, le forum,

Le tableau, par ordre alphabétique, est extrait à partir des noms avec le style "Géo_Déf T1" ("les coches (en vertes)").
Dans ton document, il n'y a aucun lien hypertexte dans les zones avec le style "Géo_Déf T1".
Tu peux tester ce code pour t'en convaincre :
VB:
Sub Test()
Dim l_o_hl As Hyperlink
Dim l_l_nb As Long
    For Each l_o_hl In ThisDocument.Range.Hyperlinks
        If (Not l_o_hl.Address Like vbNullString) And (l_o_hl.Range.Style Like "Géo_Déf T1") Then
            'l_o_hl.Range.Select:             Stop
            l_l_nb = l_l_nb + 1
        End If
    Next l_o_hl
    If l_l_nb = 0 Then MsgBox "Ancun lien ayant pour style ""Géo_Déf T1"" n'a été trouvé.", vbExclamation, "Info"
End Sub
Cette règle ne permet donc pas d'identifier les liens hypertextes.

Peux-tu en faisant un "CTRL+clic" sur un nom du tableau, faire un renvoi dans le document. Ex: "CTRL+ acide silicique" renvoie à: "l'acide silicique à la page 27"
Ça peut se faire à l'aide de signets et en VBA à partir du moment où on sait bien identifier les liens...

Comment je peux enregistrer une table des matière en tant que modèle?
Il faudrait que tu regardes du côté des QuickParts.

En l'état, difficile d'avancer.

A+
 

gerardphi

XLDnaute Junior
Bonjour mromain,
En effet le style "Géo_Déf T1" ("les coches (en vertes)") ne possède pas de lien, car ce sont des définition que je rajoute dans mon document.
Ex
NomTitreParagraphe
Acide silicique2. LES ROCHES MAGMATIQUES2.5 Roches issues du magma primaire
Clathrates1. LES ROCHES1.5 Autres matériaux liés à la matière organique
Komatiite Komatiite (Planete Terre)2. LES ROCHES MAGMATIQUES2.5 Roches issues du magma primaire
La pantellerite et la comendite2. LES ROCHES MAGMATIQUES2.6 Diagrammes TAS et série magmatiques
Leucocrate1. LES ROCHES1.8 Le cycle des roches de la croûte continentale
Siliceux (adj.) : définition1. LES ROCHES1.3 Les roches sédimentaires
Siliciclastique1. LES ROCHES1.3 Les roches sédimentaires
Silicification2. LES ROCHES MAGMATIQUES2.5 Roches issues du magma primaire
Tholéiitique2. LES ROCHES MAGMATIQUES2.2 Origine des roches magmatiques
Trondhjémites1. LES ROCHES1.8 Le cycle des roches de la croûte continentale

Merci de ton aide!!!!!!;);););)
Cdt
 

mromain

XLDnaute Barbatruc
Bonjour gerardphi,

Tu trouveras une solution ci-dessous à mettre dans ton document.
VB:
Public Sub MajTableDef()
Dim l_as_geoDefsInfos()     As String
Dim l_o_dicoTocLinks        As Object  'Scripting.Dictionary
Dim l_l_iDef                As Long
Dim l_s_subAddress          As String
Dim l_o_table               As Word.Table
    
    'récupérer la table listant les définitions
    Set l_o_table = ThisDocument.Tables(1)
    'la vider, sauf la ligne d'entête et la première ligne de données
    With l_o_table
        Do While .Rows.Count > 2
            .Rows(3).Delete
        Loop
    End With
    
    'extraire les définitions et les liens des tables des matières
    l_as_geoDefsInfos = ExtractGeoDefsInfos(ThisDocument)
    Set l_o_dicoTocLinks = ExtractTocLinks(ThisDocument)
    
    'boucler sur toutes les définitions trouvées
    For l_l_iDef = 1 To UBound(l_as_geoDefsInfos, 1)
        'ajouter les données au tableau
        With l_o_table.Rows.Add
            l_s_subAddress = SearchGeoDefTocLink(l_o_dicoTocLinks, l_as_geoDefsInfos(l_l_iDef, 1))
            .Cells(1).Range.Hyperlinks.Add .Cells(1).Range, , l_s_subAddress, , l_as_geoDefsInfos(l_l_iDef, 1)
            .Cells(2).Range.Text = l_as_geoDefsInfos(l_l_iDef, 2)
            .Cells(3).Range.Text = l_as_geoDefsInfos(l_l_iDef, 3)
        End With
    Next l_l_iDef
    
    'supprimer la première ligne de données
    l_o_table.Rows(2).Delete

End Sub

'Private Function SearchGeoDefTocLink(p_o_dicoTocLinks As Scripting.Dictionary, p_s_geoDef As String) As String
Private Function SearchGeoDefTocLink(p_o_dicoTocLinks As Object, p_s_geoDef As String) As String
Static s_o_dicoTocLinks     As Object   'Scripting.Dictionary
Static s_av_dicoKeys()      As Variant
Static s_l_nbKeys           As Long
Dim l_l_i       As Long
    If Not s_o_dicoTocLinks Is p_o_dicoTocLinks Then
        Set s_o_dicoTocLinks = p_o_dicoTocLinks
        s_av_dicoKeys = s_o_dicoTocLinks.Keys()
        s_l_nbKeys = s_o_dicoTocLinks.Count
    End If
    For l_l_i = 0 To s_l_nbKeys - 1
        If UCase(s_av_dicoKeys(l_l_i)) Like UCase("*" & p_s_geoDef & "*") Then
            SearchGeoDefTocLink = s_o_dicoTocLinks.Item(s_av_dicoKeys(l_l_i))
            Exit Function
        End If
    Next l_l_i
End Function

Private Function ExtractGeoDefsInfos(p_o_doc As Word.Document) As String()
Const c_s_styleT1       As String = "Géo_Titre1"
Const c_s_styleT2       As String = "Géo_Titre2"
Const c_s_styleGeoDef   As String = "Géo_Déf T1"
Dim l_s_T1          As String
Dim l_s_T2          As String
Dim l_as_infos()    As String
Dim l_as_res()      As String
Dim l_l_nbDefs      As Long
Dim l_l_nbInfos     As Long
Dim l_l_i           As Long
Dim l_l_j           As Long
Dim l_l_k           As Long
Dim l_s_tmp         As String
Dim l_o_paragraph   As Word.Paragraph
    
    ReDim l_as_infos(1 To 3, 1 To 1)
    l_l_nbDefs = 0
    
    'extraire les définitions
    For Each l_o_paragraph In p_o_doc.Paragraphs
        Select Case l_o_paragraph.Style
            Case c_s_styleT1
                l_s_T1 = CleanParagraphText(l_o_paragraph.Range.ListFormat.ListString & l_o_paragraph.Range.Text)
            Case c_s_styleT2
                l_s_T2 = CleanParagraphText(l_o_paragraph.Range.ListFormat.ListString & l_o_paragraph.Range.Text)
            Case c_s_styleGeoDef
                l_l_nbDefs = l_l_nbDefs + 1
                ReDim Preserve l_as_infos(1 To 3, 1 To l_l_nbDefs)
                l_as_infos(1, l_l_nbDefs) = CleanParagraphText(l_o_paragraph.Range.Text)
                l_as_infos(2, l_l_nbDefs) = l_s_T1
                l_as_infos(3, l_l_nbDefs) = l_s_T2
        End Select
    Next l_o_paragraph
    
    'transposer les définitions
    l_l_nbInfos = UBound(l_as_infos, 1)
    ReDim l_as_res(1 To l_l_nbDefs, 1 To l_l_nbInfos)
    For l_l_i = 1 To l_l_nbDefs: For l_l_j = 1 To l_l_nbInfos
        l_as_res(l_l_i, l_l_j) = l_as_infos(l_l_j, l_l_i)
    Next l_l_j, l_l_i
    
    'trier les définitions
    For l_l_i = 1 To l_l_nbDefs - 1: For l_l_j = l_l_i + 1 To l_l_nbDefs
        If UCase(l_as_res(l_l_j, 1)) < UCase(l_as_res(l_l_i, 1)) Then
            For l_l_k = 1 To l_l_nbInfos
                l_s_tmp = l_as_res(l_l_j, l_l_k)
                l_as_res(l_l_j, l_l_k) = l_as_res(l_l_i, l_l_k)
                l_as_res(l_l_i, l_l_k) = l_s_tmp
            Next l_l_k
        End If
    Next l_l_j, l_l_i
    
    ExtractGeoDefsInfos = l_as_res
    
End Function

Private Function CleanParagraphText(p_s_text As String) As String
    CleanParagraphText = p_s_text
    If CleanParagraphText Like "*" & vbCr Then CleanParagraphText = Left(CleanParagraphText, Len(CleanParagraphText) - 1)
    CleanParagraphText = Strings.Trim(CleanParagraphText)
End Function

Private Function ExtractTocLinks(p_o_doc As Word.Document) As Object    'Scripting.Dictionary
Dim l_o_hl      As Word.Hyperlink
Dim l_o_toc     As Word.TableOfContents
Dim l_s_txt     As String
    Set ExtractTocLinks = CreateObject("Scripting.Dictionary")
    For Each l_o_toc In p_o_doc.TablesOfContents
        For Each l_o_hl In l_o_toc.Range.Hyperlinks
            l_s_txt = l_o_hl.Range.Text
            If Not ExtractTocLinks.Exists(l_s_txt) Then ExtractTocLinks.Add l_s_txt, l_o_hl.SubAddress
        Next l_o_hl
    Next l_o_toc
End Function

Lorsque tu exécutes la macro MajTableDef, la première table du document est mise à jour (les données existantes sont supprimées).

La macro ne se base plus sur le niveau hiérarchique, mais sur le nom des styles utilisés pour identifier les Géo_Titre1, Géo_Titre2 et Géo_Déf T1.
Les définitions sont triées alphabétiquement et un lien est ajouté pour renvoyer vers le paragraphe concerné.

Par contre :
  • il te faudra remettre en forme la première colonne (avec les liens) manuellement après le traitement ;
  • certaines définitions (bien que semblant être de style Géo_Déf T1) ne sont pas renvoyées.
    Il te faut dans ce cas, supprimer le titre de la définition et le recréer.

A+
 

gerardphi

XLDnaute Junior
Bonjour mromain,
Merci du travail!!!!;)
En lançant la macro, j'ai un message d'erreur (voir ci-dessous). J'ai positionné le pointeur avant la TM, puis j'ai lancé la macro (????)
En PJ, le fichier
Merci!!!!!
Cdt
1711207720728.png
 

Pièces jointes

  • ED_Roches juin 2023v1.docm
    419.8 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
315 102
Messages
2 116 222
Membres
112 690
dernier inscrit
noureddinee