Le B A BA du VBA
Qu'est-ce qu'une macro ?
Macro est le diminutif de macrocommande qui désigne à l’origine une commande regroupant plusieurs commandes. C’est un programme simple. Les macros sont très utiles pour exécuter de façon répétitive les mêmes suites d’opérations. Par la suite on a pris l’habitude d’appeler macro tout programme introduit dans un logiciel applicatif pour en étendre les commandes.
Word est un traitement de texte programmable. Les commandes et fonctions déclenchées au clavier ou à la souris par l’utilisateur peuvent pratiquement toutes être exécutées de façon automatisée par une macro.
Pour programmer Word on utilise le langage VBA (Visual Basic pour Applications) un langage très proche de Visual-Basic et commun à un grand nombre d’applications en particulier celles du pack Office comme Excel ou Access.
Les anciennes versions de Word jusqu’à la version 7 (Word 95) utilisaient un autre langage également proche du Basic mais spécifique à Word : WordBasic. Pour des raisons de compatibilité, VBA est capable d’exécuter des instructions WordBasic. Mais il est déconseillé aux néophytes de s’intéresser au WordBasic devenu aujourd’hui obsolète.
Il n’est pas nécessaire de connaître le langage VBA ni même de savoir programmer pour utiliser des macros dans Word. L’Enregistreur de macro (voir plus loin) permet de créer de toute pièce des macros en enregistrant ses propres actions dans Word. L’enregistreur se charge de créer tout seul le code de la macro. Il est possible également d’installer des macros, de les importer ou de les copier à partir de diverses sources extérieures.
Le code d’une macro n’est en effet que du texte brut comme celui édité dans le Bloc-notes (NotePad). En VBA ce texte est plus facilement édité dans VBE (Visual Basic Editor). VBE est plus qu’un éditeur de macros, c’est tout l’environnement de travail de VBA.
On bascule rapidement de la fenêtre principale du document en cours à la fenêtre VBE avec la touche Alt‑F11. Cette fenêtre s’affiche aussi :
Onglet Développeur / groupe Code /bouton Visual Basic.
Si l'onglet Développeur n'est pas affiché :
Bouton Office, Options Word => cocher l'option Afficher l'onglet Développeur dans le ruban.
Une macro comporte au moins deux lignes : la première commençant par Sub (pour subroutine ou procédure) suivi du nom de la macro et la dernière End Sub qui en marque la fin d’exécution. Tout le code d’une macro doit être placé entre ces deux lignes. La macro suivante simplissime s’appelle Test et ne fait rien du tout !
Sub Hello()
End Sub
La macro suivante s’appelle Hello et se contente d’afficher le message « Bonjour ! »
Sub Hello()
MsgBox "Bonjour !"
End Sub
Pour lancer l’exécution d’une macro, qu’elle ait été enregistrée, éditée ou copiée dans VBE, il suffit de se rendre dans la boîte de dialogue «Macros»:
Onglet Développeur / groupe Code / Macros
ou
Onglet Affichage / groupe Macros / Macros
ou par Alt‑F8, de sélectionner la macro par son nom et de cliquer sur le bouton Exécuter.
Pour un meilleur confort d’utilisation, l’exécution d’une macro peut aussi être affectée à un raccourci-clavier, à un bouton d’une barre d’outils, à un menu ou un sous-menu exactement comme n’importe quelle commande d’origine dans Word.
Je n’y connais rien : comment faut-il débuter en VBA ?
L’abord de la programmation VBA dans Word sera très différent selon qu’on possède ou non des rudiments de connaissance en langages de programmation. Pour quelqu’un qui a déjà programmé en Visual-Basic, utiliser VBA apparaîtra d’une très grande simplicité. Pour celui qui connaît déjà VBA au travers d’Excel par exemple il suffira de se familiariser avec les objets propres à Word pour se retrouver très vite en terrain connu. Pour qui a des notions de programmation, VBA n’est pas un langage difficile : il s’agit d’un langage interprété simple, orienté objets, dont la syntaxe peu contraignante reprend les principes du BASIC. Pour qui ne connaît rien à la programmation, VBA est un bon moyen d’initiation : il suffit de commencer par enregistrer (voir plus loin) ses premières macros, d’en examiner le code pour le comprendre puis de se lancer…
Il n’est pas nécessaire de faire l’acquisition d’un gros manuel sur le langage VBA. D’ailleurs les meilleurs ouvrages dans ce domaine font surtout référence à Excel. Si les enseignements qu’on y trouve sont pour l’essentiel applicables à Word, le débutant doit privilégier la formation au moyen d’exemples concrets pratiques directement utilisables dans Word.
En réalité tout ce dont on a besoin est déjà dans Word lui-même !
L’Enregistreur de macro est l’étape indispensable du débutant. Rien de tel que d’examiner le code produit par l’enregistreur pour s’initier.
-
L’Aide de VBA est un outil extrêmement didactique et utile. Il représente à lui seul le meilleur et le plus gros ouvrage sur VBA pour Word. Même les «macroteurs» les plus chevronnés y font appel sans réserve. Une fois dans VBE avec Alt‑F11, appeler l’Aide de VBA avec F1.
Si l’Aide VBA n’est pas installée dans Word, il est urgent de l’installer depuis le CD-ROM d’installation.
Se placer sur l’onglet « Aide intuitive » (l’onglet « Sommaire » est moins pratique). Entrer un terme par exemple « document ». L’aide est organisé en hypertexte. Ainsi dans la rubrique « Document, objet », aller dans « Voir aussi » puis « Utilisation des objets Document ». L’Aide VBA contient de nombreuses pages didactiques avec des exemples que l’on peut copier dans son propre code.
Dans l’éditeur VBE il suffit de sélectionner un mot clé, une commande, une fonction et d’appuyer sur F1 pour voir la rubrique correspondante dans l’Aide.
-
VBE lui-même est d’une aide précieuse. Dans la fenêtre Code les mot-clés sont repérés en couleur, la saisie des méthodes ou propriétés des objets est facilitée par l’option « Complément automatique des instructions », les fautes de syntaxe sont repérées etc.
-
L’Explorateur d’objets dans VBE (F2) est le grand index de tous les éléments disponibles dans l’environnement VBA. Il permet de se retrouver dans les arcanes du langage et d’invoquer rapidement l’Aide (F1).
Il ne reste plus qu’à piocher dans les exemples de la faqword et dans les exemples à télécharger les nombreux exemples de code VBA pour devenir « macroteur » certifié, et à se promener dans la KB Microsoft.
On m’a dit d’utiliser l’enregistreur de macro.
Comment dois-je m’y prendre ?
Il n’est pas nécessaire de connaître la programmation ou VBA pour composer ses premières macros. Comme dit Geo «l’enregistreur de macros est votre ami».
Soit à définir une macro plaçant à la fin du document l’image scannée d’une signature conservée dans un fichier Signature.jpg.
Lancer l’Enregistreur de macro
- Lancer l’Enregistreur de macro
Onglet Développeur, groupe Code, bouton Enregistrer une macro.
Ou clic sur le bouton Enregistreur de macro sur la barre d'état en bas de la fenêtre Word
- Donner un nom à la macro
Dans la boîte de dialogue Enregistrer une Macro, remplacer le nom par défaut Macro1 par un nom de commande plus explicite : exemple « MaSignature » sans espace ni ponctuation. Dans la même boîte de dialogue on peut définir l’endroit où sera enregistrée la macro, dans un modèle ou dans un document ainsi qu’un commentaire. En laissant la macro MaSignature dans Normal.dotm on en autorise une utilisation globale. Enfin deux boutons permettent d’affecter la macro soit à un bouton, soit à un raccourci clavier (soit aux deux).
-
Enregistrer la macro
Dès l’appui sur le bouton OK de la boîte de dialogue précédente, toutes les opérations dans Word sont enregistrées comme sur un magnétophone : déplacer le point d’insertion à la fin du document avec Ctrl‑Fin, Insérez une image à partir d'un fichier… pour placer l’image de la signature.
- Arrêter l’enregistrement
Cliquer sur le bouton d'arrêt de l'enregistrement sur la barre d'état situé en bas de la fenêtre Word.
Le bouton Suspendre l'enregistrement situé sous l'onglet Développeur, groupe Code, est accessible durant l'enregistrement de la macro permettant de suspendre l'enregistreur pour des commandes que l'on ne désire pas enregistrer.
Et voilà ! La macro-commande MaSignature fait désormais partie des commandes Word ! Elle se lancera par l’appui du bouton ou de la touche-raccourci qui lui sont affectés ou via la boîte de dialogue Macro (Alt+F8).
L’enregistreur de macro est également le meilleur professeur pour s’initier à VBA. C’est en observant le code produit par l’enregistreur et en le modifiant qu’on fera les plus rapides progrès en programmation.
Ainsi en ouvrant Visual Basic Editor par Alt‑F11, peut-on y lire le code suivant :
Sub MaSignature()
'
' MaSignature Macro
' Macro enregistrée le 12 janvier 2003 par Marina
'
Selection.EndKey Unit:=wdStory
Selection.InlineShapes.AddPicture FileName:= _
"C:\Mes documents\Mes images\Signature.jpg" _
, LinkToFile:=False, SaveWithDocument:=True
End Sub
Cet exemple de macro nous donne l’occasion de rappeler que Word est un traitement de texte très puissant souvent sous-estimé. Il est généralement préférable d’exploiter les fonctionnalités du logiciel avant de se lancer dans l’écriture et l’usage de macros vba. La macro apposant une signature manuscrite semble très utile ? Pourtant définir une Correction automatique apposant l’image de la signature est à la fois plus rapide et plus pratique.
Visual Basic, VBA, VBScript : quelles sont les différences ?
VBA - Visual Basic pour Applications - est le langage des macros de WORD. Il est commun aux autres applications de la suite Microsoft Office. Pour simplifier on le présente souvent comme un sous-ensemble de Visual Basic tant les ressemblances sont grandes. Il s’agit en effet du même langage, celui de la famille Visual Basic, un langage à objets dont la syntaxe simple dérive du Basic.
Dans la mesure où tous les langages de la famille Visual Basic sont capables d’utiliser des composants logiciels externes, la distinction entre les dialectes n’est pas si considérable. Ainsi une application Visual Basic peut utiliser le modèle d’objets Word pour produire ou lire des documents Word. De son côté le VBA de Word peut chercher et manipuler des données dans une feuille Excel. Et un script en VBScript peut lancer une opération de publipostage faisant intervenir à la fois Word et Excel. Schématiquement on peut dire : faire en VB ; faire faire en VBA ; faire faire faire en VBScript.
(Introduction à Windows Script)
-
Visual Basic proprement dit, dans ses diverses versions jusqu’à Visual Basic .NET, est un outil de développement complet destiné à produire des applications totalement autonomes, généralement sous forme d’exécutables compilés. Un programme VB n’a besoin pour être exécuté que du système d’exploitation et des bibliothèques d’exécution (runtime) souvent déjà présentes sur le système.
-
VBA ne produit pas d’exécutable autonome. Un programme VBA ne peut s’exécuter que dans l’application qui le supporte. Mais son avantage est de disposer immédiatement de tous les objets de l’application hôte. VBA se comporte plus en langage interprété : le code n’est vérifié et semi-compilé qu’au moment de l’exécution.
-
VBScript quant à lui est un langage de script destiné aux échanges entre serveurs et clients. Le navigateur Internet Explorer et les dernières versions de Windows disposent des moteurs d’exécution des scripts en VBScript. Ainsi Windows Scripting Host (WSH) permet de commander le système d’exploitation de façon plus puissante que ne le faisait les fichiers .BAT (batch) hérités de ms-dos.
Dans la mesure où tous les langages de la famille Visual Basic sont capables d’utiliser des composants logiciels externes, la distinction entre les dialectes n’est pas si considérable. Ainsi une application Visual Basic peut utiliser le modèle d’objets Word pour produire ou lire des documents Word. De son côté le VBA de Word peut chercher et manipuler des données dans une feuille Excel. Et un script en VBScript peut lancer une opération de publipostage faisant intervenir à la fois Word et Excel. Schématiquement on peut dire : faire en VB ; faire faire en VBA ; faire faire faire en VBScript.
Il paraît que les macros peuvent propager des virus
Comment s’en prémunir ?
Effectivement aujourd’hui la plupart des virus informatiques sont des macro-virus ou des script-virus qui se propagent très vite par Internet, dans les pièces jointes des emails notamment. Ils utilisent les ressources logicielles de l’ordinateur contaminé en exploitant les failles de sécurité des systèmes. En raison de leur très large diffusion, les produits Microsoft sont les cibles privilégiées des virus. Il convient donc d’être prudent : tout code vba dont l’origine n’est pas établie doit être considéré comme suspect. Voici les conseils généraux et ceux particuliers à Word pour se protéger :
Installer, mettre à jour et utiliser régulièrement un programme anti-virus. Il faut savoir cependant que la hantise des macro-virus dans Microsoft Office a poussé certains de ces logiciels à en devenir gênants : quand ce ne sont pas de sensibles ralentissements, ce peut être des dysfonctionnements voire des blocages. Le « plug-in » Microsoft Office de Norton AntiVirus en est un exemple très fréquent ; sa désactivation ne présente pas de risque majeur pour peu de s’astreindre à ne jamais ouvrir un document étranger sans une analyse préalable. L’anti-virus garde par ailleurs toute son efficacité.
Ne jamais ouvrir ou exécuter une pièce jointe d’un message d’origine douteuse
Régler le niveau de sécurité de son navigateur pour interdire le téléchargement et l’exécution de logiciels non souhaités et compléter par l’installation d’un pare-feu.
Placez les documents sûrs dans des emplacements approuvés. Pour connaître les emplacements approuvés et en créer de nouveaux :
Onglet Développeur / groupe Code / Bouton Sécurité des macros / Emplacements approuvés
Puis dans les Paramètres des macros, cocher l'option Désactiver toutes les macros à l'exception des macros signées numériquement (pour les macros de documents situés dans un emplacement non approuvé).
Le maintien enfoncé de la touche MAJ au lancement de Word sur un document suspect interdit le lancement des macros automatiques.
Dans un environnement très peu fiable, on peut interdire toute macro non placées dans un emplacement approuvé en cochant l'option Désactiver toutes les macros sans notification.
Il y a par ailleurs une grande nouveauté dans Word 2007 : la différence entre les fichiers à extension docx et les fichiers à extension docm. Les fichiers docm peuvent contenir des macros à l'inverse des documents docx qui sont donc fiables.
Réduire les risques d'infection par des virus de macro
J’ai lu le code d’une macro dans le forum. Comment le récupérer et l’utiliser ?
Une macro est écrite en texte brut. Il est facile de récupérer du code sur un forum, une page Internet comme la FAQ, ou un document quelconque par un simple copier-coller dans l’éditeur VBE :
-
Sélectionner et copier tout le texte de la macro depuis la ligne contenant Sub NomdeMacro jusqu’à la dernière End Sub
-
Dans Word lancer l’éditeur VBE par Alt‑F11.
-
Dans la fenêtre de l’explorateur de projets (Affichage / Explorateur de projets), choisir le module dans lequel sera copiée la macro. Un module peut appartenir à un modèle global comme Normal.dot, un modèle de document, ou un document. La macro sera alors accessible depuis tous les documents, depuis les documents attachés à un modèle, depuis un seul document. Si le modèle ou le document choisi n’a pas encore de module, sélectionner son projet et créer un nouveau module avec Insertion / Module.
-
Dans la fenêtre de code (au besoin visible avec F7) coller le texte de la macro
-
Vérifier la validité du code copié. Il peut arriver que des lignes de code soient mal copiées avec des sauts de lignes intempestifs. Certaines lignes s’affichent alors en rouge. Il faut savoir qu’une ligne de code ne peut se poursuivre sur la ligne suivante que si elle se termine strictement par ‘ _’ c’est-à-dire espace + underscore (_) +saut de ligne (¶). Il faut parfois, en particulier sur du code récupéré d’un forum, recoller les lignes en rouge.
-
Quitter VBE Alt‑F11
-
La macro s’exécute à partir de la boîte de dialogue Macros (Alt‑F8 ).
-
Au moment de quitter Word, accepter au besoin les modifications du modèle ou du document dans lequel a été introduite la macro.
Quelles sont les notions de base pour comprendre le code VBA ?
VBA reprend à l’identique toutes les caractéristiques de Visual Basic, un langage simple orienté objet. La syntaxe est élémentaire, les contraintes limitées ce qui en fait un langage idéal pour de petites applications. Les premières notions à comprendre sont peu nombreuses :
-
Objet
-
Propriété
-
Méthode
-
Collection
-
Variable
-
Procédure
-
Fonction
-
Structures de contrôle
-
Evénement
Objet
Le langage manipule des objets : un document Word est un objet, un paragraphe est un objet, mais aussi un style, un dictionnaire, un bouton, un menu ou même l’application Word elle-même. Un objet se caractérise par sa Classe. L’objet ActiveDocument est le ‘document actif’, celui que voit l’utilisateur, c’est un objet de la classe Document. Dès qu’un objet existe – on parle d’instance – il hérite de toutes les caractéristiques de sa classe que sont principalement ses propriétés et ses méthodes.
Propriété
Une propriété est une donnée interne propre à un objet. Ainsi tous les objets de la classe Document possèdent un nom Name, des paragraphes Paragraphs, des mots Words, des caractères Characters etc. Une propriété peut être elle-même un objet ou une collection (voir plus loin) d’objets. On accède à la valeur d’une propriété d’un objet particulier en écrivant Objet.propriété avec un point comme délimiteur : ActiveDocument.Name est le nom du document actif. Pour lire ou modifier une propriété il faut décliner toute la suite des objets et propriétés qui sont ses parents.
l’instruction suivante :
ActiveDocument.Paragraphs(1).Range.Font.Color = wdColorBlue
met en bleu tout le texte du premier paragraphe du document actif.
Méthode
Une méthode est une commande propre à un objet. Tous les objets de la classe Document peuvent recevoir l’ordre enregistrer Save, imprimer PrintOut, vérifier l’orthographe CheckSpelling etc. Comme une propriété, une méthode s’écrit avec son objet et un point : ActiveDocument.Save enregistre le document actif. Une méthode comporte souvent une série d’arguments qui précisent les modalités de la commande. Certains arguments peuvent être facultatifs. Les arguments sont passés à la méthode soit entre parenthèses soit nommément avec l’opérateur d’affectation := .
Les instructions
ActiveDocument.SaveAs ("Essai.doc")
et
ActiveDocument.SaveAs FileName:="Essai.doc"
commandant d’enregistrer le document actif sous le nom Essai.doc sont équivalentes.
Collection
Une collection est un objet qui regroupe des objets d’une même classe. L’objet Documents désigne la collection des documents ouverts dans l’application. Il ne faut pas confondre collection et classe ni collection et objets: les propriétés et les méthodes de Documents ne sont pas celles d’un document. Exemple : Documents.Count est la propriété du nombre de documents ouverts dans la collection Documents, et Documents.Add est la méthode pour ouvrir un nouveau document. Les objets d’une collection sont accessibles quant à eux comme propriétés particulières de la collection. Exemple : s’il n’y a qu’un document ouvert nommé Essai.doc Documents.Item(1) ou Documents(1) ou Documents("Essai.doc") désignent de façon équivalente le document Essai.doc. Dans le cas des collections les objets éléments sont référencés par indice ou nommément entre parenthèses.
Variable
Une variable est un élément de programmation désignant et gardant une donnée en mémoire. Une variable possède un nom, une portée et une valeur. Le nom est un identificateur unique. La portée précise dans quelle partie du code ce nom est reconnu et par conséquent la variable utilisable en tant que telle. La valeur dépend du type de données de la variable: une variable peut être de type nombre (octet, booléen vrai-faux, nombre entier court ou long, nombre décimal etc.), de type chaîne de caractères, de type date, de type variant qui est un type alphanumérique flexible par défaut, d’un type objet, ou encore d’un type lui-même défini par l’utilisateur. Une instruction de déclaration Dim, Private , Public ou Static donne naissance à une variable en lui attribuant à la fois un nom, une portée et un type de donnée.
Public Client As String
déclare une variable publique (accessible dans tous les modules) nommée Client et de type chaîne de caractères
Dim Signature As Paragrap
déclare une variable-objet nommée Signature de portée locale représentant un objet de la classe Paragraph.
Une variable est vide lors de sa déclaration. Une valeur lui est donnée par une instruction d’affectation avec le signe =
Client = "Monsieur Durand"
Set Signature = ActiveDocument.Paragraphs.Last
Le mot-clé réservé Set est obligatoire pour affecter une variable-objet.
VBA permet une déclaration implicite des variables non objets au moment de leur première affectation. Les instructions de déclaration deviennent obligatoires si l’instruction OPTION EXPLICIT est placée en tête d’un module.
De nature voisine, une Constante est aussi une donnée nommée, contenant une valeur d’un type de donnée non objet, de portée locale ou générale mais non modifiable contrairement à une variable. Elle est déclarée par l’instruction Const. Les constantes sont utilisées pour améliorer la lisibilité du code.
Public Const Bleu As Long = 16711680
déclare une constante globale de type entier long représentant la couleur bleue. C’est la même valeur que la constante prédéfinie wdColorBlue vue plus haut. VBA contient un grand nombre de constantes prédéfinies.
Quand un programme « ne marche pas » comme on s’y attendait, neuf fois sur dix c’est une erreur de programmation dans le nom, la portée ou le type de données d’une variable. Les outils d’aide à la programmation ont pour charge essentielle de surveiller les variables.
Procédure
Les instructions Exit For ou Exit Do permettent de sortir d’une boucle For...Next ou d’une boucle Do...Loop
-
Les sauts
-
La gestion des erreurs
- Les blocs d'instructions par objet
Événement
Exemple : interception de l’impression d’un document pour obliger à vérifier que l’imprimante est bien allumée
Public WithEvents appWord As Word.Application
Private Sub appWord_DocumentBeforePrint
(ByVal Doc As Document, Cancel As Boolean)
Reponse = MsgBox("L'imprimante est-elle allumée ?", vbYesNo)
If Reponse = vbNo Then Cancel = True