• Aucun résultat trouvé

[PDF] Débuter la programmation avec Visual Basic pour Applications | Cours informatique

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Débuter la programmation avec Visual Basic pour Applications | Cours informatique"

Copied!
24
0
0

Texte intégral

(1)

Introduction

Le langage ou code VBA contient différentes entités : des données, des modules, des classes, des structures, des instructions, des objets, des procédures, des fonctions, … Ces entités représentées par des lignes de texte s’organisent de façon purement hiérarchique

 les classeurs contiennent des projets (1 projet par classeur)

 les projets contiennent les modules de code, de classe, de feuille, ou de formulaire, regroupés par catégories

 les modules contiennent des directives, des déclarations, des fonctions, des procédures

 les procédures et fonctions contiennent des instructions (lignes de code)

Les contenants de code VBA

Le code VBA est saisi et stocké dans 2 types de récepteurs sous un format uniquement textuel : des feuilles et des modules

 Feuille : objet Excel accueillant les procédures particulières à une feuille de calcul Excel, cet objet contient le plus souvent des procédures et fonctions concernant des objets s’appliquant à lui-même.

 Module de code standard : objet VBA accueillant les procédures générales, le plus souvent contiennent des fonctions dites "utilitaires".

 Module formulaire : objet VBA contenant les procédures événementielles propres au formulaire traité. Il peut également contenir des procédures générales (à éviter). Ex : une procédure de traitement de date serait stockée dans un module standard pour pouvoir être utilisée dans tous les formulaires concernés.

 Module de classe : objet VBA contenant les données et procédures pour un objet (on parle alors de propriétés et de méthodes). Ex : un objet compte en banque qui décrit ses données (mouvement, solde, …) et les opérations sur ses données (retrait, dépôt, virement, …).

Les données des experts

Les variables

Les variables permettent de stocker toutes sortes de données et de faire évoluer les valeurs notamment lors de l’utilisation de boucles. Les variables sont généralement déclarées en début de procédure puisqu’une variable doit être définie avant d’être utilisée.

Nom Type Détail

Byte Numérique Nombre entier de 0 à 255

(2)

Long Numérique Nombre entier de -2'147'483'648 à 2'147'483'647

Currency Numérique Nombre à décimal fixe de -992'337'203'685'477.5808 à 992'337'203'685'477.5807

Single Numérique Nombre à virgule flottante de -3.402823E38 à 3.402823E38

Double Numérique Nombre à virgule flottante de -1,79769313486232D308 à 1,79769313486232D308

String Texte Texte

Date Date Date et heure

Boolean Boolean True (vrai) ou False (faux)

Object Objet Objet Microsoft

Variant Tous Tout type de données (type par défaut si la variable n’est pas déclarée)

Une variable est définie selon l’utilisation que l’on va en faire. Le type de variable choisi était auparavant fondamental au niveau de la mémoire utilisée par l’ordinateur, mais de nos jours ce problème n’est plus d’actualité car les ordinateurs ont de grandes mémoires.

Les nombres spéciaux VBA

Définition : les nombres sont des variables contenant des chiffres et des séparateurs décimaux, il y a 2 types expert de nombres

 Entier Long : Long  Booléen : Boolean

Dim monNombre As Boolean monNombre est une variable destinée à contenir des nombres booléens(par exemple "0")

Les tableaux VBA

Définition : les tableaux sont des variables contenant d'autres variables de même type Dim monTableau(10) As String monTableau est un tableau contenant 10 éléments dont le type est une chaîne de caractères.

(3)

Définition : les constantes intégrées sont fournies par les applications OFFICE (Word, Excel, …) ou le langage Visual Basic :

Si la constante commence par vb alors c’est une constante intégrée à VBA Si la

constante commence par xl alors c’est une constante intégrée à EXCEL Si la constante commence par wd alors c’est une constante intégrée à WORD …

Exemple : vbCrLf = retour à la ligne mais on ne peut pas écrire vbCrLf = Chr(13) + Chr(14)

Les mots clés des experts

Les mots-clés des experts permettent de programmer des problématiques délicates ou complexes

Exemple : ReDim, Static, Do, Loop, Break, On, Continue, Set, etc.

Les objets experts de la bibliothèque Excel

Les objets des experts permettent de programmer des problématiques délicates ou complexes

Exemples : Workbooks, Worksheets, Sheets, Rows, Columns, Object, Windows, Font , Interior , Offset, Calendar, Charts, Names, CommandBars, UserForms, ...

Les objets classeurs

Ouvrir un fichier avec trois feuilles déjà remplies pour y exécuter la macro :

Sub Feuilles()

Dim Source, Destination As Excel.Workbook Set Source = ActiveWorkbook

' Création Workbooks.Add

Workbooks.Add After:=Sheets(Sheets.count) ' à la fin Set Destination = ActiveWorkbook

' Copie d'une cellule dans un autre classeur

Destination.Sheets(1).Cells(1, 1) = Source.Sheets(1).Cells(1, 1) ' Avec bordures

Destination.Sheets(1).Cells(1, 2) = Source.Sheets(1).Cells(1, 2).Value ' Sans bordure

' Copie d'une feuille

Source.Sheets(1).Copy After:=Sheets(1) ' Copie d'une feuille dans un autre classeur

Source.Sheets(1).Copy After:=Destination.Sheets(1) ' Déplacement d'une feuille dans un autre classeur Source.Sheets(1).Move After:=Destination.Sheets(1) ' Suppression

Source.Sheets(1).Delete

' Parcourir toutes les feuilles d'un fichier For Each workheets In ActiveWorkbook.Worksheets

(4)

MsgBox workheets.Name Next

End Sub

Les objets feuilles

Il faut définir une première plage, sur laquelle trier une deuxième :

Sub classer()

' Tri sur la colonne C, du tableau AJ

Plage1 = "C" & EnteteLigne & ":C" & LigneFin Plage2 = "A" & EnteteLigne & ":J" & LigneFin With ActiveWorkSheet.Sort

.SortFields.Clear

.SortFields.Add Key:=Range(Plage1), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal .SetRange Range(Plage2) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

Les objets cellules

Ici on simule un copier-coller :

' Copie de la première case dans la deuxième Range("A1") = Range("B1")

' ou

Cells(1,1) = Cells(1,2) ' ou

Range("A1").copy Range("B1").paste Range("A2:C10").copy

Cells(l, c).Font.Size = 10 ' Taille du texte Cells(l, c).Font.Bold = True ' Mise en gras

Cells(l, c).HorizontalAlignment = xlCenter ' Alignement Cells(l, c).Font.Color = vbBlack ' Couleur de la police ' ou

(5)

Cells(l, c).Font.Colorindex = 2

Cells(l, c).Interior.ColorIndex = 4 ' Couleur de la cellule Cells(l, c).Numberformat("$#,##0.00") ' Format monétaire

Remarque

La commande .copy partage son presse papier avec l'utilisateur. Donc si la personne fait un copié-collé pendant que la macro tourne, il y aura des interférences.

For Each c In ActiveCell.CurrentRegion.Cells Cells(x + c.Row, y + c.Column).value = c.value Next c

Remarque

Le problème du copy/paste est qu’il utilise le même presse-papier que l'utilisateur. Il suffit donc de changer de cellule manuellement (ou de copier du texte) pour que les données du programme lui échappent. La solution consiste ici à balayer les cellules une par une

Les objets lignes

Sub Lignes()

' Insertion d'une ligne 2 vierge Rows(2).Insert

' Insertion après la ou les cellules sélectionnées Selection.EntireRow.Insert

' Suppression Rows(2).Delete

' Copie de toutes les lignes jusqu'à la fin du tableau en cours ActiveCell.CurrentRegion.Copy

' Duplique la ligne L juste en dessous Rows(L + 1).Insert Shift:=xlDown Rows(L).Copy

Rows(L + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

End Sub

Les objets colonnes

Sub Colonnes()

' Insertion colonne 2 Columns(2).Insert

' Insertion après la ou les cellules sélectionnées Selection.EntireColumn.Insert

(6)

' Suppression Columns(2).Delete End Sub

Les objets liens

La macro suivante placée dans une feuille crée automatiquement un hyperlien à chaque fois que l’on tape un mot dans une de ses cellules, vers sa définition du Wiktionnaire : Private Sub Worksheet_Change(ByVal Target As Range)

If Not IsNull(Target.Cells) And Not IsEmpty(Target.Cells) And TypeName(Target.Cells) = "Range" And Len(Trim(Target.Cells)) > 0 Then ActiveSheet.Hyperlinks.Add Anchor:=Target.Cells, _

TextToDisplay:=Target.Cells.Value, _

Address:="https://fr.wiktionary.org/w/index.php?title=" & Target.Cells.Value

End If End Sub

Les objets Word

La macro suivante placée dans une feuille ouvre automatiquement un fichier Word et écrit une nouvelle phrase :

Sub Edition()

dim ObjetWord as object

Set ObjetWord = CreateObject("Word.Application") ObjetWord.Visible = True

'Ouverture d'un fichier existant

ObjetWord.Documents.Open App.Path & "\document.docx" 'Création d'un nouveau fichier

ObjetWord.Documents.Add

'Ajout de texte ObjetWord.Selection.TypeText Text:="Texte écris." ObjetWord.Selection.TypeText "J'écris une nouvelle phrase depuis

EXCEL sur WORD."

ObjetWord.Selection.TypeText Text="J'écris une nouvelle phrase depuis EXCEL sur WORD."

'Sauvegarder NomDuDocumentWord.Save 'Imprimer ObjetWord.PrintOut 'Quitter ObjetWord.Quit End Sub

(7)

Les objets Outlook

La fonction createitem de l’objet Outlook génère les différentes entités du logiciel[1] : 1. createitem(0) : un mail.

2. createitem(1) : un RDV. 3. createitem(2) : un contact. 4. createitem(3) : une tâche. 5. createitem(4) : un journal. 6. createitem(5) : une note. 7. createitem(6) : un post.

L'exemple ci-dessous envoi un email contenant un hyperlien et une pièce jointe :

Sub EnvoyerMail()

Dim Outlook, Message As Object

Set Outlook = CreateObject("Outlook.Application") Set Message = ObjOutlook.createitem(0)

With Message

.To = "moi@domaine.com"

.Subject = "Lien vers le cours de VBA"

.HTMLBody = "Bonjour,<br />Voici le lien vers le cours de VBA : <br /><A

HREF=""http://fr.wikiversity.org/wiki/Visual_Basic"">"ici"</A>.<br />Cordialement." .Attachments.Add (cheminPJ) .Display (True) .Send End With End Sub

Les objets ActiveX

On peut facilement insérer dans une feuille de calcul Excel ou dans une feuille Word divers objets (des "contrôles")comme

 des boutons :

 des boutons d'options, des cases à cocher :

(8)

 des barres de défilement (scrollBar):

 des boutons toupies (SpinButton), des zones de liste, des listes déroulantes :

 des zones de texte (label) :

Il suffit de cliquer sur l’icône "boîte à outils" de la barre d’outils VBA (ou bien Affichage / Barres d’outils / Commandes), de sélectionner le contrôle souhaité et de de le glisser via la souris à l’endroit désiré.

On peut également utiliser tous ces "contrôles" dans une boite de dialogue (Userform) que l’on peut créer dans VBA par formulaire / Userform, puis faire apparaître à

l'exécution d'une macro par: Userform("truc").Show et disparaître par Userform("truc").Hide.

Les procédures et les fonctions expertes

Usages complexes

 Les paramètres ou arguments  Les fonctions prédéfinies VBA

 Disponibilité des fonctions VBA sous Excel  Les fonctions récursives

Les arguments des procédures

Définition : les arguments passés aux procédures sont aussi nommés paramètres, ce sont des valeurs nécessaires au traitement de la procédure. Exemple : après l'appel de la procédure ⇒ afficherMessageCible "ToiKeuJème", le résultat affiché à l’écran est : "Bonjour à ToiKeuJème"

Sub afficherMessageCible (cible As String) MsgBox "Bonjour à " & cible

End Sub

Les arguments et le résultat des fonctions

Définition : les arguments passés aux fonctions fonctionnent comme pour les

procédures, le résultat est rangé sous le nom de la fonction. Exemple : après l'appel de la fonction ⇒ monBenefice = calculerBenefice(150,100), la variable monBenefice prend la valeur 150

Function calculerBenefice(recettes As Double, depenses As Double) As Double

calculerBenefice = recettes - depenses End Function

(9)

Les instructions de débranchement

Les instructions conditionnelles complexes

Exemple

If Range("E8").Value = "20" Then MsgBox "MILLE BRAVO !!!"

Else if Range("E8").Value > "10" MsgBox "PETIT BRAVO !!!" Else MsgBox "PAS BRAVO DU TOUT !!!"

End If

⇒ L'exemple affiche "MILLE BRAVO !!!" si la valeur de la cellule E8 est 20 sinon affiche "PETIT BRAVO !!!" si la valeur de la cellule E8 est supérieure à 10, sinon affiche "PAS BRAVO DU TOUT !!!"

Les instructions de distinctions de cas

Cette instruction est utilisée lorsque le nombre de cas à tester(comme ci-dessus) devient important rendant difficiles les instructions employant des conditionnelles imbriquées (if...if...)

Selon une valeur de variable

En cas d'une valeur alors effectuer un traitement

En cas d'une autre valeur alors effectuer un autre traitement Dans tous les autres cas alors effectuer le traitement encore un autre traitement

Fin Selon

Exemple

Select Case Range("E8").Value

Case 20 : MsgBox "MILLE BRAVO !!!" Case > 10 : MsgBox "PETIT BRAVO !!!" Case else : "PAS BRAVO DU TOUT !!!" End Select

⇒ Selon la valeur de la cellule E8 l'exemple affiche soit "MILLE BRAVO !!!" soit "PETIT BRAVO !!!" soit "PAS BRAVO DU TOUT !!!"

Impossible de placer plusieurs conditions après un case. Par exemple Case False and False peut très bien être considéré à tort comme Case True.

(10)

Les boucles non bornées le plus souvent utilisées sont les boucles de type « « While … Wend » », elles permettent de répéter un nombre de fois indéfini au départ un bloc d'instructions, elles utilisent une condition qui est testée au début de chaque répétition.

La boucle While / Wend

L'instruction While Wend répète une action tant qu'une condition est vraie.

While [condition] [actions]

Wend

Si la condition est vraie, les actions indiquées dans la procédure sont effectuées. Quand l'instruction Wend est atteinte, la procédure revient sur l'instruction While et la condition est de nouveau vérifiée. Si la condition est toujours vraie, le processus est répété. Si la condition est fausse, l'exécution passe directement à la première ligne de code qui suit l'instruction Wend.

Exemple

' L'exemple colorie l'intérieur de toutes les cellules non vides de la colonne A en violet

While not isEmpty(cellule) ligne = ligne + 1

cellule = Range("A1").Offset(ligne - 1) cellule.Interior.Color = RGB(255, 0, 255)

'La boucle s'arrête lorsque la cellule en cours est vide Wend

La boucle Do While / Loop

Cette boucle fonctionne de la même manière que While Wend (tant que la condition est vraie, la boucle est exécutée) :

Do While [condition] 'Instructions

Loop

La boucle Do / Loop Until

Cette boucle fonctionne de la même manière que While Wend, exceptée la une condition qui est testée à la fin de chaque répétition.

Do [condition] 'Instructions Loop Until

(11)

REGEX

Nécessite de cocher "Microsoft VBScript Regular Expressions 5.5" dans "Outils\Références".

Sur les autres projets Wikimedia :

 « Expression rationnelle » sur Wikipédia  « regex » sur le Wiktionnaire

 « Modèle:Regex » sur Wikibooks

Expressions rationnelles courantes

Caractère Type Explication

. Point n’importe quel caractère

[...] classe de

caractères tous les caractères énumérés dans la classe

[^...] classe

complémentée Tous les caractères sauf ceux énumérés

^ circonflexe marque le début de la chaine, la ligne...

$ dollar marque la fin d'une chaine, ligne...

| barre verticale alternative - ou reconnaît l'un ou l'autre

(...) parenthèse utilisée pour limiter la portée d'un masque ou de l'alternative

* astérisque 0, 1 ou plusieurs occurrences

+ le plus 1 ou plusieurs occurrence

(12)

 .Test() : renvoie vrai si le pattern est trouvé dans la chaine.

 .Execute() : renvoie toutes les positions du pattern dans un tableau.  .Replace() : remplace le pattern par le paramètre deux.

Recherche

Obtenir les emplacements dans une chaine :

Sub RegexRecherche() Dim RegEx As RegExp Set RegEx = New RegExp

Dim matches As IMatchCollection2 Dim match As Variant

With RegEx

.IgnoreCase = True

.Global = True 'True matches all occurances, False matches the first occurance

.Pattern = "[0-9]+"

Set matches = .Execute("1 test 2 regex") End With

For Each match In matches

MsgBox ("Position : " & match.FirstIndex) Next

' ou

MsgBox matches.Item(0).Value End Sub

Extraire un mot

Public Sub RegexExtraction() Dim RegEx As RegExp Set RegEx = New RegExp With RegEx

.IgnoreCase = True .Global = False

.Pattern = "[a-z]* Wikibooks" End With

chaine$ = "Test regex VB pour Wikibooks francophone." Set matches = RegEx.Execute(chaine$)

MsgBox (Replace(matches(0).Value, " Wikibooks", "")) ' Affiche : "pour"

End Sub

Remplacement

(13)

Public Sub RegexChaine() Dim RegEx As RegExp Set RegEx = New RegExp With RegEx

.IgnoreCase = True .Global = False

.Pattern = "<.*>(.*)<.*>" End With

chaine$ = "Test regex VB pour <balise1>Wikibooks</balise1> francophone."

chaine$ = RegEx.Replace(chaine$, "$1") MsgBox (chaine$)

' Affiche : "Test regex VB pour Wikibooks francophone." (sans les balises)

End Sub

Exemple

' cet exemple cumule des nombres saisis à chaque tour de boucle par l'utilisateur dans une variable "tresor"

Do

reponse = InputBox("Entrer un nombre entier à cumuler dans votre trésor ")

tresor = tresor + reponse Loop Until reponse = 0

' la boucle s'arrête lorsque la réponse de l’utilisateur est 0

Procédures et événements automatiques

Introduction

Plusieurs moyens permettent d'exécuter une procédure Sub. L'une d'entre elles consiste à faire en sorte qu'elle le soit automatiquement. Dans cette leçon, vous découvrirez tout ce qu’il faut savoir pour exploiter ces fonctionnalités particulièrement puissantes. Nous vous expliquerons comment préparer le terrain pour qu'une macro soit déclenchée lorsqu'un événement se produit.

De quels types d’événements est-il question ici ? C'est une bonne question. Un événement est fondamentalement quelque chose qui se produit dans Excel. Voici quelques exemples :

 l'ouverture ou la fermeture d'un classeur ;  l'activation ou la désactivation d'une fenêtre ;  l'activation ou la désactivation d'une feuille de calcul

(14)

 l'enregistrement du classeur ;  le calcul dans la feuille ;

 un clic sur un objet (un bouton par exemple) ;

 l'appui sur une touche ou sur une combinaison de touches ;  le double clic dans une cellule ;

 la survenance d'une heure du jour particulière ;  une erreur.

La plupart des programmeurs ne se soucient pas de la majorité de ces événements. Vous devez cependant savoir qu’ils existent, car, un jour ou l'autre, ils pourront vous être utiles. Dans cette leçon nous utiliserons les événements les plus communément utilisés. Pour faire simple, nous n'en aborderons que deux : les classeurs et les feuilles de calcul. Au termes de cette leçon vous saurez répondre aux questions suivantes :

 quels sont les événements qui peuvent déclencher une exécution ?  où faut-il placer le gestionnaire d'événement dans le code VBA ?

 comment exécuter une macro à l'ouverture/fermeture d'un classeur ou quand un classeur/feuille de calcul est activé ?

Caractéristiques des procédures d'évènements

Un événement est toujours associé à un objet ou à une collection d'objets spécifique. Nous avons défini une procédure événementielle de niveau "feuille de calcul", attachée à la première feuille du classeur. Si nous voulions que cette procédure se déclenche quand l'utilisateur sélectionne de nouvelles cellules dans n’importe quelle feuille du classeur, il faudrait créer une procédure événementielle de niveau "classeur", s'appliquant à l’ensemble de ses feuilles.

La feuille de calcul représente ici l’objet associé à la procédure événementielle. Il peut s'agir soit d'un objet existant, créé par l'utilisateur, soit d'un objet créé par

programmation.

Sous Excel, il existe cinq types principaux d'objets associés.  Feuille de calcul

 Feuille graphique  Classeur

 Application (instance d'Excel)  Boîte de dialogue (UserForm)

Les quatre premiers types d'objets sont spécifiques à Excel, alors que les UserForms peuvent s'utiliser dans toutes les autres applications (Access, Word...) intégrant VBA. À ces types d'objets, il faut ajouter ceux qui sont créés et définis par programmation par l'intermédiaire de modules de classe.

Pourquoi écrire une procédure d'événement

Laissez nous vous convaincre de l'utilité de ces procédures.

Voici un exemple : supposons que vous ayez un classeur dans lequel vous entrez des valeurs dans la colonne A. Votre chef, un gars très compulsif, vous dit qu’il a besoin de savoir quand chaque nombre a été saisi. Le fait d'entrer des données est un événement, plus précisément un événement appelé Worksheet_Change. Vous pouvez écrire une macro qui réagisse à cet événement. Cette macro sera déclenchée chaque fois que la feuille de calcul est modifiée. Si cette modification a été faite dans la colonne A, elle écrira la date et l’heure dans la colonne B, juste à droite de la cellule qui a été éditée. À titre de curiosité, voyons à quoi une telle macro pourrait bien ressembler :

(15)

Private Sub Worksheet_Change (ByVal Target As Range) If Target.Column = 1 Then

Target.Offset(0, 1) = Now End if

End Sub

Les macro qui répondent à des événement sont très attentives à l'endroit où elles sont enregistrées. Par exemple, cette macro Worksheet_Change doit être placée dans le module de code associé à cette feuille de calcul. Mettez-la ailleurs, et elle ne

fonctionnera pas. Nous allons y revenir un peu plus loin, dans la section "Où placer le code VBA ?".

Attention ! Ce n’est pas parce que votre classeur contient des procédures qui répondent à des événements que celles-ci sont obligatoirement exécutées. Comme vous le savez, il est possible d'ouvrir un classeur dont les macros sont désactivées. Dans ce cas, aucune fonctionnera, événements ou pas. Vous ne devez pas oublier cela lorsque vous créez des classeurs qui sont basés sur des procédures de gestion d’événements.

Comment écrire une procédure d'événement ?

En langage VBA, une procédure de gestion d'événement, ou procédure d'événement, est une procédure qui s'exécute en réponse à un événement. Dont acte. Elle est toujours de type Sub (et non Function). Une fois que vous en aurez assimilé le principe, l'écriture d'une procédure d'événement ne posera pas de problème particulier. La programmation se réduit en effet à ces quelques étapes que nous détaillerons d'ici peu :

1. Identifiez l'événement qui doit déclencher la procédure. 2. Appuyez sur Alt+F11 pour activer l'éditeur VBE.

3. Dans la fenêtre Projet de l'éditeur VBE, double-cliquez sur l’objet approprié listé sous l'intitulé Microsoft Excel Objects. Pour un événement lié au classeur, l’objet est ThisWorkbook. Pour un événement lié à la feuille de calcul, l’objet est un objet de type WorkSheet (comme Feuil1).

4. Dans la fenêtre Code de l'objet, écrivez la procédure d'événement qui devra être exécutée lorsque ledit événement se produira. Cette procédure aura un nom spécial qui l'identifie en tant que procédure d'événement.

Ces étapes vous paraîtrons plus claires en progressant dans cette leçon. .

Il est très important de comprendre où le code de votre gestionnaire d'événement doit être placé. Il doit résider dans la fenêtre Code d'un module Objet. La procédure ne fonctionnerait pas si elle était placée dans un module VBA standard. Et aucun message d'erreur ne viendrait attirer votre attention là-dessus.

(16)

.

Cette image montre la fenêtre VBE avec un projet affiché dans la fenêtre Projet. remarquez que le projet est constitué de plusieurs objets

 Un objet pour chacune des feuilles du classeur (en l’occurrence les trois objets Feuil1).

 Un objet nommé ThisWorkbook.

 Un module VBA inséré manuellement avec la commande Insertion/Module

Double-cliquez sur n’importe lequel de ces objets affiche le code associé à l'élément (s'il existe).

La procédure d'événement doit être écrite dans la fenêtre Code de l'élément

ThisWorkbook (si l'événement concerne le classeur) ou dans l'un des objets Feuil (si l'événement concerne une feuille de calcul ou de graphique). Dans le cas de l'image précédente, il s'agit du classeur, et c’est d'ailleurs la seule procédure qui y soit définie. À nouveau, notez les deux listes déroulantes affichées en haut de la fenêtre Code. Ce sont vos allies.

.

Lors de l'écriture d'une procédure d'événement l'éditeur VBE vous vient en aide en affichant la liste de tous les événements disponibles pour l’objet sélectionné. Quand vous sélectionnez un événement dans la liste de droite, l'éditeur VBE crée automatiquement une procédure d'événement à votre place. C'est tout à fait pratique, puisque vous savez immédiatement quels sont les arguments éventuels à fournir.

Il n'est cependant pas obligatoire d’utiliser les deux listes déroulantes disponibles en haut de la fenêtre Code. Mais c’est une aide précieuse, car la syntaxe du nom d'une

procédure d'événement est d'une importance critique. De plus, l'instruction Sub de certaines procédures d'événement exige un ou plusieurs arguments. Et rien d’autre ne viendra vous rappeler de quoi il s'agit ! Par exemple, Ici, Sh est là si vous avez

sélectionné SheetActivate dans la liste des événements d'un objet Workbook, l'éditeur VBE écrira cette instruction Sub :

(17)

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Ici, Sh est l'argument passé à la procédure. C'est une variable qui représente la feuille dans le classeur ainsi activé. Les exemples de ce chapitres aiderons à éclaircir ce point.

Les événements de classeur

Les événements de classeur (objet Workbook)

Événement Lorsqu’il est déclenché :

Workbook_Activate Le classeur est activé.

Workbook_BeforeClose Le classeur est fermé.

Workbook_BeforePrint Le classeur est imprimé.

Workbook_BeforeSave Le classeur est enregistré.

Workbook_Deactivate Le classeur est désactivé.

Workbook_NewSheet Une nouvelle feuille de calcul est insérée dans le classeur.

Workbook_Open Le classeur est ouvert.

Workbook_SheetActivate Une feuille de calcul du classeur est activée.

Workbook_SheetBeforeRightClick Un clic du bouton droit se produit dans une cellule de la feuille de calcul.

Workbook_SheetBeforeDoubleClick Un double clic se produit dans une cellule de la feuille de calcul.

(18)

Workbook_SheetChange Une cellule du classeur est modifiée.

Workbook_SheetDeactivate Une feuille de calcul du classeur est désactivée.

Workbook_SheetFollowHyperlink Un clic se produit sur un lien hypertexte du classeur.

Workbook_SheetSelectionChange La sélection est modifiée.

Workbook_WindowActivate La fenêtre du classeur est activée.

Workbook_WindowDeactivate La fenêtre du classeur est désactivée.

Workbook_WindowResize La fenêtre du classeur est redimensionnée.

Workbook_Open

L'un des événements les plus communément utilisés est l'événement de classeur Open. Imaginons un classeur que vous utilisez quotidiennement. Dans l'exemple qui va suivre, la procédure Workbook_Open est exécutée chaque fois que le classeur est ouvert. Elle vérifie le jour de la semaine : si c’est vendredi, le code affiche un message de rappel. Private Sub Workbook_Open()

Dim Msg As String

If WeekDay (Now) = 6 then

Msg = "Nous sommes Vendredi. "

Msg = Msg & "Pensez à sauvegarder votre travail." MsgBox Msg

End If End Sub

La fonction WorkBook_Open est exécutée automatiquement chaque fois que le classeur est ouvert. Elle utilise la fonction WeekDay de VBA pour déterminer le jour de la

semaine. Si c’est vendredi (jour 6 chez les Anglo-saxons), un message rappelle à l'utilisateur qu’il doit effectuer sa sauvegarde hebdomadaire. Les autres jours, rien ne se produit.

(19)

Voyons un autre exemple d'utilisation de la procédure Workbook_Open. Elle se sert des fonctions GetSetting et SaveSetting pour mémoriser le nombre de fois où le classeur a été ouvert. La fonction SaveSetting enregistre une valeur dans le Registre de Windows, tandis que GetSetting retrouve cette valeur (voyez le système d'aide pour plus

d'informations à ce sujet). Le code qui suit retrouve ce décompte en consultant le Registre, l'incrémente, puis le sauvegarde à nouveau. L'information, placée dans la variable Cnt, est également affichée à des fins de contrôle.

Private Sub Workbook_Open() Dim Cnt As Long

Cnt = GetSetting("MyApp", "Settings", "Open", 0) Cnt = Cnt + 1

SaveSetting "MyApp", "Settings", "Open", Cnt

MsgBox "Ce classeur a été ouvert " & Cnt & " fois." End Sub

Workbook_BeforeClose

Voyons maintenant la procédure d'événement BeforeClose. Exécutée juste avant que le classeur se ferme, elle est localisée dans la fenêtre code de l’objet ThisWorkbook. Par exemple :

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim Msg As string

Dim Réponse As integer Dim FName As String

Msg = "Désirez-vous sauvegarder ce fichier ?" Réponse = MsgBox(Msg vbYesNo)

If Réponse = vbYes Then

FName = "F\SAUVEGARDES\" & ThisWorkbook.Name ThisWorkbook.SaveCopyAs NomFichier

(20)

End If End Sub

Cette routine affiche une boîte de message demandant à l'utilisateur s'il désire effectuer une copie de sauvegarde du classeur. S'il clique sur le bouton Oui, le code utilise la méthode SaveCopyAs pour enregistrer le fichier sur le lecteur F (le lecteur te le chemin devraient bien sûr être adaptés à votre propre configuration).

Les programmeurs utilisent souvent la procédure Workbook_BeforeClose pour faire le ménage. Par exemple, après avoir modifié une option du classeur (comme masquer la barre d'état, par exemple), il est approprié de la rétablir au moment de quitter le classeur. Ce ménage électronique est typiquement une tâche à confier à la procédure

Workbook_BeforeClose.

Cet événement présente tout de même un inconvénient. Si vous refermez Excel et qu'un fichier ouvert a été modifié depuis la dernière sauvegarde, l’application vous demandera comme d'habitude si vous voulez enregistrer les changements opérés. le fait de cliquer sur le bouton Annuler clôt le processus de fermeture d'Excel. Mais la procédure

Workbook_BeforeClose aura tout de même été exécutée.

Workbook_BeforeSave

L'événement BeforeSave est déclenché avant l'enregistreur d'un classeur. Il se produit lorsque vous utilisez la commande Fichier/Enregistrer ou Fichier/Enregistrer sous.

Placée dans la fenêtre Code d'un objet ThisWorkbook, la procédure suivante démontre la fonctionnement de cet événement. La routine met à jour la valeur de la cellule A1 de Feuil1 chaque fois que le classeur est enregistré. En d'autres termes, la cellule A1 sert de compteur indiquant le nombre de fois que le fichier a été sauvegardé.

Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)

Sheets("Feuil1").Range("A1").Value =_ Sheets("Feuil1").Range("A1").Value + 1 End Sub

Notez que la procédure Workbook_BeforeSave a deux arguments : SaveAsUI et Cancel. Pour comprendre leur fonctionnement, examinez la macro suivante, qui est exécutée avant l'enregistreur du classeur. Elle essaie d'empêcher l'utilisateur de sauvegarder le classeur sous un autre nom. Si celui-ci choisit la commande Fichier/Enregistrer sous, l'argument SaveAsUI est True (vrai).

Lorsque le code est exécuté, il vérifie la valeur de SaveAsUI. Si sa valeur renvoie True, la procédure affiche un message et met Cancel également sur True, ce qui annule l'opérateur de sauvegarde.

Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)

If SaveAsUI Then

MsgBox "vous ne pouvez pas enregistrer de copie de ce classeur !")

Cancel = True End If

(21)

End Sub

En fait, cette procédure n'empêche pas réellement quelqu’un d'enregistrer le classeur sous un nom différent. Il suffit d'ouvrir le classeur avec ses macros désactivées, et le tour est joué. En effet, dans ce cas, toutes les procédures de gestion d’événements sont elles aussi désactivées. Ce qui est parfaitement logique, puisque ce sont aussi des macros...

Les événements de feuille

.

Les événements de feuille (objet Worksheet)

Evénement Lorsqu’il est déclenché :

Worksheet_Activate La feuille est activée.

Worksheet_SheetActivate Une feuille de calcul du classeur est activée.

Worksheet_BeforeRightClick Un clic du bouton droit se produit dans la feuille de calcul.

Worksheet_BeforeDoubleClick Un double clic se produit dans la feuille de calcul.

Worksheet_Deactivate Une feuille de calcul est désactivée.

Worksheet_Calculate La feuille de calcul est recalculée.

Worksheet_Change Une cellule de la feuille de calcul est modifiée.

Worksheet_SelectionChange La sélection est modifiée.

Worksheet_BeforeDoubleClick

Il est possible de définir une procédure VBA qui soit exécutée lorsque l'utilisateur double-clique dans une cellule. Dans l'exemple suivant, stocké dans la fenêtre Code d'un objet Feuil, double-cliquer dans une cellule met son contenu en gras s'il est en caractères maigres, et inversement.

(22)

La procédure WorkSheet_BeforeDoubleClick a deux arguments : Target et Cancel. Target est la cellule (un objet Range) qui est double-cliquée. Si Cancel est sur True, l'action par défaut du double clic ne se produit pas.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)

Target.Font.Bold = Not Target.Font.Bold Cancel = True

End Sub

Notez que Cancel est défini avec la valeur True. Cela empêche l'action par défaut (activer le mode édition de cellule d'Excel) de se produire.

Worksheet_Activate

Excel peut détecter si une feuille est activée ou désactivée et exécuter une macro lorsque l'un ou l'autre de ces événements se produit. Ces procédures d'événement doivent être placées dans la fenêtre Code de l’objet Feuil. Pour accéder rapidement à la fenêtre de code d'une feuille, cliquez droit sur l'onglet de celle-ci et choisissez la

commande Visualiser le code. L'exemple qui suit montre une procédure simple qui est exécutée chaque fois qu'un feuille donnée est activée. Elle ouvre une boîte de message qui affiche le nom de la feuille active :

Private Sub Worksheet_Activate()

MsgBox "Vous venez d'activer la feuille "& ActiveSheet.Name En Sub

Voici un autre exemple qui rend la cellule A1 courante chaque fois qu'une feuille est activée :

Private Sub Worksheet_Activate() Range("A1").Activate

End Sub

Ces exemples sont très élémentaires, mais une procédure d'événement peut être beaucoup plus complexe. La procédure qui suit - stockée dans la fenêtre Code de l’objet Feuil1 - utilise l'événement Deactivate pour empêcher l'utilisateur d'activer toute autre feuille du classeur. Lorsque Feuil1 est désactivée (c'est-à-dire qu'une autre feuille est activée), un message est affiché puis Feuil1 est de nouveau activé :

Private Sub Worksheet_Activate()

MsgBox "Vous devez rester dans Feuil1." Sheets("Feuil1").Activate

End Sub

Pour autant je ne vous conseille pas d’utiliser ce genre de procédure pour essayer de court-circuiter Excel. Cela pourrait être très frustrant et source de confusion pour l'utilisateur d'une part, et d’autre part facile à contourner en désactivant les macros. Il

(23)

vaut mieux profiter de ces possibilités pour aider vos utilisateurs à se servir correctement de votre application.

Worksheet_Change

Un événement Change se produit chaque fois qu'un cellule de la feuille de calcul est modifiée. Dans l'exemple qui suit, la procédure Worksheet_Change empêche effectivement un utilisateur d'entrer une valeur non numérique dans la cellule A1. Ce listing est stocké dans la fenêtre Code de l’objet Feuil.

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then

If Not IsNumeric(Target) Then

MsgBox "Entrez un nombre dans la cellule A1." Range("A1").ClearContents

Range("A1").Activate End If

End If End Sub

L'unique argument de la procédure WorkSheet_Change (Target) représente la plage qui a été modifiée. La première instruction vérifie si l'adresse de la cellule est bien $A$1. Si oui, le code utilise la fonction IsNumeric pour déterminer si elle contient une valeur numérique. Si ce n’est pas le cas, un message apparaît et la valeur de la cellule est effacée. La cellule A1 est ensuite réactivée, ce qui est commode lorsque le pointeur de la cellule s'est déplacé après la saisie. Si une cellule autre que A1 est modifiée, il ne se passe rien.

Pourquoi ne pas utiliser la commande Validation ?

La commande Donnée/Outils de données/Validation des données vous est peut-être familière. C'est une fonction très commode qui permet de s'assurer facilement que les données entrées dans une plage sont bien du type requis. Elle ne met toutefois pas à l'abri de toutes les fausses manœuvres. Pour vous en convaincre, ouvrez une feuille de calcul vierge puis effectuez les étapes suivantes :

1. Sélectionnez la plage A1:C12

2. Ouvrez l'onglet Données, puis cliquez sur le bouton Validation des données dans le groupe Outils des données.

3. Configurez les critères de validation de manière à n'accepter que des nombres entiers entre 1 et 12, comme le montre l'image qui suit

(24)

.

Entrez maintenant des valeurs dans la plage A1:C12. La validation des données fonctionne comme prévu. Mais, pour voir ce qui ne va pas, essayez ceci :

1. Entrez -1 dans n’importe quelle cellule en dehors de la plage de validation. 2. Appuyez sur Ctrl+C afin de placer le nombre négatif dans le Presse papiers. 3. Sélectionnez une cellule dans la plage de validation.

4. Appuyez sur Ctrl+V.

Vous constatez que le collage est autorisé. Examinez la situation de plus près et vous remarquerez que la cellule dans laquelle vous avez collé la valeur négative n'a plus de critère de validation. Le collage l'a effacé !

Le collage efface les données de validation, car, pour Excel, la validation est la même chose qu'une mise en forme de cellule (ou, pour être plus précis, qu'une mise en forme conditionnelle). Elle est considérée au même titre que la police, la couleur au autre attribut. Quand vous collez une cellule, vous remplacez la mise en forme de la cellule de destination par celle de la cellule source. Il en va malheureusement de même pour les critères de validation.

Références

Documents relatifs

Je profite de la publication de l’alphabet dual de cette même roche pour publier également l’avancement de cet alphabet non dual, bien que l’on ne puisse donner

Afin de pouvoir intervenir efficacement auprès des familles ayant un proche hospitalisé pour un TCC, la méthode d’intervention familiale est d’emblée apparue

Comme aucune différence significative n’a été détectée entre ces deux styles, on peut supposer qu’indépendamment du lien que les Arméniens nouent avec la société

Pour conclure, il faut noter l'élégant porche en pans de bois qui présente une charpente de comble voûtée non lambrissée et dont la structure est presque identique

En dépit de l'emploi très précoce du système des pannes, cette charpente présente des archaïsmes très marqués comme la faible pente de la toiture, l'emploi d'assemblages à mi-bois

This research also study the various threat source whether its external sources of threat, or internal, and thus raises the strategic and legal question, what is the role

D Tableau 1: Classification des différentes émotions positives 13 AVOIR AVOIR FAIT FAIRE ÊTRE ÊTRE AVEC Plaisir Satisfaction Enjoyment Joie Fun (Csilcszentmihalyi, 1990; (Podilchak,

La céramique commune claire calcaire comprend vingt et un vases dont des cruches appartenant à trois types : des cruches à lèvre striée (n° 43), des cruches à col mouluré (n° 44)