IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Générer index de paragraphe [WD-2013]


Sujet :

VBA Word

  1. #1
    Candidat au Club
    Femme Profil pro
    Freelance marketing et communication
    Inscrit en
    Octobre 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Freelance marketing et communication

    Informations forums :
    Inscription : Octobre 2023
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Générer index de paragraphe
    Bonjour, bonsoir à tous et à toutes,

    Avant toute chose : je ne suis absolument pas dev
    Je rencontre cependant des difficultés depuis maintenant bien 2 heures sur VBA.

    Contexte : un ami doit bientôt rendre sa thèse, dans laquelle il souhaiterait générer un index de mots ayant comme référence des numéros de paragraphe (chaque paragraphe faisant en fait partie d'une liste à puces), et non des numéros de pages : c'est la raison pour laquelle je me suis tournée vers VBA.

    Je papote donc depuis un moment avec mon grand ami Chat GPT qui ne me mène, hélas, à rien du tout.
    Il a cependant réussi un code, mais cela référençait les titres plutôt que les numéros de paragraphe... Depuis que je lui ai fait remarqué son erreur, je n'ai que des index générés vides.

    Aussi, je vous serais hyper reconnaissante si quelqu'un arrivait à corriger le dernier code que m'a fourni notre ami l'IA.

    Voici le texte d'exemple que je lui ai transmis (pour que vous ayez la structure):

    TITRE 1
    1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    TITRE 2
    2. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

    TITRE 3
    3. At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.



    Et voici sa dernière proposition :

    Sub CreerIndexAvecNumerosDePuces()
    Dim mot As String
    Dim index As String
    Dim paragraphe As Paragraph
    Dim numeroPuce As String
    Dim motsIndex() As String
    Dim i As Integer

    ' Liste des mots à indexer (ajoutez autant de mots que nécessaire)
    motsIndex = Split("Lorem,veniam,Nemo,magnam,provident,necessitatibus", ",")

    ' Initialisation de l'index
    index = ""

    ' Boucle à travers tous les paragraphes du document
    For Each paragraphe In ActiveDocument.Paragraphs
    ' Vérifie si le paragraphe est un paragraphe de liste à puces
    If paragraphe.Range.ListFormat.ListType = wdListBullet Then
    ' Stocke le numéro de la puce actuelle
    numeroPuce = paragraphe.Range.ListFormat.ListString
    Else
    ' Réinitialise le numéro de puce si le paragraphe n'en a pas
    numeroPuce = ""
    End If

    ' Boucle à travers les mots à indexer
    For i = LBound(motsIndex) To UBound(motsIndex)
    mot = Trim(motsIndex(i))
    ' Vérifie si le mot à indexer est présent dans le paragraphe
    If InStr(1, paragraphe.Range.Text, mot, vbTextCompare) > 0 Then
    ' Ajoute la référence au paragraphe avec le numéro de puce à l'index
    If numeroPuce <> "" Then
    index = index & mot & ": " & "Paragraphe " & numeroPuce & vbCrLf
    End If
    End If
    Next i
    Next paragraphe

    ' Insère l'index généré à la fin du document
    ActiveDocument.Content.InsertAfter vbCrLf & "INDEX : " & vbCrLf & vbCrLf & index
    End Sub


    Merci à ceux / celles qui prendront potentiellement le temps de m'aider

  2. #2
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 358
    Points : 562
    Points
    562
    Par défaut
    Bonjour,

    A tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Sub CreerIndexAvecNumerosDePuces()
     
    Dim Mot As String, Index As String, MotsIndex() As String
    Dim NumeroPuce As Variant
    Dim I As Integer, TypePuce As Integer
    Dim J As Long
     
        ' Liste des mots à indexer (ajoutez autant de mots que nécessaire)
        MotsIndex = Split("Lorem,veniam,Nemo,magnam,provident,necessitatibus", ",")
        ' Initialisation de l'index
        Index = ""
     
        With ActiveDocument
             ' Boucle à travers tous les paragraphes du document
             For J = 1 To .Paragraphs.Count
                 With .Paragraphs(J)
                      ' Vérifie si le paragraphe est un paragraphe de liste à puces
                      ' Debug.Print .Range.ListFormat.ListType
                      If .Range.ListFormat.ListType = wdListBullet Then
                         ' Stocke le numéro de la puce actuelle
                         NumeroPuce = .Range.ListFormat.ListString
                         TypePuce = .Range.ListFormat.ListType
                         Debug.Print J & " : " & NumeroPuce
                      Else
                         ' Réinitialise le numéro de puce si le paragraphe n'en a pas
                         NumeroPuce = ""
                      End If
     
                      If NumeroPuce <> "" Then
                         ' Boucle à travers les mots à indexer
                         For I = LBound(MotsIndex) To UBound(MotsIndex)
                             Mot = MotsIndex(I)
                             ' Vérifie si le mot à indexer est présent dans le paragraphe
                             If InStr(1, .Range.Text, Mot, vbTextCompare) > 0 Then
                                ' Ajoute la référence au paragraphe avec le numéro de puce à l'index
                                Index = Index & Mot & ": " & ", paragraphe : " & J & ", type : " & TypePuce & ", puce : " & NumeroPuce & vbCrLf
                             End If
                         Next I
                      End If
                 End With
              Next J
     
              ' Insère l'index généré à la fin du document
              .Content.InsertAfter vbCrLf & "INDEX : " & vbCrLf & vbCrLf & Index
     
        End With
     
    End Sub
    Pour mémoire :

    Nom : Capture.JPG
Affichages : 119
Taille : 68,1 Ko

  3. #3
    Candidat au Club
    Femme Profil pro
    Freelance marketing et communication
    Inscrit en
    Octobre 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Freelance marketing et communication

    Informations forums :
    Inscription : Octobre 2023
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse.
    Comme avec les propositions déjà tentées, cela me retourne un index vide (cf capture d'écran).
    Pour information, je ne sais pas si cela peut avoir un impact (j'imagine que oui), j'utilise le pack Office 2013... En espérant que ce ne soit pas cela qui m'empêche de générer correctement cet index !

    Nom : screen 1.png
Affichages : 112
Taille : 173,9 Ko

  4. #4
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 358
    Points : 562
    Points
    562
    Par défaut
    Si votre texte est le même que dans votre exemple d'origine, il n'y a aucune puce. Pour vous répondre, j'ai du en insérer comme ci-dessous

    Nom : Capture.JPG
Affichages : 113
Taille : 52,6 Ko


    Pour obtenir cela :
    Nom : Capture1.JPG
Affichages : 116
Taille : 38,3 Ko

  5. #5
    Candidat au Club
    Femme Profil pro
    Freelance marketing et communication
    Inscrit en
    Octobre 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Freelance marketing et communication

    Informations forums :
    Inscription : Octobre 2023
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ah oui effectivement, je m'excuse ; en fait, par "puce" j'entendais numérotation. Je ne risquais pas d'avoir le bon résultat comme ça...
    Donc, chaque paragraphe a sa numérotation, et c'est elle qui doit apparaître dans l'index ("tel mot apparaît dans le paragraphe x et le paragraphe y", par exemple).
    Du coup, le code ci-dessus fonctionne si je remplace la numérotation par les puces, mais pas si je laisse la numérotation...!

    Aussi, petite question : je vois qu'il y a 6 paragraphes d'affichés dans votre index. Est-ce que les titres seraient eux aussi considérés comme des paragraphes dans ce contexte... ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 358
    Points : 562
    Points
    562
    Par défaut
    Aussi, petite question : je vois qu'il y a 6 paragraphes d'affichés dans votre index. Est-ce que les titres seraient eux aussi considérés comme des paragraphes dans ce contexte... ?
    J'ai seulement ajouté des lignes entre les paragraphes...

    Sinon, dans vos exemples, la numérotation que vous avez en tête de paragraphe ne correspond pas à une liste numérotée ou à une liste hiérarchisée.

    Le code ci-dessous fonctionne par rapport à une liste.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Sub CreerIndexAvecNumerosDeListe()
     
    Dim Mot As String, Index As String, MotsIndex() As String
    Dim NumeroPuce As Variant
    Dim I As Integer
    Dim J As Long
     
        MotsIndex = Split("Lorem,veniam,Nemo,magnam,provident,necessitatibus", ",")
        Index = ""
     
        With ActiveDocument
             For J = 1 To .Paragraphs.Count
                 With .Paragraphs(J)
                      Debug.Print .Range.ListFormat.ListString
                      If .Range.ListFormat.ListString <> "" Then
                         NumeroPuce = .Range.ListFormat.ListString
                         'Debug.Print J & " : " & NumeroPuce
                      Else
                         NumeroPuce = ""
                      End If
     
                      If NumeroPuce <> "" Then
                         For I = LBound(MotsIndex) To UBound(MotsIndex)
                             Mot = MotsIndex(I)
                             If InStr(1, .Range.Text, Mot, vbTextCompare) > 0 Then
                                Index = Index & Mot & ": " & ", paragraphe : " & J & ", puce : " & NumeroPuce & vbCrLf
                             End If
                         Next I
                      End If
                 End With
              Next J
     
              .Content.InsertAfter vbCrLf & "INDEX : " & vbCrLf & vbCrLf & Index
     
        End With
     
    End Sub

  7. #7
    Candidat au Club
    Femme Profil pro
    Freelance marketing et communication
    Inscrit en
    Octobre 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Freelance marketing et communication

    Informations forums :
    Inscription : Octobre 2023
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ok, j'ai résolu le problème de paragraphe (en fait, je parlais d'un style paragraphe, et non pas de tout retour à la ligne comme considéré par Word).
    Pour la numérotation on est ok, c'est le copier /coller de mon texte ici qui n'a pas respectée le format, mais c'est bien le cas sur mon Word.

    J'ai donc le code suivant, et il me reste un dernier souci :
    Je souhaiterais, si ce n'est pas trop demander, que chaque mot n'apparaisse qu'une fois dans la liste, mais avec toutes ses occurrences.
    Par exemple :

    Lorem: p1
    Veniam : p1, p2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Sub CreerIndexAvecNumerosDeListe()
        Dim Mot As String, Index As String, MotsIndex() As String
        Dim StyleRecherche As String
        Dim I As Integer
     
        MotsIndex = Split("Lorem,veniam,Nemo,magnam,provident,necessitatibus", ",")
        Index = ""
        StyleRecherche = "Paragraphe de liste" ' Nom du style de numérotation
     
        ' Boucle à travers les mots à indexer
        For I = LBound(MotsIndex) To UBound(MotsIndex)
            Mot = Trim(MotsIndex(I))
            ' Recherche insensible à la casse et sans tenir compte de la ponctuation
            Dim RegEx As Object
            Set RegEx = CreateObject("VBScript.RegExp")
            RegEx.Global = True
            RegEx.IgnoreCase = True
            RegEx.Pattern = "\b" & Mot & "\b"
     
            ' Boucle à travers les paragraphes du document
            Dim Paragraphe As Paragraph
            For Each Paragraphe In ActiveDocument.Paragraphs
                ' Vérifie si le paragraphe a le style de numérotation souhaité
                If Paragraphe.Style.NameLocal = StyleRecherche Then
                    If RegEx.Test(Paragraphe.Range.Text) Then
                        Index = Index & Mot & ": p" & Paragraphe.Range.ListFormat.ListString & vbCrLf
                    End If
                End If
            Next Paragraphe
        Next I
     
        ' Insère l'index généré à la fin du document
        ActiveDocument.Content.InsertAfter vbCrLf & "INDEX : " & vbCrLf & vbCrLf & Index
    End Sub
    En tout cas, merci beaucoup déjà pour votre aide précieuse !

  8. #8
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 358
    Points : 562
    Points
    562
    Par défaut
    Une solution consiste à passer par une variable dictionnaire et une variable tableau qui sera triée à la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    Sub CreerIndexAvecNumerosDeListe()
     
    Dim Mot As String, Index As String, MotsIndex() As String
    Dim StyleRecherche As String
    Dim I As Integer, J As Integer, IndexMatrice As Integer
    Dim MonDico As Object 'Scripting.Dictionary
    Dim MatriceIndex() As Variant, Temp1 As Variant
     
     
        MotsIndex = Split("Lorem,veniam,Nemo,magnam,provident,necessitatibus", ",")
        Index = ""
        StyleRecherche = "Paragraphe de liste" ' Nom du style de numérotation
        IndexMatrice = 0
        Set MonDico = CreateObject("Scripting.Dictionary")
     
        ' Boucle à travers les mots à indexer
        For I = LBound(MotsIndex) To UBound(MotsIndex)
            Mot = Trim(MotsIndex(I))
            ' Recherche insensible à la casse et sans tenir compte de la ponctuation
            Dim RegEx As Object
            Set RegEx = CreateObject("VBScript.RegExp")
            RegEx.Global = True
            RegEx.IgnoreCase = True
            RegEx.Pattern = "\b" & Mot & "\b"
     
            ' Boucle à travers les paragraphes du document
            Dim Paragraphe As Paragraph
            For Each Paragraphe In ActiveDocument.Paragraphs
                ' Vérifie si le paragraphe a le style de numérotation souhaité
                If Paragraphe.Style.NameLocal = StyleRecherche Then
                    If RegEx.Test(Paragraphe.Range.Text) Then
                       ' Index = Index & Mot & ": p" & Paragraphe.Range.ListFormat.ListString & vbCrLf
     
                        If Not MonDico.Exists(Mot) Then
                           MonDico.Add (Mot), Mot & " : p" & Paragraphe.Range.ListFormat.ListString
                           ReDim Preserve MatriceIndex(1, IndexMatrice)
                           MatriceIndex(0, IndexMatrice) = Mot
                           MatriceIndex(1, IndexMatrice) = Mot & " : p " & Paragraphe.Range.ListFormat.ListString & ", "
                           IndexMatrice = IndexMatrice + 1
                        Else
                           For J = LBound(MatriceIndex, 2) To UBound(MatriceIndex, 2)
                               If MatriceIndex(0, J) = Mot Then
                                  MatriceIndex(1, J) = MatriceIndex(1, J) & "p " & Paragraphe.Range.ListFormat.ListString & ", "
                                  Exit For
                               End If
                           Next J
                        End If
     
                    End If
                End If
            Next Paragraphe
        Next I
     
        ' Tri de la matrice par sa deuxième colonne
        For I = LBound(MatriceIndex, 2) To UBound(MatriceIndex, 2) - 1
            For J = I + 1 To UBound(MatriceIndex, 2)
                If MatriceIndex(1, I) > MatriceIndex(1, J) Then
                   Temp1 = MatriceIndex(1, I)
                   MatriceIndex(1, I) = MatriceIndex(1, J)
                   MatriceIndex(1, J) = Temp1
                 End If
            Next J
        Next I
     
        ' Insère l'index généré à la fin du document
        With ActiveDocument.Content
            ' .InsertAfter vbCrLf & "INDEX : " & vbCrLf & vbCrLf & Index
             .InsertAfter vbCrLf & "INDEX : " & vbCrLf & vbCrLf
             For IndexMatrice = LBound(MatriceIndex, 2) To UBound(MatriceIndex, 2)
                 .InsertAfter Mid(MatriceIndex(1, IndexMatrice), 1, Len(MatriceIndex(1, IndexMatrice)) - 2) & vbCrLf
             Next IndexMatrice
        End With
     
        Set MonDico = Nothing
     
    End Sub

  9. #9
    Candidat au Club
    Femme Profil pro
    Freelance marketing et communication
    Inscrit en
    Octobre 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Freelance marketing et communication

    Informations forums :
    Inscription : Octobre 2023
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Super, tout fonctionne parfaitement.
    Merci infiniment pour votre temps et votre grande aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2000] index de paragraphe
    Par tsm33 dans le forum VBA Word
    Réponses: 3
    Dernier message: 31/08/2010, 23h47
  2. [WD-2003] Problème pour générer un index
    Par méchantindex dans le forum Word
    Réponses: 2
    Dernier message: 03/05/2009, 02h23
  3. [MySQL] Générer un index à partir de MySQL
    Par Voodu dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/10/2007, 11h27
  4. [css et php] problème de z-index à générer à la volée
    Par Christophe93250 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 07/03/2007, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo