IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ VBA

FAQ VBAConsultez toutes les FAQ

Nombre d'auteurs : 10, nombre de questions : 133, dernière mise à jour : 15 juin 2021 

 
OuvrirSommaireWordDocumentSélection et Range

Quelques exemples standards. Sélectionner tout le document

 
Sélectionnez
objDoc.Range(0, 0).Select
Selection.MoveEnd wdStory

Aller au début du document

 
Sélectionnez
Selection.HomeKey Unit:=wdStory

Aller à la fin du document

 
Sélectionnez
Selection.EndKey Unit:=wdStory

Sélectionner une ligne

 
Sélectionnez
Selection.EndKey Unit:=wdLine, Extend:=wdExtend

Sélectionner le troisième paragraphe

 
Sélectionnez
objDoc.Paragraphs(3).Range.Select
Créé le 4 février 2004  par bidou

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

 
Sélectionnez
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é

 
Sélectionnez
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

Créé le 4 février 2004  par bidou

L'utilisation directe de la collection Words sur le paragraphe peut être trompeuse.

 
Sélectionnez
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

 
Sélectionnez
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
Créé le 4 février 2004  par bidou

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

 
Sélectionnez
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
Créé le 4 février 2004  par bidou

Avec la méthode find et les bons paramètres

 
Sélectionnez
Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
objDoc.Content.Find.Execute FindText:="GNU", ReplaceWith:="GPL", Replace:=wdReplaceAll
Créé le 4 février 2004  par bidou

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 :

 
Sélectionnez
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
Créé le 5 février 2004  par bidou

Les images insérées dans le texte sont menbres de la collection InlineShapes

 
Sélectionnez
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é

Créé le 5 février 2004  par bidou

Il s'agit là d'une erreur classique. Vous confondez le paragraphe et l'objet Range le désignant. Prenons un exemple :

 
Sélectionnez
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 :

 
Sélectionnez
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
Créé le 5 février 2004  par bidou

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.