FAQ VBA

FAQ VBAConsultez toutes les FAQ
Nombre d'auteurs : 10, nombre de questions : 133, dernière mise à jour : 15 juin 2021
Sommaire→Word→Document→Sélection et Range- Comment sélectionne-t-on avec VBA Word
- Pourquoi ai-je toujours un texte selectionné ?
- Pourquoi je n'arrive pas à sélectionner le dernier mot de mon paragraphe ?
- Comment faire une recherche avec Range qui modifie le format du mot cherché ?
- Comment faire un remplacement de toutes les occurences d'un mot ?
- Pourquoi travailler avec l'objet Range et l'objet Selection ?
- Comment insérer et modifier une image ?
- Lorsque je change le texte de mon paragraphe la mise en page change ?
Quelques exemples standards. Sélectionner tout le document
objDoc.Range(0, 0).Select
Selection.MoveEnd wdStoryAller au début du document
Selection.HomeKey Unit:=wdStoryAller à la fin du document
Selection.EndKey Unit:=wdStorySélectionner une ligne
Selection.EndKey Unit:=wdLine, Extend:=wdExtendSélectionner le troisième paragraphe
objDoc.Paragraphs(3).Range.SelectIl y a beaucoup de confusion possible entre range et selection or les deux objets sont différents. Pour pouvoir basculer facilement de l'un à l'autre il faut utiliser une variable Range. Prenons un exemple
Dim objDoc As Document
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
objDoc.Paragraphs(3).Range.Select
objDoc.Paragraphs(3).Range.EndOf wdWord, wdMoveLà, malgré le EndOf, le paragraphe est encore selectionné
Dim objDoc As Document, objRange As Range
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
objDoc.Paragraphs(3).Range.Words(objDoc.Paragraphs(3).Range.Words.Count - 2).Select
Set objRange = objDoc.Paragraphs(3).Range
objRange.EndOf wdWord, wdMove
objRange.SelectPlace le point d'insertion après le troisième paragraphe
L'utilisation directe de la collection Words sur le paragraphe peut être trompeuse.
Dim objDoc As Document, objRange As Range
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
Set objRange = objDoc.Paragraphs(8).Range
objRange.Words(objRange.Words.Count).SelectCe code va sélectionner le retour chariot du paragraphe qui stricto sensu est le dernier mot du paragraphe. Accessoirement, l'utilisation de count-1 ne serait pas meilleure puisque selon que la phrase est un point ou non, celui-ci serait sélectionné. Il faut donc faire une vérification arrière
Dim objDoc As Document, objRange As Range
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
Set objRange = objDoc.Paragraphs(8).Range.Sentences(objDoc.Paragraphs(8).Range.Sentences.Count)
Set objRange = objRange.Words.Last
Do
Set objRange = objRange.Previous(wdWord, 1)
Loop While StrComp(objRange.Text, vbCrLf, vbBinaryCompare) = 0 Or StrComp(objRange.Text, ".", vbBinaryCompare) = 0
objRange.SelectNormalement, la sélection ne se fait que si Selection est la cible de la recherche ; Néanmoins, vous pouvez procéder à la sélection en désignant le parent de l'objet Find. Le code suivant encadre le texte GNU
Dim objDoc As Document, objRange As Range
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
With objDoc.Content.Find
.ClearFormatting
Do While .Execute(FindText:="GNU", Forward:=True, Format:=True) = True
With .Parent
.StartOf Unit:=wdWord, Extend:=wdExtend
.Borders.Enable = True
End With
Loop
End WithAvec la méthode find et les bons paramètres
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
objDoc.Content.Find.Execute FindText:="GNU", ReplaceWith:="GPL", Replace:=wdReplaceAllCela permet de gérer des opérations sur une plage sans modifier l'emplacement du point d'insertion. Supposons que je veuille insérer deux signets, l'un sur un mot, l'autre sur le point d'insertion, je peux faire :
Selection.TypeText Text:="Monsieur "
Set objRange = Selection.Words.First.Previous(wdWord)
objRange.Bookmarks.Add "genre"
With ActiveDocument.Bookmarks
.Add Range:=Selection.Range, Name:="Nom"
.DefaultSorting = wdSortByName
.ShowHidden = True
End WithLes images insérées dans le texte sont menbres de la collection InlineShapes
Dim objDoc As Document, objShape As InlineShape
Set objDoc = Application.Documents.Add
Set objShape = Selection.InlineShapes.AddPicture(FileName:="C:\developpez\logo_developpez.gif", LinkToFile:=False, SaveWithDocument:=True)
With objShape
.LockAspectRatio = msoTrue
.Height = .Height * 0.5
.Width = .Width * 0.5
End WithCe code insère une image est la réduit de moitié
Il s'agit là d'une erreur classique. Vous confondez le paragraphe et l'objet Range le désignant. Prenons un exemple :
Dim objDoc As Document, objRange As Range
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
Set objRange = objDoc.Paragraphs(8).Range
objRange.Text = "Ceci est un nouveau paragraphe"Ma phrase va s'insérer comme la première phrase du paragraphe suivant, car la marque de paragraphe est inclue dans l'objet Range. La syntaxe correcte est :
Dim objDoc As Document, objRange As Range
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
Set objRange = objDoc.Paragraphs(8).Range
objRange.Text = "Ceci est un nouveau paragraphe"
objRange.InsertParagraphAfter


