Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Application.CommandBars("Cell").Reset
Dim Compteur%
With Application.CommandBars("Cell")
With .Controls.Add(msoControlPopup, , , 1, True)
.Caption = "Aller à l'onglet ..."
For Compteur = ThisWorkbook.Sheets.Count To 1 Step -1
If ThisWorkbook.Sheets(Compteur).Visible And Not ThisWorkbook.Sheets(Compteur).Name = Sh.Name Then
With .Controls.Add(Type:=msoControlButton, Before:=1)
.Caption = ThisWorkbook.Sheets(Compteur).Name
.FaceId = 350
.OnAction = ThisWorkbook.Name & "!'Thisworkbook.Select_Feuille " & Chr(34) & .Caption & Chr(34) & "'"
End With
End If
Next Compteur
End With
.Controls(2).BeginGroup = True
End With
End Sub
Private Sub Select_Feuille(Nom_Feuille$)
Sheets(Nom_Feuille).Select
End Sub
Private Sub Workbook_Deactivate()
Application.CommandBars("Cell").Reset
End Sub
Bonjour job75@Yeahou puisqu'il y a la macro Workbook_Deactivate la macro Workbook_BeforeClose n'est pas nécessaire.
on enlève le reset du before_rightclick et on le met dans la sub select_feuille
le menu sera toujours a jour et pas la peine de se soucier de garder la barre à la fermeture (aucun autre event n'est utile )
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim i%
With Application.CommandBars("Cell")
.Reset
With .Controls.Add(msoControlPopup, , , 1, True)
.Caption = "Aller à l'onglet ..."
For i = 1 To ThisWorkbook.Sheets.Count
If ThisWorkbook.Sheets(i).Visible And Not ThisWorkbook.Sheets(i).Name = Sh.Name Then
With .Controls.Add(Type:=msoControlButton)
.Caption = ThisWorkbook.Sheets(i).Name
.FaceId = 350
.OnAction = ThisWorkbook.Name & "!'Thisworkbook.Select_Feuille " & Chr(34) & .Caption & Chr(34) & "'"
End With
End If
Next i
End With
.Controls(2).BeginGroup = True
.ShowPopup
.Reset
Cancel = True
End With
End Sub
Private Sub Select_Feuille(Nom_Feuille$)
Sheets(Nom_Feuille).Select
End Sub
ça, par contre, c'est pas mal et ça fonctionne bien sans l'event déactivate.on le showpopup tout simplement avant de le reset directement dans le beforerightclick
et on cancel pour ne pas avoir le popup 2 fois
en gros on l'utilise comme un popup perso
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim i%
With Application.CommandBars("Cell")
.Reset
With .Controls.Add(msoControlPopup, , , 1, True)
.Caption = "Aller à l'onglet ..."
For i = 1 To ThisWorkbook.Sheets.Count
If ThisWorkbook.Sheets(i).Visible And Not ThisWorkbook.Sheets(i).Name = Sh.Name Then
With .Controls.Add(Type:=msoControlButton)
.Caption = ThisWorkbook.Sheets(i).Name
.FaceId = 350
.OnAction = ThisWorkbook.Name & "!'Thisworkbook.Select_Feuille " & Chr(34) & .Caption & Chr(34) & "'"
End With
End If
Next i
End With
.Controls(2).BeginGroup = True
.ShowPopup
MsgBox "la feuille " & ActiveSheet.Name & " a été activé" & " donc la sub déja fait son job" ' ici on a le message APRES!!!!!!!!! QUE LA SUB AI ACTIVE LA FEUILLE
.Reset
Cancel = True
'juste pour tester voir quel est le 1er control de la commandbar cell"
MsgBox "le 1er control de la commandbar Cell est """ & Application.CommandBars("Cell").Controls(1).Caption & """ "
End With
End Sub
Private Sub Select_Feuille(Nom_Feuille$)
Sheets(Nom_Feuille).Select
End Sub
Re,quelle est l'utilité de .Controls(2).BeginGroup = True ?
no pb, je n'ai rien pris pour une critique , je suis pour toutes les alternatives ...Bonjour le fil, le forum
@fanch55 , ne vois aucune critique dans ce que j'ai dit, il s'agit simplement de façons de faire différentes. Ce qui m'intéressait dans ce problème était de faire un menu le plus light possible sans utiliser un autre module que ThisWorkbook. Ta solution est tout à fait valable et a toute sa place dans cette discussion.
Bien cordialement, @+
re@patricktoulon quelle est l'utilité de .Controls(2).BeginGroup = True ?
A priori si on supprime cette instruction ça ne change rien...
si mais sur les versions récentes de excel on vois pas le trait de séparation du menu