FAQ Word

FAQ WordConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 289, dernière mise à jour : 15 juin 2021
Sommaire→VBA bis- 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 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.SelectSentences 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 & vbCrLf & objDoc.BuiltInDocumentProperties(wdPropertyLines)
For Each Phrase In objDoc.Sentences
Phrase.Select
MsgBox "suite"
NextAlors 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 SubSub Document_Close()
With Selection
.Bookmarks.Add "ICI"
End With
End SubVous 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").MaRoutineAvec "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 & / GetDeviceCaps(lngDC, LOGPIXELSX)
ReleaseDC HWND_DESKTOP, lngDC
End Function
Function TwipsPerPixelY() As Single
Dim lngDC As Long
lngDC = GetDC(HWND_DESKTOP)
TwipsPerPixelY = 1440 & / GetDeviceCaps(lngDC, LOGPIXELSY)
ReleaseDC HWND_DESKTOP, lngDC
End FunctionL'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 SubOn utilise la décomposition du range en Start et End
ActiveDocument.Range(ActiveDocument..Bookmarks("sig1").Range.Start, _
ActiveDocument..Bookmarks("sig2").Range.End).SelectCela 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 WithPour 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 SubLe 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 SubLateBinding
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 SubLien : 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, 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
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 TypeVoilà 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 SubVoilà 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 FunctionNotre 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 & vbCrLf & Selection
Next mesFotes
Application.Documents.Add
ActiveDocument.Content.InsertAfter toutesmesfotes
ActiveDocument.SaveAs FileName:="c:\temp\mesftes.txt", FileFormat:=wdFormatText
ActiveDocument.Close
End SubC'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 " & objDoc.ComputeStatistics(wdStatisticPages) & _
" pages et " & objDoc.ComputeStatistics(wdStatisticWords) & " 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 & "\*.dot")
Do While Fichier <> ""
Set Doc = Documents.Open(Direction & "\" & 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 SubPour 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 !


