XL 2013 afficher les onglets du classeur dans menu clic droit

bobinut60

XLDnaute Nouveau
Bonjour,
je suis pas doué en excel mais je cherche une solution en VBA pour atteindre d'un clic droit les différents onglets du classeur actif (la ou je clique).
pourrais avoir votre aide svp?
merci
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re,

L'ami Patrick a raison, c'est plus simple d'utiliser l'événement BeforeRightClick, la liste des feuilles est toujours à jour comme cela, et toujours pas besoin de module standard ou de modifier un module de feuille.

Bien cordialement, @+

VB:
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
 

Pièces jointes

  • Exemple sélection feuille par menu contextuel de la souris V2.xlsm
    19.6 KB · Affichages: 8
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour a tous
meilleurs veux pour cette nouvelles année

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 )
après l'action la barre est d'origine
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
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 )

Bonjour Patrick

Pas vraiment d'accord, on peut faire un clic bouton droit pour autre chose que la sélection d'une autre feuille.
Du coup, le menu contextuel serait créé et resterait actif à la fermeture ou au basculement sur un autre classeur sans l'event déactivate.

Bien cordialement, @+
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Yeahou
exact oupss!!
alors on va faire plus simple
on utilise la méthode des popup perso à la patrick ;)
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

VB:
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
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
re,
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
ça, par contre, c'est pas mal et ça fonctionne bien sans l'event déactivate.
je pense qu'on va avoir du mal à faire plus light et polyvalent.

Bien cordialement, @+
 

fanch55

XLDnaute Barbatruc
Bonjour et bonne année à à tous,

Mon code n'utilise pas le Workbook_SheetBeforeRightClick car sinon cela concernerait toutes les feuilles et je ne suis pas sur que cela soit le but initial.

Le code ne nécessite aucun activate ou déactivate,
la barre créée est une barre temporaire et est immédiatement détruite après affichage ,
du coup on prend en compte à chaque fois les feuilles existantes .

Attention, il peut y avoir deux types de barre contextuelle pour une cellule : Cell et "List Range Popup"
 

patricktoulon

XLDnaute Barbatruc
re
et oui le ShowPopup fait comme si c’était un menu modal

donc ce qui suit "ShowPopup" dans le code est exécuté APRES!!!!! que la sub appelée ai effectué son travail

autrement dit c'est comme si la sub appelée faisait partie a part entière du menu
le reste du code est libéré qu’après

démonstration avec 2 msgbox
regardez bien a quel moment les msgbox apparaissent
VB:
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
;)
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
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, @+
 

fanch55

XLDnaute Barbatruc
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, @+
no pb, je n'ai rien pris pour une critique ;), je suis pour toutes les alternatives ...
 

patricktoulon

XLDnaute Barbatruc
@patricktoulon quelle est l'utilité de .Controls(2).BeginGroup = True ?

A priori si on supprime cette instruction ça ne change rien...
re
si mais sur les versions récentes de excel on vois pas le trait de séparation du menu
demo.gif
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 204
Membres
103 157
dernier inscrit
youma