Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA Worksheet_Activate() à l'ouverture du classeur

Dudu2

XLDnaute Barbatruc
Bonjour les Excellents,
Excel a jugé bon de ne pas déclencher l'évènement Worksheet_Activate() sur la feuille affichée / activée à l'ouverture du classeur.
Ce n'est pas une très bonne idée de mon point de vue car cela empêche par exemple d'exécuter un traitement préalable à l'affichage d'une feuille.

J'utilise le subterfuge suivant (voir fichier):
VB:
'Code Workbook:
'--------------
Private Sub Workbook_Open()
    Application.EnableEvents = False
    ActiveCell.Offset(1).Select
    Application.EnableEvents = True
    ActiveCell.Offset(-1).Select
End Sub

'Code Worksheet:
'---------------
Private ProcessOnFirstDisplayDone As Boolean

Private Sub Worksheet_Activate()
    If Not ProcessOnFirstDisplayDone Then MsgBox "ProcessOnFirstDisplayDone"
    ProcessOnFirstDisplayDone = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not ProcessOnFirstDisplayDone Then Call Worksheet_Activate
End Sub

La question est: existe-t-il une méthode plus simple ?

Cordialement.
 

Pièces jointes

  • Classeur1.xlsm
    15.8 KB · Affichages: 13
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ah oui ok. Merci @sylvanu. Je ne savais pas clairement qu'on pouvait appeler une fonction d'un module d'une feuille en la rendant Public. Même si sa portée déclarative reste évidemment limitée au module de la feuille, ce qui permet de faire la même manip dans toutes les feuilles sans avoir de référence en double. Intéressant !

Donc si on ne veut pas modifier les déclarations automatiques des Sub d'évènements on peut faire bien plus simple que la proposition initiale:
VB:
'Code Workbook:
'--------------
Private Sub Workbook_Open()
    Call ActiveSheet.Workbook_Open
End Sub

'Code Worksheet:
'---------------
Public Sub Workbook_Open()
    Call Worksheet_Activate
End Sub

Private Sub Worksheet_Activate()
   MsgBox "Worksheet_Activate " & Me.Name
End Sub
 
Dernière édition:

Jacky67

XLDnaute Barbatruc
Bonjour @Jacky67,
Feuil2.Activate: Feuil1.Activate
Bien sûr. Mais il faut au moins 2 feuilles au classeur. Je ne connais pas à priori le nombre de feuilles du classeur.
RE..
Alors en créer une et la masquer
VB:
Private Sub Workbook_Open()
    On Error Resume Next
    Sheets("tmp").Activate
    If Err <> 0 Then Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "tmp"
    Sheets("tmp").Visible = False
    Feuil1.Activate
End Sub
 

Pièces jointes

  • Classeur1.xlsm
    15.2 KB · Affichages: 3

Jacky67

XLDnaute Barbatruc
Merci @Jacky67 pour ta proposition qui évite d'avoir à déclarer une fonction dans les feuilles.
Donc il y a 2 options au choix. Quel luxe !
Re..
Si tu optes pour cette solution, la procédure peut-être réduite à ceci
VB:
Private Sub Workbook_Open()
    On Error Resume Next
    Sheets("tmp").Activate
    If Err <> 0 Then Sheets.Add.Name = "tmp": Err = 0
    Sheets("tmp").Visible = False
    Feuil1.Activate
End Sub
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
438
Réponses
32
Affichages
965
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…