« Macros-commandes VBA/Procédures et événements automatiques » : différence entre les versions

Contenu supprimé Contenu ajouté
m Orth., Typo., remplacement: à été → a été, typos fixed: c'est à dire → c'est-à-dire, , → , (2), . A → . À , A → À , que A → qu'A avec AWB
Ligne 51 :
 
À titre de curiosité, voyons à quoi une telle macro pourrait bien ressembler :
<sourcesyntaxhighlight lang="vb">
 
Private Sub Worksheet_Change (ByVal Target As Range)
Ligne 58 :
End if
End Sub
</syntaxhighlight>
</source>
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 ?".
 
Ligne 94 :
 
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 :
<sourcesyntaxhighlight lang="vb">
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
</syntaxhighlight>
</source>
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.
 
Ligne 166 :
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.
<sourcesyntaxhighlight lang="vb">
Private Sub Workbook_Open()
Dim Msg As String
Ligne 176 :
End If
End Sub
</syntaxhighlight>
</source>
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.
 
Ligne 185 :
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.
<sourcesyntaxhighlight lang="vb">
Private Sub Workbook_Open()
Dim Cnt As Long
Ligne 193 :
MsgBox "Ce classeur a été ouvert " & Cnt & " fois."
End Sub
</syntaxhighlight>
</source>
 
=== 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 :
<sourcesyntaxhighlight lang="vb">
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Msg As string
Ligne 209 :
End If
End Sub
</syntaxhighlight>
</source>
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).
 
Ligne 220 :
 
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é.
<sourcesyntaxhighlight lang="vb">
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
Sheets("Feuil1").Range("A1").Value =_
Sheets("Feuil1").Range("A1").Value + 1
End Sub
</syntaxhighlight>
</source>
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.
<sourcesyntaxhighlight lang="vb">
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
If SaveAsUI Then
Ligne 236 :
End If
End Sub
</sourcesyntaxhighlight>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 ==
Ligne 275 :
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.
 
<sourcesyntaxhighlight lang="vb">
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
Target.Font.Bold = Not Target.Font.Bold
Cancel = True
End Sub
</syntaxhighlight>
</source>
 
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.
Ligne 289 :
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 :
 
<sourcesyntaxhighlight lang="vb">
Private Sub Worksheet_Activate()
MsgBox "Vous venez d'activer la feuille "& ActiveSheet.Name
En Sub
</syntaxhighlight>
</source>
 
Voici un autre exemple qui rend la cellule A1 courante chaque fois qu'une feuille est activée :
 
<sourcesyntaxhighlight lang="vb">
Private Sub Worksheet_Activate()
Range("A1").Activate
End Sub
</syntaxhighlight>
</source>
 
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é :
 
<sourcesyntaxhighlight lang="vb">
Private Sub Worksheet_Activate()
MsgBox "Vous devez rester dans Feuil1."
Sheets("Feuil1").Activate
End Sub
</syntaxhighlight>
</source>
 
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 vaut mieux profiter de ces possibilités pour aider vos utilisateurs à se servir correctement de votre application.
Ligne 318 :
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.
 
<sourcesyntaxhighlight lang="vb">
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Ligne 328 :
End If
End Sub
</syntaxhighlight>
</source>
 
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.