FAQ VBA
FAQ VBAConsultez toutes les FAQ
Nombre d'auteurs : 10, nombre de questions : 133, dernière mise à jour : 15 juin 2021
- 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
wdStory
Aller au début du document
Selection.HomeKey
Unit:=
wdStory
Aller à la fin du document
Selection.EndKey
Unit:=
wdStory
Sélectionner une ligne
Selection.EndKey
Unit:=
wdLine, Extend:=
wdExtend
Sélectionner le troisième paragraphe
objDoc.Paragraphs
(
3
).Range.Select
Il 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, wdMove
Là, 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.Select
Place 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
).Select
Ce 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.Select
Normalement, 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
With
Avec 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
:=
wdReplaceAll
Cela 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
With
Les 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
With
Ce 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