Repositionner une sélection dans une fenêtre word

Contenu du snippet

Quand on utilise une macro VBA qui fait une recherche dans un document par Selection.Find.Execute, Word ne place pas toujours le résultat au même endroit dans la fenêtre, voire le laisse au-dessus ou au-dessous, c’est-à-dire invisible.
Le code ci-dessous repositionne la sélection dans la fenêtre pour qu’elle soit toujours au même endroit, et donc facile à trouver.
Il fonctionne quelque soit la vue – Brouillon, Plan, Page, Web.
Pour le tester, sélectionner du texte, lancer la macro, puis tester de nouveau avec une position différente du texte, notamment en le déplaçant au-delà des limites de la fenêtre, et en relançant la macro.

Source / Exemple :


' Positions de la sélection (seul PosHautLg est effectivement utilisé) :
     Dim PosGaucheLg As Long
     Dim PosHautLg As Long
     Dim LargeurLg As Long
     Dim HauteurLg As Long
     ' Position souhaitée pour l'affichage de la sélection :
     Dim PosSouhaitéeLg As Long
     PosSouhaitéeLg = 250 ' Mettre ici la valeur souhaitée.
     ' Attention : s'il existe un second écran et qu'il est placé au-dessus du principal,
     ' cette valeur sera négative.
     Dim DéplaceLg As Long ' Déplacement à faire.
     Dim DéplacePrécédentLg As Long ' Déplacement fait précédemment :
     ' on vérifie qu'on s'est effectivement déplacé, qu'on ne boucle pas à vide.
     Dim SensLg As Long ' Sens du déplacement.
     
     With ActiveWindow
          ' Récupère les positions de la sélection absolue sur l'écran :
          .GetPoint PosGaucheLg, PosHautLg, LargeurLg, HauteurLg, Selection.Range
          DéplaceLg = PosSouhaitéeLg - PosHautLg ' Valeur du déplacement.
          SensLg = Sgn(DéplaceLg) ' renvoie -1, 0, ou 1.
          If SensLg = 0 Then Exit Sub ' On est déjà en place.
          Do
               DéplacePrécédentLg = DéplaceLg ' Mémorise le déplacement précédent.
               .ActivePane.SmallScroll up:=SensLg ' Fait défiler la fenêtre.
               .GetPoint PosGaucheLg, PosHautLg, LargeurLg, HauteurLg, Selection.Range
               DéplaceLg = PosSouhaitéeLg - PosHautLg ' Reprend la valeur du déplacement restant.
          Loop While Sgn(DéplaceLg) = SensLg And DéplaceLg <> DéplacePrécédentLg
          ' Boucle tant qu'on n'a pas dépassé la cible et qu'on a effectivement pu se déplacer.
     End With

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.