Cliquer sur le lien https://www.developpez.net/forums/bl...categoryid=624, pour voir tous mes billets concernant les macros complémentaires (Add-In) (xlam)
PREAMBULE
Nous allons aborder dans ce billet des procédures événementielles d'un classeur XLAM
Lorsque l'on développe une application en plaçant l'ensemble des procédures dans un classeur XLAM, il est important de pouvoir intercepter des événements se déroulant dans d'autres classeurs comme par exemple
- l'ouverture d'un classeur (nouveau ou existant)
- la sélection d'une feuille
- la sélection d'une cellule
- etc.
Les procédures évènementielles permettent l'interaction entre notre application et l'utilisateur.
Nous pouvons ainsi intercepter le chargement ou la désinstallation de la macro complémentaire contenant ces procédures mais également des événements se produisant sur les autres classeurs.
Ces procédures événementielles doivent être placées dans le module ThisWorkbook du classeur des macros complémentaires
PROCEDURES NATIVEMENT PRESENTES DANS LE MODULE ThisWorkbook
Private Sub Workbook_AddinInstall()
Se déclenche lors du chargement (installation) de la macro complémentaire qui contient cette procédure évènementielle.
Exemple
1 2 3
| Private Sub Workbook_AddinInstall()
MsgBox "Installation de la macro complémentaire " & Me.Name
End Sub |
Private Sub Workbook_AddinUninstall()
Se déclenche lorsque la macro complémentaire contenant cette procédure est désinstallée
PROCEDURES INTERCEPTANT DES EVENEMENTS D'AUTRES CLASSEURS OUVERTS
Préalable
Pour pouvoir intercepter des événements se déroulant dans d'autres classeurs ouverts (XLSX, XLSM ou XLSB), nous allons créer un gestionnaire d'événement au niveau de l'application Excel
Pour créer ce gestionnaire, nous devons utiliser les étapes de base suivantes :
- Déclarer en tête de module une variable publique pour l’objet application à l’aide du mot clé WithEvents
- Assigner l'objet application à la variable déclarée dans la procédure événementielle Private Sub Workbook_Open()
1 2 3 4 5 6
| Option Explicit
Public WithEvents appXls As Excel.Application
Private Sub Workbook_Open()
Set appXls = Excel.Application
End Sub |
Dès que la déclaration est faite, nous pouvons constater dans la liste déroulante de gauche de l'éditeur VBA que notre variable apparait
et dans la liste de droite, les événements liés à l'objet application
Quelques procédures
Private Sub appXls_NewWorkbook(ByVal Wb As Workbook)
L'argument
Wb représente le classeur qui s'ouvre
S'enclenche à l'ouverture d'un nouveau classeur mais pas ceux basés sur un modèle
Exemple de l'affichage d'un message à l'ouverture d'un nouveau classeur
1 2 3
| Private Sub appXls_NewWorkbook(ByVal Wb As Workbook)
MsgBox "Ouverture d'un nouveau classeur", Title:=Me.Name
End Sub |
Private Sub appXls_WorkbookOpen(ByVal Wb As Workbook)
L'argument
Wb représente le classeur qui s'ouvre
Cet évènement permet de déclencher une procédure lors de l'ouverture de tout classeur, même ceux qui sont cachés en ce compris les
XLAM,
PERSONAL.XLSB) et également un nouveau classeur basé sur un modèle
Exemple d'un message qui affiche le nom du classeur à son ouverture
1 2 3
| Private Sub appXls_WorkbookOpen(ByVal Wb As Workbook)
MsgBox "Ouverture du classeur " & Wb.Name
End Sub |
Exemple qui affiche le nom du classeur qui s'ouvre sauf s'il est suffixé
XLAM ou s'il se nomme
PERSONAL.XLSB et un autre message si le classeur (nouveau) qui s'ouvre est basé sur un modèle.
1 2 3 4 5 6 7 8 9
| Private Sub appXls_WorkbookOpen(ByVal Wb As Workbook)
If StrComp(Right(Wb.Name, 4), "xlam", vbTextCompare) <> 0 _
And StrComp("Personal.xlsb", Wb.Name, vbTextCompare) <> 0 _
And Len(Wb.Path) > 0 Then
MsgBox "Ouverture du classeur " & Wb.Name, Title:=Me.Name
Else
If Len(Wb.Path) = 0 Then MsgBox "Ouverture d'un nouveau classeur basé sur un modèle", Title:=Me.Name
End If
End Sub |
Private Sub appXls_SheetActivate(ByVal Sh As Object)
L'argument
Sh représente la feuille activée
Cet événement est déclenché à l'a suite de l'activation d'une feuille
Exemple de l'affichage du nom de la feuille et du classeur si l'on active la feuille dont le
CodeName est
shtHome du classeur dont le
CodeName est
wkbInvoice
1 2 3 4 5 6 7
| Private Sub appXls_SheetActivate(ByVal Sh As Object)
With Sh
If .CodeName = "shtHome" And .Parent.CodeName = "wkbInvoice" Then
MsgBox "Vous avez sélectionné la feuille " & .Name & " du classeur nommé " & .Parent.Name, Title:=Me.Name
End If
End With
End Sub |
Private Sub appXls_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Les arguments
Sh correspond à la feuille active
Target correspond à la cellule sur laquelle on a fait un double clic.
Cancel désactive l'action associée au double clic (évite ainsi d'édition dans la cellule)
Cet événement est déclenché à la suite d'un double clic dans une cellule
Exemple d'un message qui s'affiche si l'on fait un double clic dans une cellule se trouvant dans la zone des données (
DataBodyRange) d'un tableau structuré (objet
ListObject) nommé
t_Stock et ce quel que soit le classeur et la feuille active
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Private Sub appXls_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim Rng As Range
Dim Flag As Boolean
On Error Resume Next
Set Rng = Range("t_Stock")
Flag = Err.Number = 0
On Error GoTo 0
If Flag Then
If Not Intersect(Rng, Target) Is Nothing Then
MsgBox "Vous avez sélectionné la cellule " & Target.Address _
& vbCrLf & " de la feuille : " & Target.Worksheet.Name _
& vbCrLf & " du classeur : " & Target.Worksheet.Parent.Name, Title:=Me.Name
Cancel = True
End If
End If
Set Rng = Nothing
End Sub |
BILLETS PRECEDENTS SUR LE MÊME SUJET