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,
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
!
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) :
- 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