Pour rappel, le champ STYLEREF sera utilisé pour insérer le titre en cours. Voir cet article.
Pour insérer le titre précédent et le titre suivant, on ne peut pas utiliser le champ STYLEREF. La solution passe par une macro assez simple qui va créer une variable de document affectée à chacun des titres. Plutôt que de créer une macro qui va insérer tout cela à la fois, je préconise cette méthode qui a l'avantage d'être beaucoup plus souple. En effet, une fois les variables créées, vous pourrez les insérer où bon vous semble via des champs DOCVARIABLE. Ainsi tout le monde pourra insérer ses champs aux endroits de son choix, sans se préoccuper de la macro.
Pour commencer, il va falloir séparer chaque chapitre par un saut de section, car la macro va s'appuyer sur les numéros de section.
Voici donc la macro qui va créer les variables basées sur les titres de style Titre 1 contenus dans chaque section, supposant que le premier titre de chapitre se trouve dans la première section, que le deuxième dans la deuxième section, et ainsi de suite.
Sub variables()
'macro écrite par m@rina
'crée une variable pour chaque titre 1
Dim para As Paragraph
Dim texte As String, texte2 As String, nombre, numéro
For Each para In ActiveDocument.Paragraphs
If para.Style = "Titre 1" Then
para.Range.Select
texte = para.Range.Text
nombre = Selection.Characters.Count
'récupère le texte du titre sans le retour paragraphe
texte2 = (Left(texte, nombre - 1))
'récupère le numéro de la section correspondant au titre
numéro = Selection.Information(wdActiveEndSectionNumber)
'crée la variable avec le nom de la section et la valeur titre
ActiveDocument.variables.Add Name:=numéro, Value:=texte2
End If
Next
Selection.HomeKey Unit:=wdStory
End Sub
Cette macro est à exécuter une seule fois. Elle va créer les variables. Ensuite, on n'a plus à s'en occuper sauf en cas de modifications du document, en particulier, ajout ou suppression de chapitres, de sections, modification des titres, etc.
Une fois cette macro exécutée, il vous reste à insérer les champs DOCVARIABLE dans votre en-tête ou votre pied de page.
Voici le champ qui va insérer le titre précédent :
{ DOCVARIABLE "{ ={section}-1 }"}
Et voici le champ qui va insérer le titre suivant :
{ DOCVARIABLE "{ ={section}+1 }"}
Important : comme pour n'importe quel champ, TOUTES les accolades { } s'insèrent via le raccourci Ctrl+F9.
NB : Dans la première section, le premier champ affichera une erreur puisqu'il n'y aura pas de section précédente. De la même façon, dans la dernière section, le deuxième champ affichera une erreur puisqu'il n'y aura pas de section suivante. Vous devrez alors désolidariser ces sections du reste du document afin que la premier champ ne figure dans la première section et que le second champ ne figure pas dans la dernière section.
En cas de ratés, ou de modifications importantes du document
Pas de problème ! Il suffira de supprimer toutes les variables et de les recréer. Pour les supprimer, lancez la macro suivante :
Sub suppr_var()
For Each var In ActiveDocument.variables
var.Delete
Next
End Sub
Les variables étant détruites, relancez la macro "variables" ci-avant pour les recréer. Vous n'avez pas à refaire les champs.
Vérification
En complément, voici deux macros permettant de vérifier les noms des variables et leur valeur. En clair, le nom de la variable doit correspondre au numéro de la section, et la valeur doit correspondre au texte du titre.
La première affichera tour à tour chaque variable dans une boîte de dialogue. La seconde listera toutes vos variables dans un nouveau document. Cette deuxième macro est plus intéressante pour les gros documents comportant beaucoup de titres.
Sub vérif()
Dim var As Variable
For Each var In ActiveDocument.variables
MsgBox "Nom = " & var.Name & vbCr & "Valeur = " & var.Value
Next var
End Sub
Sub vérif2()
Dim var As Variable, mavar As String, liste As String, nouveau As Document
For Each var In ActiveDocument.variables
mavar = "Nom = " & var.Name & " Valeur = " & var.Value
liste = liste & mavar & vbCr
Next var
Set nouveau = Documents.Add
Selection.TypeText Text:=liste
End Sub