IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Philippe Tulliez

VBA - Excel - Macros complémentaires - Les procédures événementielles

Noter ce billet
par , 19/12/2020 à 18h05 (2217 Affichages)
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
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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()

Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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

Nom : Event Process - VBE ThisWorkbook (Liste déroulante gauche).png
Affichages : 937
Taille : 3,9 Ko

et dans la liste de droite, les événements liés à l'objet application

Nom : Event Process - VBE ThisWorkbook (Liste déroulante droite).png
Affichages : 915
Taille : 26,2 Ko


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
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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

Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog Viadeo Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog Twitter Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog Google Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog Facebook Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog Digg Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog Delicious Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog MySpace Envoyer le billet « VBA - Excel - Macros complémentaires - Les procédures événementielles » dans le blog Yahoo

Mis à jour 25/09/2023 à 12h38 par Philippe Tulliez

Catégories
VBA Excel , Add-In

Commentaires

  1. Avatar de pipout64
    • |
    • permalink
    Bonsoir Philippe,
    Je vous remercie pour votre tuto même si je n'ai pas réussi à le mettre en œuvre.
    Mis à jour 20/03/2024 à 12h31 par pipout64