Une première solution consiste à utiliser des zones de texte et à faire apparaître ces zones de texte lorsqu'on coche ou décoche le contrôle de contenu. Cette solution est assez simple à mettre en oeuvre. Voyez cet article. A la place des images, vous insérerez des zones de texte avec habillage.
Si la solution de la zone de texte ne convient pas (on ne peut pas en avoir trop dans un document), on peut passer à l'insertion de blocs de construction.
Souvenez-vous néanmoins que les contrôles de contenu, quels qu'ils soient, sont assez difficile à manipuler par macro, car il existe très peu de macros événementielles, et donc de macros qui s'activent sur un événement. Les seuls événements que nous pourrons utiliser sont OnEnter (lorsqu'on clique sur le contrôle) et OnExit (lorsqu'on clique à l'extérieur du contrôle).
Cela signifie qu'il va falloir sortir du contrôle pour que le texte s'affiche. Cela signifie donc qu'il ne va pas falloir sortir d'un contrôle pour entrer dans un autre. Si c'est votre souhait, il vaudra mieux utiliser les contrôles ActiveX.
Voici donc comment procéder :
Cette opération nécessite une macro. Dans cet exemple, on va travailler avec des blocs de construction qui permettront de récupérer facilement le texte, et des tableaux qui permettront de les insérer facilement dans le document.
Les blocs de construction se créent obligatoirement dans un modèle. Donc, en fonction de l'utilisation prévue pour ce document, vous pouvez mettre ces blocs soit le Normal.dotm, mais de préférence dans le modèle dédié à ce document, permettant ainsi une distribution simple du modèle, en un seul fichier.
Donc, pour se résumer, il faut donc :
- autant de blocs de construction contenant le texte à insérer que nécessaire,
- un ou plusieurs tableaux de deux colonnes, la première colonne dédiée aux contrôles de contenu cases à cocher, la seconde aux textes qui seront insérés si la case est cochée,
- la macro qui suit (à personnaliser),
le tout dans un modèle (Template).
Création du modèle
Enregistrez simplement un nouveau document au format Template avec macro (extension DOTM) et rangez-le dans le dossier dédié aux templates.
Création des blocs de construction
- Saisissez tour à tour chaque texte et faites-en un bloc de construction en prenant bien garde de le conserver dans le modèle en question.
- Nommez chaque bloc avec le même nom et un numéro, par exemple : "montexte", "montexte2", "montexte3", etc.
- Donnez une description si nécessaire
Pour tout savoir sur les blocs de construction, c'est ici.
3. Création du ou des tableaux dans le modèle
Créez un ou des tableaux de deux colonnes. Veillez à choisir tout de suite le modèle de tableau qui convient.
- Chaque tableau aura une seule ligne.
- Dans la première colonne, insérez les blocs de construction Case à cocher.
- Donnez un nom à la balise du contrôle. Ce nom sera le même que le nom de chaque bloc. Au texte "montexte" correspondra la balise "montexte", au texte "montexte2" correspondra la balise "montexte2", etc.
- Laissez la seconde colonne vide.
4. Création de la macro
Copiez l'ensemble des macros suivantes et collez-les dans ThisDocument.
Option Explicit
Public tablo
Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
On Error Resume Next
tablo = no_tablo(Selection.Range)
Selection.Tables(1).Rows(1).Cells(2).Range = ""
End Sub
Private Sub Document_ContentControlOnExit(ByVal CC As ContentControl, Cancel As Boolean)
Dim balise As String, chemin As String, model As String
On Error Resume Next
'mettre le chemin du template ci-dessous
chemin = "C:\Users\nom_utilisateur\Documents\Modèles Office personnalisés\"
model = chemin & ActiveDocument.AttachedTemplate
Templates.LoadBuildingBlocks
If CC.Checked = True Then
balise = CC.Tag
ActiveDocument.Tables(tablo).Rows(1).Cells(2).Range.Select
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Application.Templates(model).BuildingBlockEntries(balise).Insert _
Where:=Selection.Range, RichText:=True
End If
End Sub
Function no_tablo(RNG As Range)
If RNG.Tables.Count > 0 Then
Dim DOC As Document
Set DOC = RNG.Parent
Dim rngTMP As Range
Set rngTMP = DOC.Range(0, RNG.Tables(1).Range.End)
no_tablo = rngTMP.Tables.Count
End If
End Function
Rappelez-vous de ne pas passer de contrôle en contrôle sous risque d'erreurs.