FAQ Word
FAQ WordConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 289, dernière mise à jour : 15 juin 2021
- Quelles sont les macros qui s'exécutent seules dans Word ?
- Comment exécuter une macro d'un document Word ?
- Quelles sont les syntaxes du langage VBA ?
- Comment sélectionne-t-on avec VBA Word
- Que représente la collection Sentences ?
- Comment mettre en place un moyen d'ouvrir un document à l'endroit de la dernière édition ?
- Je reçois un message d'erreur me signalant que le type de données utilisateur est non défini, pourquoi ?
- Comment appeler une macro se trouvant dans un autre document ?
- Comment déclarer mes variables en VBA ?
- Comment connaitre les valeurs des twips en VBA ?
- Comment vider le presse-papier en VBA ?
- Comment atteindre une plage comprise entre deux signets ?
- Pourquoi travailler avec l'objet Range et l'objet Selection ?
- Comment faire pour changer l'imprimante par défaut en Word ?
- Comment tester le type de données dans mon code ?
- Comment déclarer un objet application dans mon code ?
- Pourquoi ai-je toujours un texte sélectionné ?
- Comment insérer la date du jour dans un signet Word ?
- Comment créer un certificat local pour les macros VBA ?
- Comment changer le répertoire par défaut de Word ?
- Est-il possible d'obtenir plusieurs résultats d'une fonction ?
- Comment récupérer les fautes d'orthographe contenues dans un document et les sauvegarder dans un fichier texte ?
- Peut-on ajouter des raccourcis-clavier par le code ?
- Peut-on générer les statistiques par le code ?
- Comment remplacer une macro dans tous fichiers DOT d'un répertoire ?
- Comment obtenir l'affichage de certaines boîtes de dialogue prédéfinies ?
- Pourquoi lorsque je tape mon code, la liste me proposant la suite du code n'apparaît pas ?
- Pourquoi les arguments passés à une méthode ou une propriété sont-ils précédés du nom de l'argument et de := ?
- 14.1. Fichiers (3)
- 14.2. Formulaires "UserForm" (2)
- 14.3. Paragraphes (5)
- 14.4. Interraction avec d'autres logiciels (3)
- 14.5. Pages (4)
En attribuant un nom particulier à une macro, la macro pourra s'exécuter lors de
certains évènements comme l'ouverture d'un document, la création d'un nouveau document.
Macro | Evènement |
---|---|
AutoExec | Lorsque vous démarrez Word |
AutoNew | Lors de la création d'un nouveau document basé sur un modèle |
AutoOpen | Lors de l'ouverture d'un document |
AutoClose | Lors de la fermeture d'un document |
AutoExit | Lorsque vous quittez Word |
Document_BuildingBlockInsert | Cette macro s'exécute lors de l'insertion d'un élément "QuickPart" |
Document_Close | Cette macro s'exécute lors de la fermeture du document |
Document_ContentControlAfterAdd | Lors de l'ajout d'un Contrôle de contenu spécifique |
Document_ContentControlBeforeContentUpdate | Lors de la modification du contenu d'un Contrôle de contenu spécifique |
Document_ContentControlBeforeDelete | Avant suppression d'un Contrôle de contenu spécifique |
Document_ContentControlBeforeStoreUpdate | Survient avant que le magasin de données XML du document soit mis à jour avec la valeur d'un contrôle du contenu. |
Document_ContentControlOnExit | Sur sortie du contrôle |
Document_New | Sur création d'un nouveau document alors que le document qui contient la procédure est ouvert. |
Document_Open | Sur ouverture d'un document alors que le document qui contient la procédure est ouvert. |
Document_Sync | Se produit lorsque la copie locale d'un document faisant partie d'un espace de travail de document est synchronisée avec la copie sur le serveur. |
Document_XMLAfterInsert | Se produit lorsqu'un utilisateur ajoute un nouvel élément XML à un document. |
Document_XMLBeforeDelete | Se produit lorsqu'un utilisateur supprime un élément XML d'un document. |
Nécessite d'activer la référence "Microsoft Word xx.x Object Library".
Dim
WordApp As
Word.Application
Set
WordApp =
CreateObject
(
"Word.Application"
)
WordApp.Visible
=
True
WordApp.Documents.Open
(
"C:\monDocument.dot"
)
WordApp.Run
"laMacro"
Un petit tutoriel pour vous guider : Les cinq syntaxes de base du langage VBA
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
Sentences est une collection renvoyant les "phrases" de son conteneur (document, paragraphe ...). Par phrase on entend tout ce qui est compris entre des points et/ou des retours chariots.
'Notez que c'est donc différent des lignes word
Dim
objDoc As
Document, Phrase As
Range
Set
objDoc =
Application.Documents.Open
(
"D:\tuto.doc"
)
MsgBox
objDoc.Sentences.Count
&
amp; vbCrLf
&
amp; objDoc.BuiltInDocumentProperties
(
wdPropertyLines)
For
Each
Phrase In
objDoc.Sentences
Phrase.Select
MsgBox
"suite"
Next
Alors que les versions précedentes de Word permettaient une recherche rapide du dernier point d'insertion dans le document, la version 2007 ne possède plus cette fonctionnalité. Le code fournit ci-dessous permet de palier ce manque.
Vous devez utiliser deux codes, l'un sur l'ouverture et l'autre sur la fermeture du document. Sur l'ouverture, pour atteindre un signet et le supprimer. Sur la fermeture, pour ajouter un signet à l'endroit de la dernière édition.
Sub
Document_Open
(
)
ActiveDocument.Bookmarks
(
"ICI"
).Select
ActiveDocument.Bookmarks
(
"ICI"
).Delete
End
Sub
Sub
Document_Close
(
)
With
Selection
.Bookmarks.Add
"ICI"
End
With
End
Sub
Vous pouvez placer ce code dans le document que vous éditez, auquel cas il ne fonctionnera que pour ce document, ou dans le Normal.dotm, et il sera utilisé pour tous vos documents.
Lors de l'appel en VBA d'une application autre que l'application hôte, il est impératif d'ajouter la bibliothèque de cette application à votre projet.
Ne pas ajouter cette référence, revient à utiliser des types de données qui sont inconnus.
On ajoute ces références par le menu "Outils" "Références" de l'éditeur VBE. La boîte de dialogue contient la liste des bibliothèques disponibles.
Il est possible d'utiliser une macro se trouvant dans un autre document. Il faut pour cela que le document contenant la procédure soit ouvert.
Documents
(
"MonDocument.docm"
).MaRoutine
Avec "MaRoutine" le nom de la macro située dans l'autre document.
L'objet Screen n'existant pas en VBA, on peut retrouver ces valeurs en utilisant les fonctions de l'API Win32 :
Private
Declare
Function
GetDC Lib
"user32"
(
ByVal
hwnd As
Long
) As
Long
Private
Declare
Function
ReleaseDC Lib
"user32"
(
ByVal
hwnd As
Long
, ByVal
hdc As
Long
) As
Long
Private
Declare
Function
GetDeviceCaps Lib
"gdi32"
(
ByVal
hdc As
Long
, ByVal
nIndex As
Long
) As
Long
Private
Const
HWND_DESKTOP As
Long
=
0
Private
Const
LOGPIXELSX As
Long
=
88
Private
Const
LOGPIXELSY As
Long
=
90
Function
TwipsPerPixelX
(
) As
Single
Dim
lngDC As
Long
lngDC =
GetDC
(
HWND_DESKTOP)
TwipsPerPixelX =
1440
&
amp; /
GetDeviceCaps
(
lngDC, LOGPIXELSX)
ReleaseDC HWND_DESKTOP, lngDC
End
Function
Function
TwipsPerPixelY
(
) As
Single
Dim
lngDC As
Long
lngDC =
GetDC
(
HWND_DESKTOP)
TwipsPerPixelY =
1440
&
amp; /
GetDeviceCaps
(
lngDC, LOGPIXELSY)
ReleaseDC HWND_DESKTOP, lngDC
End
Function
L'objet ClipBoard n'existant pas en VBA, il faut utiliser les fonctions de l'API Windows :
'-- Déclaration des fonctions API
Private
Declare
Function
OpenClipboard Lib
"user32"
(
ByVal
hwnd As
Long
) As
Long
Private
Declare
Function
CloseClipboard Lib
"user32"
(
) As
Long
Private
Declare
Function
EmptyClipboard Lib
"user32"
(
) As
Long
Private
Sub
Commande0_Click
(
)
OpenClipboard 0
EmptyClipboard
CloseClipboard
End
Sub
On utilise la décomposition du range en Start et End
ActiveDocument.Range
(
ActiveDocument..Bookmarks
(
"sig1"
).Range.Start
, _
ActiveDocument..Bookmarks
(
"sig2"
).Range.End
).Select
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
Pour changer l'imprimante par défaut en Word, c'est n'est pas sur la collection documents qu'il faut agir mais sur l'objet application.
Sub
printPDF
(
)
Dim
oldprint
oldprint =
Application.ActivePrinter
Application.ActivePrinter
=
"PDFCreator"
ActiveDocument.PrintOut
Application.ActivePrinter
=
oldprint
End
Sub
Le code ci-dessus permet de changer l'imprimante par défaut en activant PDFCreator et après l'impression, change de nouveau l'imprimante par défaut en reprenant l'imprimante du départ.
Dans le déroulement d'un code, il est parfois intéressant de connaître le type de variable utilisée.
VarType
(
MaVariable)
Les résultats renvoyés sont sous la forme d'un entier.
Type de donnée | Valeur renvoyée | Description |
---|---|---|
vbEmpty | 0 | Empty (non initialisée) |
vbNull | 1 | Null (aucune donnée valide) |
vbInteger | 2 | Entier |
vbLong | 3 | Entier long |
vbSingle | 4 | Nombre à virgule flottante en simple précision |
vbDouble | 5 | Nombre à virgule flottante en double précision |
vbCurrency | 6 | Valeur monétaire |
vbDate | 7 | Valeur de date |
vbString | 8 | Chaîne |
vbObject | 9 | Objet |
vbError | 10 | Valeur d'erreur |
vbBoolean | 11 | Valeur booléenne |
vbVariant | 12 | Variant (utilisée seulement avec des tableaux de variants) |
vbDataObject | 13 | Objet d'accès aux données |
vbDecimal | 14 | Valeur décimale |
vbByte | 17 | Octet |
vbUserDefinedType | 36 | Variant contenant des types définis par l'utilisateur |
vbArray | 8192 | Tableau |
Il existe deux grand principe pour la déclaration de vos objets en VBA :
- Le EarlyBinding
- Le LateBinding
EarlyBinding
On pourrait traduire par liaison précoce. Ce mode de déclaration signifie que l'on a ajouté la bibliothèque l'application dans les
références du projet. L'avantage est la possibilité d'utiliser l'IntelliSense ou Auto-Completion lors de l'écriture de votre code.
L'avantage est que vous éliminez des erreur de frappe ou de syntaxe lors de l'écriture votre code.
L'inconvenient est que si vous distribuez votre projet, les bibliothèques doivent aussi se trouver sur les autres PC.
Sub
ConnexionDBAccess
(
)
'Déclaration des variables
Dim
db As
DAO.Database
Dim
rs As
DAO.Recordset
Dim
sql As
String
'Affectation de la sentence SQL
sql =
"SELECT * From T_Adresses"
'Affectation des Objets d'access aux données
Set
db =
DBEngine.OpenDatabase
(
_
"C:\Documents and Settings\Olivier\Mes documents\Mes sources de données\DB_Publipostage.mdb"
)
Set
rs =
db.OpenRecordset
(
sql)
'Boucle pour la récupération des données
While
Not
rs.EOF
Debug.Print
rs.Fields
(
2
)
rs.MoveNext
Wend
'Libération des objets
rs.Close
db.Close
Set
rs =
Nothing
Set
db =
Nothing
End
Sub
LateBinding
On pourrais traduire pas liaison tardive. Dans l'explication précédente, la bibliothèque etéit ajoutée au projet dès le début. Dans ce mode, la
bibliothèque est appelée dans le code.
L'avantage principal, c'est que votre code peut être distibué sans avoir à tenir compte de la version disponible de l'application.
L'inconvenient, ce mode ne permet pas l'utilisation de l'IntelliSense.
Sub
OuvrirFichierXL
(
)
Dim
xlApp As
Object
Dim
xlWb As
Object
Set
xlApp =
CreateObject
(
"Excel.Apllication"
)
Set
xlWb =
xlApp.WoorkBooks.Add
xlApp.Visible
=
True
End
Sub
Lien : Comment ajouter une référence à mon projet ?
Lien : Pourquoi lorsque je tape mon code, la liste me proposant la suite du code n'apparaît pas ?
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
Nécessite d'activer la référence "Microsoft Word xx.x Object Library" :
Dans l'exemple ci-dessous le signet à renseigner doit être nommé "SignetDate"
Dim
WordApp As
Word.Application
Dim
WordDoc As
Word.document
Set
WordApp =
New
Word.Application
WordApp.Visible
=
True
Set
WordDoc =
WordApp.Documents.Open
(
"monDocument.doc"
)
WordDoc.Bookmarks
(
"SignetDate"
).Range.Text
=
Format
(
Now
, "dd/mm/yyyy"
)
Lorsque le niveau de sécurité intrinsèque des documents Office est réglé sur moyen ou élevé, il est alors impossible d'activer automatiquement les macros d'un document.
La première solution consiste à régler le niveau de sécurité sur faible (Menu Outils Macros Sécurité...), mais n'est pas très recommandée.
L'autre solution consiste à auto-certifier les macros d'un document.
Un certificat local, valable uniquement sur la machine sur laquelle il est installé, va vous permettre d'éviter le désagrément d'avoir à
confirmer l'activation des macros à l'ouverture d'un document, ou pire, la désactivation systématique des macros.
Comment procéder :
- Rechercher dans le répertoire d'installation de Microsoft Office (généralement C:\Program Files\Microsoft Office\OfficeXX) le programme SelCert.exe
- Exécuter SelfCert.exe
- Renseigner le nom du certificat dans la zone de texte et valider
- Fermer SelfCert.exe
- Ouvrir le document Office dont les macros doivent être certifiées
- Dans l'éditeur VBA (Alt-F11), menu Outils Signature électronique ...
- Cliquer sur "Choisir..." et sélectionner le certificat précédemment créé
- Enregistrer le document
A la prochaine ouverture du document, une alerte de sécurité va apparaître, cocher alors la case "Toujours faire confiance aux macros provenant de... ".
Pour supprimer un certificat existant :
- Panneau de configuration Options Internet
- Onglet Contenu, cliquer sur Certificats...
- Sélectionner le certificat et cliquer sur Supprimer
Deux méthodes pour changer le répertoire par défaut de Word.
La première est permanente
Application.Options.DefaultFilePath
(
wdDocumentsPath) =
"c:\temp"
La seconde n'est valable que pour la session Word en cours, si vous fermez Word, ce paramètre disparaît.
Application.ChangeFileOpenDirectory
"C:\temp"
En principe, une fonction ne peut renvoyer qu'une seule variable. Partant de là, il est possible d'utiliser une variable de type utilisateur.
Type
MyVar
IntA As
Integer
IntB As
Integer
End
Type
Voilà un type de donnée défini par l'utilisateur.
Sub
MaProc
(
)
Dim
MyData As
MyVar
With
MyData
.IntA
=
10
.IntB
=
20
End
With
MyData =
monCalcul
(
MyData)
Debug.Print
MyData.IntA
, MyData.IntB
End
Sub
Voilà un procédure qui va faire appel à une fonction et passer en paramètre une variable qui contient 2 valeurs.
Public
Function
monCalcul
(
MyDt As
MyVar) As
MyVar
monCalcul.IntA
=
MyDt.IntA
*
2
monCalcul.IntB
=
MyDt.IntB
/
4
End
Function
Notre fonction renvoie bien deux résultats
Pour récupérer les fautes d'un document, il faut faire appel à la collection SpellingErrors. Nous allons parcourir les membres ce cette collection, les ajouter à une variable et ensuite, insérer la variable dans un nouveau document qui sera sauvegardé au format texte.
Sub
Fautes
(
)
Dim
mesFotes
Dim
toutesmesfotes
For
Each
mesFotes In
ActiveDocument.SpellingErrors
mesFotes.Select
toutesmesfotes =
toutesmesfotes &
amp; vbCrLf
&
amp; Selection
Next
mesFotes
Application.Documents.Add
ActiveDocument.Content.InsertAfter
toutesmesfotes
ActiveDocument.SaveAs
FileName:=
"c:\temp\mesftes.txt"
, FileFormat:=
wdFormatText
ActiveDocument.Close
End
Sub
C'est assez facile. L'exemple suivant affecte la mise en exposant à CTRL+MAJ+E
CustomizationContext =
NormalTemplate
KeyBindings.Add
KeyCode:=
BuildKeyCode
(
wdKeyE, _
wdKeyControl, wdKeyShift), KeyCategory:=
wdKeyCategoryCommand, Command:=
"Superscript"
Oui, il faut par contre demander le calcul pour une statistique
Dim
objDoc As
Word.Document
, msg As
String
Set
objDoc =
Application.Documents.Open
(
"d:\tuto.doc"
)
MsgBox
"Le documents contient "
&
amp; objDoc.ComputeStatistics
(
wdStatisticPages) &
amp; _
" pages et "
&
amp; objDoc.ComputeStatistics
(
wdStatisticWords) &
amp; " mots"
Vous pouvez obtenir les statistiques pour
- wdStatisticCharacters : nombre de caractères
- wdStatisticCharactersWithSpaces : nombre de caractères avec les espaces
- wdStatisticLines : nombre de lignes
- wdStatisticPages : nombre de pages
- wdStatisticParagraphs : nombre de paragraphes (retour chariot)
- wdStatisticWords : nombre de mots
Sub
remplacement_Macro_WordDot
(
)
Dim
Debut As
Integer
, Lignes As
Integer
, X As
Integer
Dim
Fichier As
String
, Direction As
String
Dim
Doc As
Document
Application.ScreenUpdating
=
False
'boucle sur tous les fichiers .dot du repertoire
Direction =
"C:\Documents and Settings\michel\dossier"
Fichier =
Dir
(
Direction &
amp; "\*.dot"
)
Do
While
Fichier <>
""
Set
Doc =
Documents.Open
(
Direction &
amp; "\"
&
amp; Fichier)
'suppression macro nommée "essai" dans module1
With
Doc.VBProject.VBComponents
(
"Module1"
).CodeModule
Debut =
.ProcStartLine
(
"essai"
, 0
)
Lignes =
.ProcCountLines
(
"essai"
, 0
)
.DeleteLines
Debut, Lignes
End
With
'ajout macro nommée "MaNouvelleMacro" dans Module1
With
Doc.VBProject.VBComponents
(
"Module1"
).CodeModule
X =
.CountOfLines
.InsertLines
X +
1
, "Sub MaNouvelleMacro()"
.InsertLines
X +
2
, "MsgBox ""Coucou"",VBinformation "
.InsertLines
X +
3
, "End Sub"
End
With
DoEvents
Doc.Close
True
Set
Doc =
Nothing
Fichier =
Dir
Loop
Application.ScreenUpdating
=
True
End
Sub
Pour faire appel à une boîte de dialogue :
Dialogs
(
wdDialogFileOpen).Show
Je vous conseille de consulter l'aide pour obtenir la liste de toutes les boîtes de dialogue disponibles.
L'éditeur VBA (VBE) possède une fonction qui ouvre une liste déroulante lorsuqe l'on écrit du code.
Si cette fonction n'est pas disponible, c'est que la bibliothèque associée au code que vous utilisez n'a pas été ajoutée
à votre projet.
Cette notation n'est pas obligatoire, mais elle rend la saisie et la compréhension du code plus facile.
Ainsi les deux lignes suivantes sont équivalentes :
Set
oTbl =
ActiveDocument.Tables.Add
(
Range:=
Selection.Range
, NumRows:=
11
, Numcolumns:=
11
)
Set
oTbl =
ActiveDocument.Tables.Add
(
Selection.Range
, 11
, 11
)
Si certains arguments sont optionnels et ne sont pas renseignés, si vous n'utilisez pas la notation avec le nom et le :=, vous devrez utiliser des espaces entre les séparateurs. Il est beaucoup plus facile d'utiliser le nom des arguments, même si la saisie du code est un peu plus longue.
Set
oDoc =
Documents.Add
(
Visible:=
yes)
Set
oDoc =
Documents.Add
(
, , , yes)
Le premier des deux code est plus explicite !