VBA : événement renommage, déplacement ou suppression de feuille

dionys0s

XLDnaute Impliqué
Bonjour le forum,

bon bah presque tout est dans le titre. Je souhaite capter les événements renommage, déplacement ou suppression d'onglet.
J'ai à peu près piger qu'il fallait jongler entre les événements Workbook_SheetActivate et Workbook_SheetDeactivate mais je lutte pas mal. J'ai à peu près réussi à capter l'événement suppression, et encore...

D'avance merci pour votre aide :)
 
Dernière édition:

dionys0s

XLDnaute Impliqué
Re : VBA : événement renommage, déplacement ou suppression de feuille

Re,

je laisse tomber l'événement renommage de feuille. Pas besoin en fait.
Pour le reste, j'ai pondu ce bout de code (dans le module ThisWorkbook), au sujet duquel votre avis m'intéresse.

D'avance merci :)

VB:
Private PrevCount As Long, PrevIndex As Long, PrevCodNam As String

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

  If PrevCount = 0 Or PrevIndex = 0 Or PrevCodNam = vbNS Then
    PrevCount = Sh.Parent.Sheets.Count: PrevIndex = Sh.Index: PrevCodNam = Sh.CodeName
  Else
    If PrevCount > Sh.Parent.Sheets.Count Then 'du code (suppression)
  End If: PrevCount = Sh.Parent.Sheets.Count: PrevIndex = Sh.Index: PrevCodNam = Sh.CodeName

End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

  If PrevCount = 0 Or PrevIndex = 0 Or PrevCodNam = vbNS Then
    PrevCount = Sh.Parent.Sheets.Count: PrevIndex = Sh.Index: PrevCodNam = Sh.CodeName
  Else
    If Sh.Parent.Sheets(PrevIndex).CodeName <> PrevCodNam Then 'du code (permutation)
  End If: PrevCount = Sh.Parent.Sheets.Count: PrevIndex = Sh.Index: PrevCodNam = Sh.CodeName

End Sub
 

dionys0s

XLDnaute Impliqué
Re : VBA : événement renommage, déplacement ou suppression de feuille

Re,

Je continue mon monologue dans le vide.

Modification du code comme suit :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)

  If ChgStruct(Sh, True) Then 'mon code

End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

  If ChgStruct(Sh, False) Then 'mon code

End Sub

Private Static Function ChgStruct(ByRef Wks As Excel.Worksheet, ByVal Actv As Boolean) As Boolean

  Dim Count As Long, Index As Long, Name As String

  If Actv Then ChgStruct = Count <> 0 And Count > Wks.Parent.Sheets.Count Else _
    If Index <> 0 And Name <> vbNS Then ChgStruct = Wks.Parent.Sheets(Index).CodeName <> Name
  Count = Wks.Parent.Sheets.Count: Index = Wks.Index: Name = Wks.CodeName

End Function
Suppression donc des variables du module. Juste une fonction Static.
 

job75

XLDnaute Barbatruc
Re : VBA : événement renommage, déplacement ou suppression de feuille

Bonjour dionys0s,

Dans les problèmes où les actions ne sont pas des évènements VBA on peut utiliser l'artillerie lourde :

Code:
Dim marche As Boolean 'mémorise

Sub Lancer()
With ActiveSheet.DrawingObjects("Bouton 1")
  marche = .Text = "Marche"
  .Text = IIf(.Text = "Arrêt", "Marche", "Arrêt")
End With
Application.OnTime 1, "Espion"
End Sub

Sub Espion()
If Not marche Then Exit Sub
Dim n%, nom$, id%, t
With ActiveSheet
  n = Sheets.Count
  nom = .Name
  id = .Index
  t = Timer + 0.5
  While Timer < t
    DoEvents
    If Sheets.Count > n Then _
      MsgBox "'" & ActiveSheet.Name & "' ajoutée...", , "Feuille": GoTo 1
    If Sheets.Count < n Then _
      MsgBox "'" & nom & "' supprimée...", , "Feuille": GoTo 1
    If .Index <> id Then _
      MsgBox "'" & nom & "' déplacée...", , "Feuille"
    If .Name <> nom Then _
      MsgBox "'" & nom & "' renommée en '" & .Name & "'...", , "Feuille"
 Wend
End With
1 Espion
End Sub
Fichier joint.

A+
 

Fichiers joints

Dernière édition:

dionys0s

XLDnaute Impliqué
Re : VBA : événement renommage, déplacement ou suppression de feuille

Re le forum,
bonjour job75

Euh alors c'est beau... Bon ça ne détecte pas l'événement renommage losque je clique droit sur un onglet non sélectionné (pas l'activesheet), mais c'est pas bien grave.
Ceci dit j'aimerais bien savoir pourquoi ça fonctionne... Comment en fait. C'est quoi DoEvents ? Un conseil sur une page qui explique bien ? C'est pas dangereux comme méthode ? Pas moyen de bouffer beaucoup de ressources avec ça ? De faire ramer des classeurs un peu lourds qui contiennent beaucoup de code ? Toute sorte d'interrogation quoi...
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : VBA : événement renommage, déplacement ou suppression de feuille

Re,

Bon ça ne détecte pas l'événement renommage losque je clique droit sur un onglet non sélectionné (pas l'activesheet), mais c'est pas bien grave.
Pas compris car le clic droit sur un onglet le sélectionne avant d'ouvrir le menu contextuel.

DoEvents permet de faire des actions dans le classeur (clic sur le bouton, activation de feuilles) même quand la macro tourne.

A+
 

job75

XLDnaute Barbatruc
Re : VBA : événement renommage, déplacement ou suppression de feuille

Bonjour dionys0s, le forum,

C'est pas dangereux comme méthode ? Pas moyen de bouffer beaucoup de ressources avec ça ?
Chaque fois que la macro Espion s'exécute un élément est ajouté à la pile.

Pour comprendre ajouter une MsgBox avant le End Sub et faire tourner la macro quelques secondes :

Code:
1 Espion
MsgBox "a"
End Sub
Même au bout d'une journée il n'y aura que 2 x 86400 End Sub exécutés après l'instruction :

Code:
If Not marche Then Exit Sub
Pour qu'ils ne s'exécutent pas on peut utiliser :

Code:
If Not marche Then End
Cela n'a guère d'importance.

Bonne journée.
 

job75

XLDnaute Barbatruc
Re : VBA : événement renommage, déplacement ou suppression de feuille

Re,

En testant l'espace pile je me suis rendu compte que ses possibilités sont limitées.

Ici environ 3000 itérations sont acceptées, c'est assez peu.

Alors tout simplement il ne faut pas créer de pile :

Code:
Sub Espion()
Dim n%, nom$, id%, t
1 If Not marche Then Exit Sub
With ActiveSheet
  n = Sheets.Count
  nom = .Name
  id = .Index
  t = Timer + 0.5
  While Timer < t
    DoEvents
    If Sheets.Count > n Then _
      MsgBox "'" & ActiveSheet.Name & "' ajoutée...", , "Feuille": GoTo 1
    If Sheets.Count < n Then _
      MsgBox "'" & nom & "' supprimée...", , "Feuille": GoTo 1
    If .Index <> id Then _
      MsgBox "'" & nom & "' déplacée...", , "Feuille"
    If .Name <> nom Then _
      MsgBox "'" & nom & "' renommée '" & .Name & "'...", , "Feuille"
 Wend
End With
GoTo 1
End Sub
Fichier (2).

A+
 

Fichiers joints

Dernière édition:

dionys0s

XLDnaute Impliqué
Re : VBA : événement renommage, déplacement ou suppression de feuille

Bonjour job75,
bonjour le forum

merci beaucoup job75 pour ces précisions et ajouts.
Concernant le coup du clic droit, c'est très probablement dû au fait que j'utilise Excel 2011 (mac)
 

Discussions similaires


Haut Bas