Catégorie : Macros

Outlook

Signer numériquement ses macros

Créer une macro implique d’abaisser le niveau de sécurité de son poste de travail.
Pourtant, Microsoft propose une solution gratuite pour allier macro et sécurité : l’auto-certification.
Grâce à cette astuce, vous pourrez lancer vos macros signées tout en inhibant toutes les autres !

Localiser Selfcert.exe

Selfcert.exe est un utilitaire gratuit installé sur votre poste de travail en même temps que la suite Office.

Il est localisé dans votre répertoire c:\Program files (x86)\Microsoft Office\version_de_votre_suite.

En cas de souci, utilisez le moteur de recherche de votre explorateur pour localiser cet utilitaire.

Double cliquez sur son Selfcert.exe pour lancer le programme.

Une boîte de dialogue vous invite à créer un certificat : affectez-lui un nom, par exemple, le nom de votre société. Validez. Votre certificat est créé.

Signer une macro à l'aide de votre certificat

Toutes les macros créées par vos soins devront désormais être rattachées à votre certificat pour s’exécuter sur votre poste de travail.

Pour cela :

  • Ouvrez votre macro.
  • Activez le menu Outils puis Signature électronique.
  •  Cliquez sur Choisir et pointez vers le certificat créé (ou sur le lien Autre choix si plusieurs certificats sont présents sur votre disque dur). 
  • Validez. Votre macro est signée.

Gérer le niveau de sécurité de vos macros

Une fois votre certificat installé, pensez à ajuster le niveau de sécurité de votre poste de travail en activant l’onglet Développeur puis Sécurité des macros.

Optez pour Notifications pour les macros signées numériquement, toutes les autres macros sont désactivées.

 

 

Cette manipulation est à effectuer une fois pour chacun des programmes Office (une fois pour Outlook, une fois pour Excel, etc.).

Refermez la boîte de dialogue.

 

Partager un certificat avec d'autres utilisateurs

Lors de l’ouverture d’un fichier contenant une macro signée, l’utilisateur est informé de la présence d’un certificat par le biais d’un message.

Pour valider votre certificat, il devra cliquer sur  Approuver tous à partir de l’éditeur. Il pourra ensuite ajuster ses paramètres de sécurité comme expliqué précédemment. Désormais, toutes vos macros signées seront automatiquement acceptées.

 

Supprimer un certificat

On « révoque » un certificat par le biais soit de votre navigateur, soit en passant par le Panneau de configuration.

Sous Chrome :

Activez Paramètres Paramètres avancés (tout en bas de la page) – Gérer les certificats.

La liste de vos certificats s’affiche et vous pouvez alors les supprimer.

Par le panneau de configuration :

Bouton Démarrer Paramètres (roue dentée).
Dans la zone de moteur de recherche, tapez « certificats » et sélectionnez l’option Gérer les certificats utilisateur.
Cette action ouvre un nouveau panneau.
Double cliquez sur Personnel Certificats.
Sélectionnez le certificat et cliquez ensuite sur X et validez.

 

Concevoir un userform

Les boîtes de dialogue (ou Userform en anglais) permettent une véritable interaction avec l’utilisateur.  Elles comportent des zones de texte, des listes déroulantes, des cases à cocher… qui guident l’utilisateur dans ses choix. Elles sont donc très présentes en programmation.

Nous allons aujourd’hui découvrir comment concevoir ce type d’userform à travers un petit exercice Word mais le principe de la Userform vaut également pour tous les logiciels Office.

Pour cet exercice, nous repartirons sur la promesse d’embauche de la leçon précédente. Nous allons créer sous Word une boîte de dialogue pour permettre à un utilisateur de saisir tous les renseignements nécessaires pour finaliser le document. Pour cela, les zones à compléter ont été marquées à l’aide de signets.

Pour mémoire, pour visualiser les emplacements des signets dans un document Word, activez FichierOptions, Options avancées, et cochez la case Afficher les signets.

comment afficher un symbole signet dans Word

Les emplacements sont matérialisés par une [ grise. Pour plus de clarté, j’ai indiqué dans l’illustration ci-dessous le nom de chacun de ces signets en violet et à côté de la  [ : imprimez cette page car nous aurons besoin des ces indications pour insérer les différents éléments de notre boîte de dialogue à l’issue de notre macro.

signets

Créer une boîte de dialogue ou Userform

A présent, entrons dans le vif du sujet et passons à la création de la boîte de dialogue.

Tout d’abord, affichez l’éditeur Visual Basic (Alt F11).

Cliquez sur l’icône userform userform à gauche dans la barre d’outils.

Une grille intitulée Userform1 s’affiche ainsi qu’une barre d’outils Contrôles. user2

Les contrôles servent à positionner des des Zones de textes, cases à cocher, listes déroulantes… dans le Userform.
A l’aide de votre souris, survolez chacun de ces contrôles afin de bien les identifier.
Au cours de cette leçon, nous allons manipuler certains de ces contrôles (Intitulé, zone de texte, bouton de commande et, pour le plaisir, Image).

Agrandissez à présent un peu la Userform : positionnez votre curseur sur un angle de la Userform et tirez à l’aide de la souris. Vous pourrez, bien évidemment, à tout moment réajuster la taille de cette boîte.

Ajouter des contrôles Intitulés et Zones de texte

Avant d’ajouter nos contrôles sur notre boîte de dialogue, nous devons tout d’abord lister les informations que nous aurons besoin de récupérer :

L’adresse : elle comprend un champ societe, contact, rue1, éventuellement rue2, cp et ville. Nous créerons donc autant de champs textes que d’indications à fournir, en l’occurrence 6 zones.

La date, nos références, vos références, pièces jointes, objet, signataire, titre du signataire : pour ces champs, nous utiliserons les mêmes noms que ceux utilisés dans les signets, à l’exception de date que nous nommerons ‘datel’ (‘date’ étant un mot réservé en programmation).

Salutation (le contenu des salutations 1 et 2 étant identiques, un seul contrôle suffit). Par contre, il convenait de définir 2 signets, un par position dans le corps de la lettre.

A présent, plaçons les contrôles.

Les intitulés (étiquettes) – Propriété Caption

Cliquez sur l’icône intitule et déplacez votre curseur sur la Userform. Votre curseur  prend la forme +  A. Cliquez sur un emplacement de la grille pour ajouter une étiquette (Label en anglais).captionPour modifier l’intitulé de l’étiquette et afficher Société, dans la boîte de dialogue Propriétés située à gauche de votre écran sous la zone Projets. Si cette fenêtre n’apparaît pas, appuyez sur F4. Repérez le champ Caption (légende) et cliquez 2 fois derrière Label1 pour le sélectionner.

A présent, tapez tout simplement le nom de l’étiquette, à savoir « Société : » et appuyez sur entrée.

Les zones de textes – Propriétés Name

A présent, nous allons insérer notre première zone de texte. Contrairement à l’Intitulé qui fournit des indications destinées à l’utilisateur sur la zone qui suit, une zone de texte est une zone que l’utilisateur peut compléter. Cliquez sur l’icône  ab| et tracez une zone de texte juste à côté de l’étiquette que vous venez de dessiner. Tracez-la suffisamment longue pour qu’elle puisse accueillir un nom de société.

Nous allons à présent nommer cette zone de texte. Pourquoi ? Tout simplement parce que nous en aurons besoin pour récupérer son contenu. Dans la fenêtre de Propriétés, cliquez 3 fois sur le champ (Name), et saisissez le nom « societe ». Validez en appuyant sur entrée. Choisissez de préférence des noms courants, parlants et sans accent ni espace, pour des questions de sécurité.

Pour chaque élément à récupérer, à votre tour créez une étiquette et une zone de texte comme ci-dessous :

boite

Pour celles ou ceux qui le souhaitent, vous pouvez télécharger ici la Userform ci-dessus. Sauvegardez-la sur votre disque dur puis, dans le menu Fichier de l’éditeur Visual Basic, sélectionnez l’option Importer un fichier et pointez vers le fichier. Validez : Userform1 est insérée dans le répertoire Feuilles.

Les autres contrôles et leurs propriétés : boutons de commande, image et UserForm

Il nous reste à présent quelques éléments à dessiner sur notre boîte de dialogue : un bouton « Valider » pour valider le contenu, un bouton « Annuler » pour refermer la boîte de dialogue et enfin, une image (logo), pour la fine bouche.

Les boutons de commande – Propriétés Caption et Name

  • Pour placer un bouton de commande, cliquez sur l’icône  puis cliquez sur un emplacement libre de votre boîte de dialogue.
  • Il va à présent falloir ajouter un texte à ce bouton. C’est là le rôle de la propriété Caption. Dans la fenêtrePropriétés, cliquez 2 fois sur « Caption » et saisissez « Valider ». Appuyez sur entrée pour terminer.
  • Nous allons à présent donner un nom à ce bouton. Double cliquez sur la propriété « Name » et saisissez « Ok ». On le voit : le nom du bouton (« Ok ») peut être différent de son intitulé (« Valider »).
  • De la même manière, créer un bouton ayant les propriétés suivantes :
    • Caption : Annuler
    • Name : Cancel

Facultatif – Insérer une image

A présent, nous allons ajouter notre image. Pour ce faire, je vais utiliser le logo de ce site (vous pouvez faire de même en opérant un clic droit sur l’image en Hautet à gauche de cette page, option « Enregistrer l’image sous »).

  • Cliquez sur l’icône 
  • Dans la fenêtre de Propriétés, double-cliquez sur « Picture » et pointez vers votre image. Validez
  • Si votre image n’apparaît pas intégralement dans votre zone d’image, double-cliquez sur la propriété PictureSizeMode et testez les différentes options une à une.
  • Si vous ne souhaitez pas rajouter de bordure autour de votre image, double-cliquez sur la propriété BorderStyle et sélectionnez la première option « 0-fmBorderStyleNone ».

Tester la boîte de dialogue

  • Pour visualiser la boîte de dialogue, cliquez  puis sur le bouton Bouton  de la barre d’outils ou appuyez sur F5.
  • Pas mal non ? Reste cependant à finaliser un dernier point : notre boîte de dialogue s’intitule « Userform1 » et nous allons remédier à ce petit inconvénient.
  • Pour refermer la boîte de dialogue, cliquez sur la case « x » : les boutons « valider » et « Annuler » ne fonctionnent pas… encore du moins, car nous ne leur avons pas associé de code !
  • Une fois votre boîte refermée, sélectionnez votre Userform en cliquant sur la barre de titre bleue de la boîte de dialogue. Dans la fenêtre de propriétés, champ « Caption », saisissez « Renseignements utilisateur ».
  • Testez à nouveau votre boîte de dialogue… et sauvegardez !

Insérer du code : bouton « annuler »

Le code du bouton Annuler étant extrêmement limité, nous allons commencer par le traiter.

  • Dans votre UserForm, double-cliquez sur le bouton que vous avez intitulé « Annuler »
  • Le texte suivant apparaît :

Que doit-il se passer si l’utilisateur clique sur ce bouton « annuler » ? La boîte de dialogue doit simplement se refermer. L’instruction Visual Basic correspondante est unload nom_de_la_feuille.

  • Placez-vous entre les deux lignes de code et saisissez « Unload Userform1 »
  • Testez à nouveau votre UserForm en cliquant sur F5 et sur le bouton « Annuler ». Cette fois, tout devrait fonctionner…

Insérer du code : bouton « Valider » – Positionner le curseur dans le document Word

Nous entamons là la partie la plus complexe et la plus longue de notre code.

Voici le détail des opérations que nous allons devoir accomplir :

  • Récupérer le contenu de chacune de nos zones de texte.
  • Insérer ce contenu dans notre document grâce à nos signets.
  • Refermer la boîte de dialogue.
  • Positionner notre curseur au début de notre lettre pour que l’utilisateur puisse compléter le corps de la lettre.

Ouf !

Tout d’abord, pour insérer le code, vous l’aurez deviné, il vous faut double-cliquer sur le bouton « valider ».

Vous obtenez les deux lignes de code suivantes :

Fonction Placez votre point d’insertion entre ces deux lignes.

S’agissant de notre première boîte de dialogue, nous allons faire simple et récupérer les données telles que, sans les reformater, en partant du principe que l’utilisateur les ait saisies correctement. Nous veillerons au cours des leçons suivantes à améliorer et optimiser ce code.

Positionner le curseur dans le document Word

Nous avons défini, en page 2, différents signets dans notre document Word. Reprenez ou imprimez cette liste.

Nous allons déplacer notre curseur sur chacun de ses signets et y insérer le contenu de notre boîte de dialogue.

Vous avez sans doute noté que nous n’avons créé qu’un seul signet pour l’adresse alors qu’elle comporte plusieurs lignes : nous traiterons ce cas vers la fin de cette leçon. Let’s go, ce n’est pas très compliqué !

La syntaxe pour atteindre un signet Word est la suivante :

selection.goto([What], [Which], [Count], [Name] as range)

Encore une fois, faisons simple et ne nous embarrassons pas de détails inutiles (nous ne sommes pas des programmeurs chevronnés… pour l’instant !).

La syntaxe minimale dont nous aurons besoin est selection.goto,,, »nom_du_signet ».

Pour notre signet « date », cela donnera donc selection.goto,,, »date ». Insérez cette ligne de code et double-cliquez sur « Userform » dans la fenêtre Projets, puis appuyez sur F5 pour lancer la macro. Déplacez la boîte de dialogue : votre curseur est bien placé derrière « Paris, le « . Appuyez sur le bouton « Cancel » et revenez dans l’éditeur de code et double-cliquez à nouveau sur le bouton « valider ».

Voici le reste des instructions à saisir (faites un copier-coller dans Word si vous le souhaitez) :

Private Sub ok_Click()
Selection.GoTo , , , « date »
Selection.GoTo , , , « vosref »
Selection.GoTo , , , « nosref »
Selection.GoTo , , , « objet »
Selection.GoTo , , , « pj »
Selection.GoTo , , , « salutation1 »
Selection.GoTo , , , « salutation2 »
Selection.GoTo , , , « signataire »
Selection.GoTo , , , « titre »
Selection.GoTo , , , « debut »
End Sub

Pour l’instant, nous n’avons fait que déplacer notre curseur aux différents signets. Nous allons apprendre à présent, àinsérer le contenu de notre boîte de dialogue.

Insérer du code : bouton « valider » – insérer le contenu de la boîte de dialogue

Nous l’avons vu précédemment dans notre petit cahier des charges, après avoir atteint chaque signet, il nous faut insérer le contenu de la boîte de dialogue correspondant.

Par exemple, à l’emplacement du signet « date », nous devons insérer le contenu du contrôle de notre UserForm que nous avons appelé « datel ».

Idem pour le signet « vosref », nous allons insérer le contenu de la zone de texte de notre UserForm que nous avons nommée « vosref » et ainsi de suite.

Pour insérer du texte, la syntaxe est on ne peut plus simple :

selection.InsertAfter nom_du_contrôle

Ce qui nous donne, pour la date, selection.InsertAfter datel
Placez cette ligne de code sous la ligne Selection.GoTo , , , « date » en insérant une ligne supplémentaire.

Principe : on atteint le signet, on insère le texte. On atteint le signet, on insère le texte, etc. Il va donc falloir insérer une instruction selection.InsertAfter après chaque ligne selection.goto.

Notre code sera donc :

Private Sub ok_Click()
Selection.GoTo , , , « date »
Selection.InsertAfter datel
Selection.GoTo , , , « vosref »
Selection.InsertAfter vosref
Selection.GoTo , , , « nosref »
Selection.InsertAfter nosref
Selection.GoTo , , , « objet »
Selection.InsertAfter objet
Selection.GoTo , , , « pj »
Selection.InsertAfter pj
Selection.GoTo , , , « salutation1 »
Selection.InsertAfter salutation
Selection.GoTo , , , « salutation2 »
Selection.InsertAfter salutation
Selection.GoTo , , , « signataire »
Selection.InsertAfter signataire
Selection.GoTo , , , « titre »
Selection.InsertAfter titre
Selection.GoTo , , , « debut »
End Sub

Remarques :

Signets « salutation1 » et « salutation2 » : le contenu de ces deux signets est identique, à savoir le contenu de la zone de texte que nous avons appelée « salutation ».

Signet « debut » : on ne fait que positionner le curseur au début du corps de la lettre, avant de rendre la main à l’utilisateur.

A présent, occupons-nous du cas particulier de l’adresse.

Insérer du code : bouton « valider » – insérer un retour chariot dans Word

Une adresse s’écrit sur plusieurs lignes.
Nous aurions fort bien pu définir autant de signets que de lignes mais il est plus simple -nous verrons plus tard pourquoi- d’insérer des retours chariot à l’aide de code.

Dans le cas qui nous occupe, nous devons récupérer, dans l’ordre, les valeurs des contrôles suivants:

societe – contact – rue1 – rue2 – cp – ville

L’adresse est égale à tous ces contrôles, « additionnés » ou plutôt concaténés (mis bout à bout) et séparés par un retour chariot ou un espace (cp et ville).

Si le « + » est le symbole de l’addition, & s’emploie pour concaténer des chaînes de caractères.

Le changement de ligne (retour chariot) s’écrit quant à lui chr(10) et l’insertion d’un espace se fait à l’aide de 2 guillemets séparés par un espace  » « .

En langage clair, nous pourrions écrire notre adresse comme ceci (rc = retour chariot) :

adresse = societe + rc + contact + rc + rue1 + rc + rue2 + rc + cp + un espace + ville

Si nous remplaçons la ligne ci-dessous par les équivalents visual basic, nous obtenons donc :

adresse = societe & chr(10) & contact & chr(10) & rue1 & chr(10) & rue2 & chr(10) & cp &  »  » & ville

Il ne nous reste plus qu’à atteindre le signet « adresse » et à insérer dans notre code la syntaxe ci-dessus. Ce qui nous donne, au final :

Private Sub ok_Click()
Selection.GoTo , , , « date »
Selection.InsertAfter datel
Selection.Goto , , , « adresse »
Selection.InsertAfter societe & chr(10) & contact & chr(10) & rue1 & chr(10) & rue2 & chr(10) & cp &  »  » & ville
Selection.GoTo , , , « vosref »
Selection.InsertAfter vosref
Selection.GoTo , , , « nosref »
Selection.InsertAfter nosref
Selection.GoTo , , , « objet »
Selection.InsertAfter objet
Selection.GoTo , , , « pj »
Selection.InsertAfter pj
Selection.GoTo , , , « salutation1 »
Selection.InsertAfter salutation
Selection.GoTo , , , « salutation2 »
Selection.InsertAfter salutation
Selection.GoTo , , , « signataire »
Selection.InsertAfter signataire
Selection.GoTo , , , « titre »
Selection.InsertAfter titre
Selection.GoTo , , , « debut »
End Sub

Pour l’heure, il nous reste encore à résoudre 2 problèmes fondamentaux pour que cette macro soit totalement opérationnelle : refermer la boîte de dialogue (elle reste affichée, même après un clic sur le bouton valider) et son lancement (pour l’instant, nous la lançons à travers l’éditeur, ce qui n’est pas l’idéal…).

Rassurez-vous : le plus dur est fait et vous le constaterez, les deux dernières étapes ne vous prendront pas plus de 5 minutes…

Refermer la boîte de dialogue

Vous l’avez constaté : si nous renseignons notre boîte de dialogue et cliquons sur le bouton « Valider », les informations sont bien insérées dans notre document Word… mais la boîte de dialogue reste affichée.

Il faut donc insérer une ultime instruction dans notre code pour résoudre cet épineux problème. Faisons court et simple :unload me (ou unload Userform1) est notre instruction. Le code final est donc :

Private Sub ok_Click()
Selection.GoTo , , , « date »
Selection.InsertAfter datel
Selection.Goto , , , « adresse »
Selection.InsertAfter societe & chr(10) & contact & chr(10) & rue1 & chr(10) & rue2 & chr(10) & cp &  »  » & ville
Selection.GoTo , , , « vosref »
Selection.InsertAfter vosref
Selection.GoTo , , , « nosref »
Selection.InsertAfter nosref
Selection.GoTo , , , « objet »
Selection.InsertAfter objet
Selection.GoTo , , , « pj »
Selection.InsertAfter pj
Selection.GoTo , , , « salutation1 »
Selection.InsertAfter salutation
Selection.GoTo , , , « salutation2 »
Selection.InsertAfter salutation
Selection.GoTo , , , « signataire »
Selection.InsertAfter signataire
Selection.GoTo , , , « titre »
Selection.InsertAfter titre
Selection.GoTo , , , « debut »
Unload me
End Sub

Passer par l’éditeur vb pour lancer la macro n’est pas commode ni à la portée de tous. Il existe forcément une alternative que je vous invite à découvrir.

Lancer la macro à l’ouverture du modèle

Nous souhaitons qu’à chaque création d’un nouveau document basé sur le modèle, la macro se lance automatiquement.

Il nous faut donc rattacher l’apparition de la boîte de dialogue à l’ouverture du modèle :

  • Sélectionnez la fenêtre « Projet »
  • Double-cliquez sur « ThisDocument »
  • Dans la fenêtre de code, dans la liste déroulante « (Général) », sélectionnez « Document ». Par défaut, cela affiche la procédure « Private sub document_New ».
  • La procédure document_new se déclenche lorsque l’utilisateur crée un nouveau document basé sur un modèle. C’est donc bien de cette dernière dont nous avons besoin.
  • Il ne nous reste plus qu’à faire apparaître la boîte de dialogue à l’écran pour que l’utilisateur puisse la remplir. Cette action s’accomplit grâce à l’instruction nom_de_la_userform.show. Dans notre cas de figure, c’est donc la syntaxe suivante qu’il faut insérer entre les deux lignes de code : userform1.show.

Le code final est donc :

Private sub Document_New()
Userform1.show
End Sub

Sauvegardez votre macro, refermez l’éditeur et sauvegardez votre modèle.

Il ne vous reste plus qu’à lancer ce dernier à l’aide de la commande « Fichier – Nouveau… ».

Votre macro est à présent totalement opérationnelle.
Pour avoir une idée des améliorations qu’il serait possible de lui apporter ou une suggestion d’exercice, rendez-vous à la conclusion.

Conclusion

Certes, cette leçon a été particulièrement longue, mais à l’issue de cette dernière, vous devriez être en mesure de créer vos propres boîtes de dialogue personnalisées.

Pas convaincu(e) ? Essayez ! Je vous invite à créer de toutes pièces une petite boîte de dialogue pour le modèle de fax. N’oubliez pas de définir vos signets à l’intérieur du document Word… Voici une suggestion de présentation :

Au cours des prochaines leçons, nous apprendrons à utiliser d’autres contrôles, telles les listes déroulantes, les cases à cocher.

Nous verrons également comment pré-remplir certaines zones : par exemple, le contrôle datej avec la date du jour formatée ou bien encore la zone signataire avec votre nom…

Vous aurez aussi remarqué que nous avions défini un signet sur la mention « Lettre recommandée avec ar » et que nous n’avons pas encore fait référence à ce dernier : nous avions pour cela besoin des formules conditionnelles que nous ne maîtrisons pas… encore…

Notre macro pêche aussi par le fait que l’utilisateur peut saisir n’importe quel texte dans n’importe quelle zone, par exemple, une suite de nombre ou du texte dans la zone « datej »… ce qui n’est pas trop problématique pour l’instant mais que nous apprendrons à résoudre.

PowerPoint

Comment réaliser un quiz/questionnaire à l’aide des macros

En juin dernier, je vous proposais d’utiliser un petit module pour réaliser un quiz/questionnaire sous PowerPoint. Je vous propose aujourd’hui, une version plus élaborée faisant appel aux macros. La différence ? Cette version permet de calculer le score obtenu et affiche une image contextualisée en fonction du score obtenu. Contrepartie de cette amélioration, un sujet bien plus complexe à maîtriser !
Quelques explications, plus bas dans la page, sous les vidéos.
Dans la partie présentation du quiz, je parle d’un bouton Fin qu’on ne retrouve pas dans la vidéo : après réflexion, j’ai préféré attacher le code correspondant (initialisation des variables) au bouton Commencer.

 

La création de ce quiz se déroule en deux temps :

  • phase 1 : élaboration du questionnaire
  • phase 2 : rédaction du code et tests correctifs;

L’élaboration du questionnaire

Les diapositives composant le questionnaire ne présentent aucune difficulté particulière : il s’agit de simples dias dans lesquelles les réponses sont constituées d’images mais vous pourriez vous contenter de zones de textes (il est important de dessiner une zone de texte indépendante par réponse possible) ou même un mixte des deux : une réponse image/une réponse texte !

Comme la structure de la diapositive de test est toujours identique, vous pouvez réaliser un masque spécifique mais cela est optionnel et ne change rien au niveau du code.

Dans la version finale, j’ai préféré dessiner une forme à l’aide des outils de dessin pour Question suivante qu’utiliser le contrôle bouton de la barre développeur car cette option est finalement plus simple à mettre en oeuvre.

La rédaction du code

Les variables

Comme précisé dans la vidéo, j’utilise toujours une combinaison de minuscules/majuscules dans le nom de mes variables ou contrôles.

Je fais référence à ces variables/contrôles dans mon code en les saisissant en minuscules. Ainsi, lorsque je valide ma saisie, je vois immédiatement ceux qui sont mal orthographiés : vba ne modifie pas la graphie, ce qui indique une faute de frappe.

Je fais parfois référence à certains contrôles en indiquant le nom du masque (ex : slidelayout19) quand le même nom de variable existe sur des masques (slidelayout en anglais) différents : ne pas préciser le masque générerait un message d’erreur.

Les propriétés utilisées sont les suivantes :

  • Application.ActivePresentation.SlideShowWindow.View.Next : permet de passer à la diapositive suivante.
  • nomdel’objet.visible : permet d’afficher une image (true) ou non (false).

Le code init() met tous les paramètres à 0 et rend toutes les images visibles.

Le code ScoreFinal est à associer au bouton figurant sur la dernière diapositive de question.

Enfin, j’ai utilisé l’instruction conditionnelle If pour tester le score final. Sa structure est la suivante :

If test then

instructions 

elseif test then

instructions

elseif test then

instructions

else

instructions

end if

 

On peut avoir autant de Elseif qu’il y a de conditions -1 puisque pour la dernière, on utilisera Else.

La version ci-jointe du diaporama est quelque peu différente : la slide de score intermédiaire affiche également la bonne réponse mais je gage que vous auriez su gérer ce point ;-).

Le nom de certains contrôles ont pu être modifiés.

Word

Conversion automatique de guillemets anglais en français (et réciproquement)

Rien de plus fastidieux que de convertir des guillemets anglais en français et réciproquement. Heureusement, les macros sont là pour nous soulager de ces tâches chronophages…

Cette macro m’a paru intéressante dans le cas où l’on est fréquemment écrire des documents en anglais. Elle permet, grâce à une combinaison de touche (Ctrl+Maj+G) de modifier le format des guillemets.

Dans un nouveau document Word, activez la combinaison de touches Alt + F11 et sélectionnez Normal dans la fenêtre Projet, puis Module dans le menu Insertion. Collez cette macro dans la fenêtre vierge qui s’ouvre :

Public Sub LangueGuillemets()
If Options.AutoFormatAsYouTypeReplaceQuotes = False Then
Options.AutoFormatAsYouTypeReplaceQuotes = True
StatusBar = « Guillemets FRANCAIS activés »
Else
Options.AutoFormatAsYouTypeReplaceQuotes = False
StatusBar = « Guillemets ANGLAIS activés »
End If
End Sub

Fermez l’éditeur de macro.

Dans le document Word, activez Fichier, Options, Personnaliser le ruban. Tout en bas, repérez le bouton Personnaliser et cliquez dessus. Dans Catégories, sélectionnez Macros, et LangueGuillemets dans la liste des macros.

Personnaliser ses raccourcis clavier sous Word

Dans le champ Nouvelle touche, appuyez simultanément sur les touches Ctrl+Maj+G.
Acceptez d’enregistrer le nouveau normal.dot.

Remarque Top-Assistante : en anglais, la règle d’écriture de signes de ponctuation varie de l’écriture française. Ainsi, il n’y a aucun espace avant les signes de ponctuation, notamment « : », le « ; », le « ! », le « ? ».

Cette macro devrait également fonctionner sous PowerPoint.

Une contribution de Bugstar

Leçon 2 – Interagir avec l’utilisateur : Inputbox()

Il est temps pour nous d’entrer à présent dans le vif du sujet à travers un exemple concret que nous nous attacherons à améliorer au fil des leçons. Nous allons, dans un premier temps, apprendre à interagir avec l’utilisateur, à l’aide de l’instruction inputbox().

Pour illustrer cette instruction, nous allons renseigner un document type (en l’occurrence une promesse d’embauche), à l’aide de boîtes de dialogue affichant des questions. Les réponses seront insérées dans le document Word à des emplacements marqués par des signets.

Voici les informations à récolter :

  1. genre du destinataire (signets Word : genre et genre2 : genre apparaît à trois reprises dans notre document)
  2. prénom et nom du destinataire (signet : nom)
  3. sa rue (signet : rue)
  4. son code postal et sa ville (signet : ville)
  5. le type de contrat (CDD, CDI) (signet : typecontrat)
  6. sa qualité (sa fonction) (signet : qualite)
  7. son fixe (sa rémunération brute) (signet ; fixe)
  8. son lieu de travail (signet : lieutravail)

Nous allons interroger l’utilisateur 8 fois. Lors d’un prochain exercice nous verrons qu’il est possible de récolter l’ensemble des informations par le biais d’une seule interface entièrement personnalisée mais l’objectif ici est de manipuler la syntaxe Inputbox() que vous devez savoir maîtriser.

La syntaxe Inputbox()

La syntaxe complète est InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Les éléments entre [] sont facultatifs. On en déduit donc que la syntaxe minimale est donc Inputbox(prompt).

Mais pour cet exercice, nous utiliserons 3 arguments :

  • prompt : c’est en fait la question posée à l’utilisateur. Par exemple « Destinataire : Madame, Monsieur, Messieurs… ». Cet argument est OBLIGATOIRE.
  • title : titre de la boîte de dialogue qui s’affiche. Ce pourrait être « Destinataire » pour la question ci-dessus.
  • default est permet de suggérer à l’utilisateur une réponse par défaut. Ex : pour la première question, ce pourrait être « Monsieur ». Cela permet à l’utilisateur de gagner un peu de temps…

Pour les trois derniers paramètres sont peu utilisés et j’avoue ne les avoir jamais utilisé en plus de 10 ans de programmation. C’est dire si vous pouvez vous en passer…

Récupérer les réponses : définir des variables

Ouvrez le document « Promesse.doc » et pressez les touches Alt F11 pour afficher le module de macro.

Nous allons attacher notre macro, non pas à normal.dot mais à Promesse.doc puisque cette macro requiert obligatoirement ce document pour fonctionner.

projet

Positionnez-vous sur le projet PromesseThisDocument et faites un double-clic.

Nommez votre macro « promesse » (faisons simple !) : dans la grande fenêtre de droite, tapez sub promesse et appuyez sur entrée. Le logiciel complète l’instruction avec () et end sub.

Entre ces deux lignes, saisissez la première boîte de dialogue : InputBox(« Destinataire : Madame, Monsieur, Messieurs… », »Destinataire », »Monsieur »)

Nous posons à l’utilisateur une question. C’est donc que nous attendons (en toute logique), une réponse. Nous allons donc affecter une variable à cette réponse. Nous allons la nommer Genre$. Le symbole $ à la fin de la variable indique que le résultat attendu est une chaîne de texte. Attention également à respecter la graphie Majuscules/minuscules.

Pour associer réponse et question, il suffit de saisir :

Genre$=InputBox(« Veuillez saisir le genre du destinataire (Madame, Monsieur) », »Destinataire », »Monsieur »)

 

La structure est donc : variable=inputbox(prompt)

Pour tester votre macro, appuyez sur lecture. Une boîte de dialogue s’affiche à l’écran. Saisissez votre réponse et validez. Il ne se passe rien, tout simplement parce nous n’avons pas encore dit au logiciel quoi faire de la variable !

Insérer la réponse dans un document Word : les signets

Il ne nous reste plus à présent qu’à signifier à Word, étape par étape, les actions à accomplir :

action à accomplir instruction VBA
aller à l’emplacement du signet selection.goto ,,, »signet »
insérer la variable  (réponse) selection.insertafter réponse

et cela pour chacune des 8 questions à poser.

Atteindre un signet : l’instruction .Goto([What], [Which], [Count], [Name])

L’instruction .goto utilise plusieurs arguments optionnels (=ils sont entre crochets).
Voyons à quoi correspondent chacun de ces arguments.

What : indique le type d’élément à atteindre. Il peut s’agir :

  • d’un signet : wdGotoBookmark
  • d’une page : wdGotoPage
  • d’un tableau situé dans la page Word : wdGotoTable
  • d’un objet : wdGotoObject
  • … (pour la liste complète, je vous invite à vous référer à l’aide (mot-clé : Goto)).

Nous souhaitons atteindre un signet. C’est l’argument wdGotoBookmark qui nous intéresse. Cependant, son utilisation est facultative puisque entre crochets et comme il est long et compliqué à écrire, nous allons nous en passer ! Mais si vous êtes puriste, ne vous privez pas de le rajouter.
Nous allons également zapper sur les arguments facultatifs Which et Count.

Par contre, nous allons renseigner l’argument Name qui va contenir le nom du signet à atteindre. Le premier signet est genre (cf. tout en haut du didacticiel). Le nom du signet doit être saisi entre «  ».

Pour atteindre le signet genre, nous tapons donc Selection.GoTo , , , « genre ». De la même façon, pour atteindre le signet ville, nous utiliserons la syntaxe Selection.Goto ,,, « ville » et ainsi de suite.

Remarque : vous aurez noté la présence de ,,, dans la syntaxe ci-dessus. Lorsqu’un argument optionnel est omis, on doit néanmoins matérialiser son emplacement par une virgule, sauf en fin d’instruction. Si nous avions écrit Selection.GoTo, « genre » VBA aurait associé « genre » au champ What et renvoyé un message d’erreur (« genre » ne fait pas partie de la liste des réponses autorisées pour le champ What).

Notre syntaxe se présente donc pour l’instant comme ceci :

sub promesse()
Genre$=InputBox(« Destinataire : Madame, Monsieur, Messieurs… », »Destinataire », »Monsieur »)
Selection.GoTo , , , « genre »
end sub

Lancer la macro  lecture. Il y a un léger progrès : le curseur se déplace à l’emplacement du premier signet. Il nous reste maintenant à insérer la réponse de l’utilisateur dans le texte.

Insérer du texte : l’instruction selection.Insertafter

C’est la plus simple des instructions de cette leçon : il suffit de taper : Selection.InsertAfter nom_de_la_variable.

Ex : pour insérer la variable Destinataire$, il faut donc taper :

Selection.InsertAfter Genre$

Voici donc le code tel qu’il se présentera jusqu’à la variable 4 de notre mini cahier des charges. A vous de tenter de compléter la suite…

Sub promesse()
Genre$ = InputBox(« Genre=InputBox(« Destinataire : Madame, Monsieur, Messieurs… », »Destinataire », »Monsieur »)
Selection.GoTo , , , « genre »
Selection.InsertAfter Genre$ &  »  » —> Remarque : &  »  » permet d’insérer un espace entre le titre et le nom du destinataire, faute de quoi l’ensemble serait accolé.
Selection.GoTo , , , « genre2 »
Selection.InsertAfter Genre$
Nom$ = InputBox(« Prénom et NOM du destinataire »)
Selection.GoTo , , , « nom »
election.InsertAfter Nom$
Rue$ = InputBox(« Adresse du destinataire »)
Selection.GoTo , , , « Rue »
Selection.InsertAfter Rue$
Ville$ = InputBox(« Code postal et VILLE »)
Selection.GoTo , , , « ville »
Selection.InsertAfter Ville$
End Sub

Vous calez ? Voici la solution pour la fin du code

TypeContrat$ = InputBox(« Type de contrat », , « Contrat à durée indéterminée »)
Selection.GoTo , , , « typecontrat »
Selection.InsertAfter TypeContrat$
Qualite$ = InputBox(« Fonction occupée »)
Selection.GoTo , , , « qualite »
Selection.InsertAfter Qualite$
Fixe$ = InputBox(« Montant de la rémunération brute mensuelle »)
Selection.GoTo , , , « fixe »
Selection.InsertAfter Fixe$
LieuTravail$ = InputBox(« Lieu de travail », , « Paris »)
Selection.GoTo , , , « lieutravail »
Selection.InsertAfter LieuTravail$
End Sub

Quelques remarques :
Le programme pose une question à l’utilisateur, déplace le curseur dans le texte et insère la réponse. Puis il recommence pour chacune des 7 autres questions.
Nous aurions tout aussi bien pu grouper toutes les questions en début de programme puis procéder ensuite à l’insertion de l’ensemble des variables. Le résultat eut été identique.

Il ne vous reste plus qu’à sauvegarder notre code, à refermer l’éditeur VBA et à affecter une icône à notre macro pour pouvoir y accéder aisément (veillez à bien attacher cette icône au document Promesse et non à normal.dot)

Au cours de cette leçon, nous avons appris

  • à interroger l’utilisateur (InputBox)
  • à affecter les réponses à une variable
  • à se déplacer dans le document Word à l’aide des signets et de l’instruction Selection.Goto
  • à insérer du texte dans un document Word à l’aide de l’instruction Selection.InsertAfter

Vous êtes donc en mesure à présent :

  • d’adapter cette macro à d’autres documents : contrats, modèle de lettre, entête de télécopie (n’oubliez pas de définir vos signets Word dans votre document !).

Mine de rien, nous avons donc parcouru un grand chemin lors de cette deuxième leçon.

Lors d’une prochaine leçon, nous verrons comment simplifier encore un peu ce code. Et, pourquoi pas, comment créer nos propres boîtes de saisie !

 

Télécharger fichier exemple

 

Leçon 1 – macros, VBA : quelles différences ?

Macros, VBA… Pour beaucoup de néophytes, ces expressions sont similaires. Pourtant, elles recouvrent des différences bien réelles, notamment en matière de complexité et d’interaction avec l’utilisateur…

Toutes deux toutefois sont destinées à automatiser des tâches répétitives.

 

Macro
Programmation vba
Définition La macro consiste à enregistrer une série d’actions faites par un utilisateur. L’utilisateur ne rédige aucun code. L’enregistreur de macro se charge de tout. Le VBA (visual basic pour applications) est un langage de programmation destiné aux débutants. Le programme est rédigé de manière séquentielle par le développeur.
Interaction avec l’utilisateur Aucune : la macro restituera les manipulations enregistrées, sans aucune possibilité de modification. Totale : c’est l’utilisateur qui interagit par le biais de boîtes de dialogue affichées par le programme.
Type de programme Linéaire : la macro est exécutée dans son intégralité, depuis le début jusqu’à la fin, sans interruption ou changement. Événementielle : le programme évolue en fonction des choix de l’utilisateur (clic sur un bouton, sélection dans une liste, valeur saisie au clavier…)
Difficulté de mise en oeuvre Très facile Complexe
Compétences requises Aucune Logique, rigueur, patience.
Notions d’anglais souhaitables.

Dans la pratique, la macro est peu souvent utilisée en raison de ses limites. L’enregistreur de macros s’avère en revanche particulièrement judicieux pour simplifier l’écriture d’un programme VBA. Son utilisation permet alors de garantir la bonne syntaxe du code. Et un gain de temps appréciable…

Votre première macro

Même s’il est possible d’accéder aux macros par le biais du ruban Affichage, il est plus confortable, d’utiliser l’onglet Développeur. Si ce dernier n’est pas installé sur votre ruban, activez le menu FichierOptionsPersonnaliser le ruban, et cochez la case Développeur dans la partie droite de votre écran.

Pour ce premier exercice, nous allons concevoir une macro qui appellera un modèle de document sous Word ou Excel.

Pour ce tutoriel, vous avez donc besoin d’un modèle quelconque de document enregistré dans le répertoire Modèles d’Office. Au pire, sauvegardez un document vide avec l’extension .dotm. ou .xlxm.

macroA présent, commençons !

Dans l’onglet Développeur, sélectionnez l’icône Enregistrer une macro.

Suivant que vous utilisez Word ou Excel, la boîte de dialogue suivante varie quelque peu :

Boite Enregistrer une macro Word

macro2

Dans la zone Nom de la macro (1), saisissez un nom pour votre macro. Celui-ci ne doit pas comporter d’accent, ni d’espace.

Word vous permet ensuite d’affecter la macro en cours à un bouton (ruban ou barre d’accès rapide) ou encore à un raccourci clavier (2). Ces 2 propositions sont optionnelles. Vous pouvez n’en choisir aucune.

Word vous propose ensuite d’enregistrer votre macro dans normal.dotm (3), ce qui rendra la macro accessible sous n’importe quel document Word (fortement recommandé), ou dans Document1. Si vous sélectionnez cette option, la macro ne fonctionnera que dans le document en cours de création.

Ensuite, vous pouvez, dans le champ Description, saisir quelques lignes pour expliquer l’objet de votre macro. Ce champ est optionnel.

Boite Enregistrer une macro Excel

macro3

Dans la zone Nom de la macro (1), saisissez un nom pour votre macro. Celui-ci ne doit pas comporter d’accent, ni d’espace.

Il vous est ensuite proposé d’affecter la macro en cours à  un raccourci clavier (2). Même si, a priori, Excel, contrairement à Word, ne permet pas d’affecter une macro à une icône, cela est tout à fait envisageable et sera développé dans un article ultérieur, Personnaliser votre interface Office. Le champ Touche de raccourci est optionnel.

Excel vous propose ensuite d’enregistrer votre macro dans le classeur de macros personnelles (3), ce qui rendra la macro accessible sous n’importe quel document Excel (fortement recommandé). Vous pouvez tout aussi bien enregistrer la macro dans un Nouveau classeur ou Ce classeur mais dans ces deux cas, attention : vous ne pourrez utiliser votre macro que dans le document où elle aura été créée.

Enfin, vous pouvez, dans le champ Description, saisir quelques lignes pour expliquer l’objet de votre macro. Ce champ est optionnel.

Après avoir complété votre boîte de dialogue, et validé, le bouton Démarrer l’enregistrement est modifié en Arrêter l’enregistrement et le bouton Suspendre l’enregistrement devient accessible.

Ouvrez alors le modèle de document que vous souhaitez. Il s’affiche à l’écran. Cliquez sur Arrêter l’enregistrement.Votre macro est à présent terminée.

Bien sûr l’intérêt de cette macro est plus que limité… mais vous savez à présent utiliser l’enregistreur de macro. Passons à présent à la vitesse supérieure !

L’interface VBA

Je vous invite à présent à découvrir et paramétrer l’interface de l’éditeur VBA.

Pour accéder à ce dernier, appuyez sur Alt F11 ou activez l’onglet Développeur et cliquez sur l’icône Visual Basic,

Une nouvelle interface apparaît, dans un onglet séparé de votre barre des tâches.

macro4
L’éditeur Visual Basic est scindé en 2 zones :

  • A gauche, la zone Projet. Y figurent la liste des documents ouverts (ici, Normal.dotm, Document1 et Document2).
  • A droite, la zone de code.

Si vous avez enregistré votre macro dans Normal.dotm (Word) ou dans le classeur de macros personnelles (Excel), procédez comme suit pour afficher le code de votre macro :

  • Sous Word, localisez Normal dans la zone projet et déroulez l’arborescence.
  • Déroulez ensuite Modules : votre macro devrait figurer dans ce répertoire.
  • Cliquez sur votre macro pour afficher le contenu dans la fenêtre de droite.
  • Sous Excel, localisez Personal.xlsb et déroulez l’arborescence.
  • Déroulez ensuite Modules : votre macro devrait figurer dans ce répertoire.
  • Ccliquez sur votre macro pour afficher le contenu dans la fenêtre de droite.

Votre macro se présente peu ou prou comme sur l’illustration ci-dessus.

Un programme VBA démarre (quasi) toujours par l’instruction Sub (1) suivi du nom de votre macro et de () et se termine par l’instruction End Sub (4)
Les lignes vertes (2) commençant par un apostrophe indiquent un commentaire (ici la description de votre macro si vous avez pris la peine de renseigner ce champ ou un texte par défaut, dans le cas contraire).

Vient ensuite le code (3). Vous noterez la présence en fin de ligne du signe _ . Il indique simplement que l’instruction a été coupée et se poursuit sur la ligne suivante. Il équivaut à un « trait d’union » pour un texte classique…

Vous noterez que les instructions sont rédigées en anglais :

Documents.Add Template:= « C:\Users\Nadège Guilbert\Documents\Modèles Office personnalisés\avec macros\telecopie.docm », NewTemplate:=False, DocumentType:=0

Bien sûr, ce code vous parait encore hermétique et c’est normal. Mais rassurez-vous : le visual basic est comme une langue étrangère : il se maîtrise progressivement !

Onglet Développeur : comment l’installer

Que vous souhaitiez utiliser les macros, rédiger un programme VBA ou bien encore utiliser les fonctions de formulaire de Word ou Excel, vous aurez besoin d’installer l’onglet Développeur, ce dernier ne figurant pas par défaut sur le ruban.

La procédure est identique quel que soit le logiciel Office utilisé. Elle est à effectuer une fois pour toutes pour chacun d’entre eux.

  • Cliquez en premier lieu sur l’onglet Fichier ;
  • Options ;
  • Cliquez sur Personnaliser le ruban ;
  • Dans la colonne de droite, repérez Développeur et activez la case.
  • Validez.

afficher l'onglet developpeur

L’onglet Développeur figure dorénavant dans le ruban.