Macro VBA - Word

Bonjour à tous,

Je commence depuis peu à utiliser VBA sur Word pour la première fois et j'ai du mal, pourtant ce que je souhaite faire semble normalement simple.

Pour expliquer, j'ai un document qui se présente comme suit (cf. ci-dessous)

J'aurais voulu qu'à la toute fin de mon document, après le titre "10. Récapitulatif", il me reprenne quelques titres et leur contenu (afin que je n'ai pas à faire de copier-coller à chaque fois)

10. Récapitulatif

- Titre du ticket

xxxxxxxxxx (du texte)

- Enjeu

xxxxxxxxxx (du texte)

- Analyse

xxxxxxxxxx (du texte)

-Documentation technique

xxxxxxxxxx (du texte)

______________________________________________________________________________________________________________________________________________________

Le contenu de mon document se présente comme suit:

Table des matières

1. Informations

1.1 Titre du ticket

xxxxxxxxxx (du texte)

2. Description

2.1 Enjeu

xxxxxxxxxx (du texte)

2.2 Analyse

xxxxxxxxxx (du texte)

2.3 Détail

xxxxxxxxxx (du texte)

2.4 Impacts

xxxxxxxxxx (du texte)

3. Techniques

3.1 Script

xxxxxxxxxx (du texte)

4. Corrections

4.1 Option 1

xxxxxxxxxx (du texte)

4.2 Option 2

xxxxxxxxxx (du texte)

4.3 Option 3

xxxxxxxxxx (du texte)

4.4 Option 4

xxxxxxxxxx (du texte)

4.5 Correction technique

xxxxxxxxxx (du texte)

5. Long terme

5.1 Information à savoir

xxxxxxxxxx (du texte)

5.2 Enjeux

xxxxxxxxxx (du texte)

6. Tests UAT

xxxxxxxxxx (du texte)

7. Documentation

7.1 Documentation à corriger

xxxxxxxxxx (du texte)

7.2 Documentation technique

xxxxxxxxxx (du texte)

8. Communication

8.1 Communication 1

xxxxxxxxxx (du texte)

8.2 Communication 2

xxxxxxxxxx (du texte)

9. Suivi

9.1 Suivi a faire

xxxxxxxxxx (du texte)

10. Récapitulatif

_________________________________

J'ai essayé cette macro :

Sub CopierContenuSynthese()
Dim syntheseTexte As String
Dim rng As Range
Dim paragraphe As Paragraph

' Initialisation de la variable syntheseTexte avec le titre
syntheseTexte = "10. Récapitulatif :" & vbCrLf

' Parcours de tous les paragraphes du document
For Each paragraphe In ActiveDocument.Paragraphs
' Vérifier si le paragraphe est un titre à copier
If IsTitreACopier(paragraphe.Range.Text) Then
' Ajouter le titre et son contenu à la synthèse
syntheseTexte = syntheseTexte & vbCrLf & paragraphe.Range.Text & vbCrLf

' Ajouter le contenu du paragraphe
For Each rng In paragraphe.Range.Next.Paragraphs(1).Range.Paragraphs
If Not IsTitreACopier(rng.Range.Text) Then
syntheseTexte = syntheseTexte & vbCrLf & rng.Text
Else
Exit For
End If
Next rng
End If
Next paragraphe

' Ajouter la synthèse à la fin du document
ActiveDocument.Range.InsertAfter vbCrLf & syntheseTexte
End Sub

Function IsTitreACopier(texte As String) As Boolean
If InStr(texte, "1.1 Titre du ticket") > 0 _
Or InStr(texte, "2.1 Enjeu") > 0 _
Or InStr(texte, "2.2 Analyse") > 0 _
Or InStr(texte, "7.2 Documentation technique") > 0 Then
IsTitreACopier = True
Else
IsTitreACopier = False
End If
End Function

Mais lorsque je l'exécute j'ai une erreur de compilation sur le "range" de la ligne "If Not IsTitreACopier(rng.Range.Text) Then"

Ca fait plusieurs jours que j'essaie pleins de combinaisons possible mais rien y fait. Quelqu'un a t'il déjà essayé de faire ce type de macro ?

Merci par avance de votre aide !

Bonjour ExcelJun,

Je te propose les modifications suivantes dans ton VBA :

Sub CopierContenuSynthese()
Dim syntheseTexte As String
Dim rng As Range
Dim paragraphe As Paragraph
Dim Subparagraphe As Paragraph

' Initialisation de la variable syntheseTexte avec le titre
syntheseTexte = "10. Récapitulatif :" & vbCrLf

' Parcours de tous les paragraphes du document
For Each paragraphe In ActiveDocument.Paragraphs
    ' Vérifier si le paragraphe est un titre à copier
    If IsTitreACopier(paragraphe.Range.Text) Then
        ' Ajouter le titre et son contenu à la synthèse
        syntheseTexte = syntheseTexte & vbCrLf & paragraphe.Range.Text

        ' Ajouter le contenu du paragraphe
        Set Subparagraphe = paragraphe.Next
        syntheseTexte = syntheseTexte & vbCrLf & Subparagraphe.Range.Text
    End If
Next

' Ajouter la synthèse à la fin du document
ActiveDocument.Range.InsertAfter vbCrLf & syntheseTexte
End Sub

Function IsTitreACopier(texte As String) As Boolean
If InStr(texte, "1.1 Titre du ticket") > 0 _
Or InStr(texte, "2.1 Enjeu") > 0 _
Or InStr(texte, "2.2 Analyse") > 0 _
Or InStr(texte, "7.2 Documentation technique") > 0 Then
IsTitreACopier = True
Else
IsTitreACopier = False
End If
End Function

Bonjour GVIALLES,

Merci beaucoup pour ton aide !

J'ai pu tester ta proposition, et la bonne nouvelle c'est que je n'ai plus de message d'erreur à l'exécution de la macro :)

En revanche, la macro ne se comporte pas comme prévu. Elle me copie le contenu du chapitre "4.3 Option 3" + le titre du chapitre "4.4 Option 4 " et c'est tout .. qui ne correspond pas du tout aux titres indiqués et leur contenus indiqués dans la macro, ce qui est très bizarre.

Sais-tu pourquoi ?

Résultat de la macro:

"

10. Récapitulatif :

xxxxxxxxxx (texte correspondant à la partie 4.3)

Option 4

"

Je continue de chercher en parallèle :)

Merci!

Bonjour ExcelJun,

De mon côté, en mimant ton doc, la macro génère :

image

Je joins mon doc de test :

21.docm (21.23 Ko)

Bonjour,

Encore merci du retour!

Je comprends ce qui pose problème, en fait mon document contient une "Table des matières" et du coup le fait que les titres soient répétés au début, et ensuite à nouveau dans le corps du document, pose problème.

Comment indiquer à la macro de ne pas tenir compte du sommaire du début ?

Le fichier mis à jour est disponible en PJ.

Merci

21-v1-1.docm (27.98 Ko)

!

Bonjour ExcelJun,

Plutôt que de rechercher les entêtes de paragraphes à récapituler, je te propose de passer par les signets (bookmarks) de Word :

  • Devant chaque paragraphe à récapituler, tu insères un signet (tu affecte le nom de signet que tu veux) : image
  • Tu modifie la macro pour :
    Sub CopierContenuSyntheseGVS()
        Dim syntheseTexte As String
        Dim rng As Range
        Dim paragraphe As Paragraph
        Dim Subparagraphe As Paragraph
        Dim oSignet As Bookmark
    
        ' Initialisation de la variable syntheseTexte avec le titre
        syntheseTexte = "10. Récapitulatif :" & vbCrLf
    
        ' Parcours de tous les signets du document
        For Each oSignet In ActiveDocument.Bookmarks
            Set rng = oSignet.Range.Paragraphs(1).Range
            ' Ajouter le titre et son contenu à la synthèse
            syntheseTexte = syntheseTexte & vbCrLf & rng.ListFormat.ListString & " " & rng.Text
    
            ' Ajouter le contenu du paragraphe
            Set Subparagraphe = oSignet.Range.Paragraphs(1).Next
            syntheseTexte = syntheseTexte & Subparagraphe.Range.Text
        Next
    
        'Insérer un saut de page en fin de document
        Selection.EndKey wdStory, wdMove
        Selection.InsertBreak wdPageBreak
        ' Ajouter la synthèse à la fin du document
        Selection.InsertAfter syntheseTexte
    End Sub
    31-v1-gvs.docm (25.59 Ko)
Rechercher des sujets similaires à "macro vba word"