Via une une macro, vous utilisez un signet auparavant créé dans le document afin de positionner une texte à un endroit précis. C'est souvent le cas pour des Userforms où le contenu de chaque contrôle du Userform doit s'insérer à divers endroits du document.

Le problème est que, une fois le texte inséré grâce à la macro à l'endroit du signet, le signet disparaît. Si vous relancez la macro, forcément vous obtenez une erreur.

Voici donc une fonction qu'on appellera dans la macro, pour chaque signet, et qui permettra de relancer la macro autant de fois que l'on change d'avis !

 Public Function RemplirSignet(A As String, B As String)
' Remplit le signet A avec le texte B sans détruire A
On Error GoTo sortie
Dim Place As Long
Place = ActiveDocument.Bookmarks(A).Range.Start
ActiveDocument.Bookmarks(A).Range.Text = B
ActiveDocument.Bookmarks.Add Name:=A, Range:=ActiveDocument.Range(Place, Place + Len(B))
sortie:
End Function

 

Voici une fonction un peu plus élaborée (revue par Geo) qui prend en charge les bookmarks, quel que soit l'endroit où ils se trouvent (en particulier dans les en-têtes ou pieds de page).

Public Function RemplirSignet(A As String, B As String' Remplit le signet A avec le texte B sans détruire A '
'écrite par Geo
On Error GoTo sortie
Dim Place As Long
Dim doc As Document
Set doc = ActiveDocument
Dim st As Range ' la partie de document concernée : corps, pied de page pair, impair etc.
Dim signet As Range ' la zone de texte qui sera le nouveau signet
If doc.Bookmarks.Exists(A) Then
  Place = ActiveDocument.Bookmarks(A).Range.Start
  Set st = doc.StoryRanges(doc.Bookmarks(A).StoryType)
  Set signet = st
  doc.Bookmarks(A).Range.Text = B
  signet.SetRange Start:=Place, End:=Place + Len(B) ' impérativement après le Text
  doc.Bookmarks.Add Name:=A, Range:=signet
  Debug.Print "Fin Normale"
Else
  Debug.Print "Signet " & A & " absent"
End If
sortie:
End Function
 

 

Et voici un exemple de macro qui va utiliser ces fonctions. Cette macro s'exécute sur l'appui d'un bouton de commande d'un Userform et positionne le contenu de deux zones de texte (TextBox1 et Textbox2) à l'endroit des signets "signet_1" et "signet_2". Vous pourrez relancer la macro et changer le contenu des zones de texte du Userform. 

Private Sub CommandButton1_Click()
Dim B As String 'signet
= TextBox1.Value
RemplirSignet "signet_1", B

= TextBox2.Value
RemplirSignet "signet_2", B

End Sub