FAQ WordConsultez toutes les FAQ

Nombre d'auteurs : 20, nombre de questions : 289, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireVBA bis

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.
Créé le 18 avril 2007  par Lebeau Olivier

Nécessite d'activer la référence "Microsoft Word xx.x Object Library".

vba
Sélectionnez

Dim WordApp As Word.Application
 
    Set WordApp = CreateObject("Word.Application")
    WordApp.Visible = True
 
    WordApp.Documents.Open ("C:\monDocument.dot")
    WordApp.Run "laMacro"
Créé le 22 octobre 2006  par SilkyRoad

Un petit tutoriel pour vous guider : Les cinq syntaxes de base du langage VBA

Créé le 20 avril 2008  par Maxence Hubiche

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

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.

 
Sélectionnez

'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"
Next
Créé le 4 février 2004  par bidou

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.

 
Sélectionnez

Sub Document_Open()
ActiveDocument.Bookmarks("ICI").Select
ActiveDocument.Bookmarks("ICI").Delete
End Sub
 
 
Sélectionnez

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.

Créé le 20 juillet 2007  par Lebeau Olivier

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.

Créé le 19 septembre 2007  par Lebeau Olivier

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.

 
Sélectionnez

Documents("MonDocument.docm").MaRoutine

Avec "MaRoutine" le nom de la macro située dans l'autre document.

Créé le 20 avril 2008  par Lebeau Olivier

L'objet Screen n'existant pas en VBA, on peut retrouver ces valeurs en utilisant les fonctions de l'API Win32 :

 
Sélectionnez

 
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 Function
Créé le 22 octobre 2006  par nico-pyright(c)

L'objet ClipBoard n'existant pas en VBA, il faut utiliser les fonctions de l'API Windows :

vba
Sélectionnez

'-- 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
Créé le 22 octobre 2006  par rp

On utilise la décomposition du range en Start et End

 
Sélectionnez

ActiveDocument.Range(ActiveDocument..Bookmarks("sig1").Range.Start, _
ActiveDocument..Bookmarks("sig2").Range.End).Select 
Créé le 6 février 2004  par Maxence Hubiche, 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

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.

 
Sélectionnez

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.

Créé le 7 août 2007  par Lebeau Olivier

Dans le déroulement d'un code, il est parfois intéressant de connaître le type de variable utilisée.

 
Sélectionnez

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
Créé le 20 avril 2008  par Lebeau Olivier

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.

EarlyBinding
Sélectionnez

 
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.

 
Sélectionnez

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
Créé le 7 juin 2008  par Lebeau Olivier

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

 
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

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"

vba
Sélectionnez

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")
Créé le 22 octobre 2006  par SilkyRoad

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 Image non disponible Macros Image non disponible 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 Image non disponible 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 Image non disponible Options Internet
  • Onglet Contenu, cliquer sur Certificats...
  • Sélectionner le certificat et cliquer sur Supprimer
Créé le 22 octobre 2006  par ThierryAim

Deux méthodes pour changer le répertoire par défaut de Word.
La première est permanente

 
Sélectionnez

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.

 
Sélectionnez

Application.ChangeFileOpenDirectory "C:\temp"
 
Créé le 20 janvier 2008  par Lebeau Olivier

En principe, une fonction ne peut renvoyer qu'une seule variable. Partant de là, il est possible d'utiliser une variable de type utilisateur.

 
Sélectionnez

Type MyVar
    IntA As Integer
    IntB As Integer
End Type

Voilà un type de donnée défini par l'utilisateur.

 
Sélectionnez

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.

 
Sélectionnez

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

Créé le 25 novembre 2007  par Lebeau Olivier

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.

 
Sélectionnez

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 Sub
Créé le 3 août 2007  par Lebeau Olivier

C'est assez facile. L'exemple suivant affecte la mise en exposant à CTRL+MAJ+E

 
Sélectionnez

 
   CustomizationContext = NormalTemplate
    KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyE, _
	  wdKeyControl, wdKeyShift), KeyCategory:=wdKeyCategoryCommand, Command:="Superscript"
 
Créé le 4 février 2004  par bidou

Oui, il faut par contre demander le calcul pour une statistique

 
Sélectionnez

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

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 &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
Créé le 25 avril 2007  par SilkyRoad

Pour faire appel à une boîte de dialogue :

 
Sélectionnez

Dialogs(wdDialogFileOpen).Show


Je vous conseille de consulter l'aide pour obtenir la liste de toutes les boîtes de dialogue disponibles.

Créé le 25 avril 2007  par Lebeau Olivier

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.

Image non disponible
La liste déroulante
Créé le 7 juin 2008  par Lebeau Olivier

Lien : Comment ajouter une référence à mon 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 :

 
Sélectionnez

Set oTbl = ActiveDocument.Tables.Add(Range:=Selection.Range, NumRows:=11, Numcolumns:=11)
 
Sélectionnez

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.

 
Sélectionnez

Set oDoc = Documents.Add(Visible:=yes)
 
Sélectionnez

Set oDoc = Documents.Add(, , , yes)

Le premier des deux code est plus explicite !

Créé le 10 mai 2008  par Lebeau Olivier
  

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 © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.