Vraag & Antwoord

Anders (software)

Excel rechtsklikmenu vervangen door eigen menu

Anoniem
None
16 antwoorden
  • Als je ergens op een Excel werkblad rechts klikt verschijnt er een menu met o.a. Knippen, Kopiëren, Plakken.
    Nu mijn vraag: Kan ik dit rechtsklikmenu vervangen door een menu dat ik zelf gemaakt heb?

    Met de volgende VB code kan ik wel een item toevoegen aan het menu maar blijft het bestaande menu nog steeds zichtbaar en dat wil ik nu juist uit beeld hebben.
    [code:1:85c33cd59b]Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
    Cancel As Boolean)
    For Each icbc In Application.CommandBars("cell").Controls
    If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc
    If Not Application.Intersect(Target, Range("a1:v284")) _
    Is Nothing Then
    With Application.CommandBars("cell").Controls _
    .Add(Type:=msoControlButton, before:=1, _
    temporary:=True)
    .Caption = "Test1"
    .OnAction = "Mijn_macro_1"
    .Tag = "brccm"
    End With[/code:1:85c33cd59b]Nu wil ik maar op 1 werkblad een zelf gemaakt rechtsklikmenu, op alle andere werkbladen wil ik het originele menu behouden.
    Is dit mogelijk?
  • [quote:8a92d8175e="Cor vd H"]Nu wil ik maar op 1 werkblad een zelf gemaakt rechtsklikmenu, op alle andere werkbladen wil ik het originele menu behouden. Is dit mogelijk?[/quote:8a92d8175e]
    Nee, het menu behoort tot het programma Excel,
    het behoort niet bij 1 werkblad.
  • [quote:ccbddc70c8="alfa6591"]Nee, het menu behoort tot het programma Excel,
    het behoort niet bij 1 werkblad.[/quote:ccbddc70c8]Dat klopt, maar dat wil niet zeggen dat je het niet kan aanpassen. Het kan zelfs per werkblad..
    [quote:ccbddc70c8="Cor vd H"]Nu mijn vraag: Kan ik dit rechtsklikmenu vervangen door een menu dat ik zelf gemaakt heb?
    <knip>
    Nu wil ik maar op 1 werkblad een zelf gemaakt rechtsklikmenu, op alle andere werkbladen wil ik het originele menu behouden.
    Is dit mogelijk?[/quote:ccbddc70c8]
    Op beide vragen is het antwoord: ja. Je moet dan niet in de code van het werkblad zijn, maar in het event "Workbook_SheetBeforeRightClick" (dat vind je onder ThisWorkbook in de VBA editor). De code die je als voorbeeld geeft, komt al een heel eind in de goede richting, maar je moet nog een paar extra stappen doen:[code:1:ccbddc70c8]Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    ' Reset het contextmenu naar standaard waarden
    For Each icbc In Application.CommandBars("cell").Controls
    If icbc.Tag = "brccm" Then
    icbc.Delete
    Else
    icbc.Visible = True
    icbc.Enabled = True
    End If
    Next icbc

    ' Controle in welke sheet we zitten
    ' Nu ga ik ervan uit dat je op Sheet1 een aangepast menu wil hebben
    If ActiveSheet.Name = "Sheet1" Then
    If Not Application.Intersect(Target, Range("a1:v284")) _
    Is Nothing Then
    ' Eerst alle standaard menu items verstoppen
    For Each ctrl In Application.CommandBars("Cell").Controls
    ctrl.Visible = False
    Next
    ' Nu kan je je eigen menu items toevoegen
    With Application.CommandBars("cell").Controls _
    .Add(Type:=msoControlButton, before:=1, _
    temporary:=True)
    .Caption = "Test1"
    .OnAction = "Mijn_macro_1"
    .Tag = "brccm"
    End With
    End If
    End If

    End Sub[/code:1:ccbddc70c8]Nu heb je alleen voor het gebied A1:V284 op werkblad Sheet1 een aangepast menu. Voor alle overige werkbladen, plus de cellen buiten dit bereik krijg je het standaard contextmenu te zien.

    Succes.
  • Hallo Meneer_ed,

    De code getest en het werkt perfect.
    Heb ik nog twee aanvullende vragen:

    Als ik nu nog een andere sheet ook een eigen rechtsklikmenu wil geven kan dit dan?
    En kan er ook één of meerdere submenu's in verwerkt worden?
    Dan kan ik het menu wat overzichtelijker indelen.
  • [quote:218c5655d8="Cor vd H"]Hallo Meneer_ed,

    De code getest en het werkt perfect.[/quote:218c5655d8]Mooi zo.
    [quote:218c5655d8="Cor vd H"]Heb ik nog twee aanvullende vragen:

    Als ik nu nog een andere sheet ook een eigen rechtsklikmenu wil geven kan dit dan?[/quote:218c5655d8]Ja, dat kan. In mijn voorbeeld gebruik ik een If statement om de actieve sheet te bepalen. Je kan natuurlijk ook een Select Case statement gebruiken om voor verschillende sheets een aangepast menu te maken. Of je breidt de If statement uit met een Else If…
    [quote:218c5655d8="Cor vd H"]En kan er ook één of meerdere submenu's in verwerkt worden?
    Dan kan ik het menu wat overzichtelijker indelen.[/quote:218c5655d8]Dat kan ook, zie deze link voor meer uitleg.
  • meneer_ed,
    Bedankt voor de les!
  • Een rechtsklikmenu op meerderewerkbladen dal zal waarschijnlijk wel lukken, maar dat submenu verhaal word mij te ingewikkeld.

    Ik heb die link bekeken maar het is niet zo eenvoudig als ik dacht.
    De code getest en Ik kreeg wel een submenu maar krijg dit niet aangepast naar mijn eigen wensen.
    Indien mogelijk zou ik daar nog wat meer toelichting bij willen hebben.

    Wat ik wil is dat ik vanuit het submenu wat macro's kan starten.
    Om het wat overzichtelijk te houden wil ik het liefst 2 of meer submenu's in het rechtsklikmenu.

    Alvast bedankt weer voor de hulp.
  • [quote:3ce31dfa28="Cor vd H"]De code getest en Ik kreeg wel een submenu maar krijg dit niet aangepast naar mijn eigen wensen.[/quote:3ce31dfa28]
    Met de code hierboven van meneer_ed wordt 1 menu-item weergegeven, nl. Test1, waarmee Mijn_macro_1 wordt uitgevoerd. Als je nu nog een item wil, dan voeg je onder dit gedeelte van de code: [code:1:3ce31dfa28]With Application.CommandBars("cell").Controls.Add(Type:=msoControlButton, before:=1, temporary:=True)
    .Caption = "Test1"
    .OnAction = "Mijn_macro_1"
    .Tag = "brccm"
    End With[/code:1:3ce31dfa28]
    diezelfde code nog een keer toe. Je wijzigt
    before:=1 in before:=2
    Test1 in Test2
    Mijn_macro_1 in Mijn_macro_2
    Je moet dan natuurlijk die 2 macro's met die naam wel ter beschikking hebben.
    PS: Voor de duidelijkheid zou ik van Test1 en Test2 resp. maken: Macro 1 en Macro 2
    en van Mijn_macro_1 en Mijn_macr0_2 resp. Macro1 en Macro2
  • Een nieuw item toevoegen zoals je uitlegt lukt me wel, maar wat ik in het menu wil toevoegen is een submenu.

    Dus ik zet mijn muiscursor op een item (met rechts een pijltje ernaast) en er verschijnt dan een nieuw menu.
    Via dat vervolgmenu wil ik dan weer een aantal macro,s kunnen starten.
    Dat is nu net wat me niet lukt.
  • [quote:c291093078="Cor vd H"]Een nieuw item toevoegen zoals je uitlegt lukt me wel, maar wat ik in het menu wil toevoegen is een submenu.

    Dus ik zet mijn muiscursor op een item (met rechts een pijltje ernaast) en er verschijnt dan een nieuw menu.
    Via dat vervolgmenu wil ik dan weer een aantal macro,s kunnen starten.
    Dat is nu net wat me niet lukt.[/quote:c291093078]En dat staat beschreven in de link die ik je gaf. In feite is het redelijk eenvoudig:

    1. Voeg een CommandBarControl van het type msoControlPopup toe aan je custom menu.
    2. Voeg daaraan weer een CommandBarControl van het type msoControlButton toe.
    3. Geef de 2e control de gewenste macro mee via de OnAction property.
    4. Herhaal de stappen 2 en 3 voor elke knop die je wil toevoegen aan je submenu.
    5. Herhaal de stappen 1 t/m 3 voor extra submenu's.

    In code ziet het er als volgt uit:[code:1:c291093078]Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    Dim ctrl As CommandBarControl
    Dim btn As CommandBarControl

    ' Reset het contextmenu naar standaard waarden
    For Each icbc In Application.CommandBars("cell").Controls
    If icbc.Tag = "brccm" Then
    icbc.Delete
    Else
    icbc.Visible = True
    icbc.Enabled = True
    End If
    Next icbc

    ' Controle in welke sheet we zitten
    ' Nu ga ik ervan uit dat je op Sheet1 een aangepast menu wil hebben
    If ActiveSheet.Name = "Sheet1" Then
    If Not Application.Intersect(Target, Range("a1:v284")) _
    Is Nothing Then
    ' Eerst alle standaard menu items verstoppen
    For Each ctrl In Application.CommandBars("Cell").Controls
    ctrl.Visible = False
    Next
    ' Nu kan je je eigen menu items toevoegen
    With Application.CommandBars("cell").Controls _
    .Add(Type:=msoControlButton, Before:=1, _
    temporary:=True)
    .Caption = "Test1"
    .OnAction = "Mijn_macro_1"
    .Tag = "brccm"
    End With
    ' Voeg een submenu toe
    Set ctrl = Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup)
    ctrl.Caption = "Dit is een submenu.."
    Set btn = ctrl.Controls.Add(Type:=msoControlButton)
    btn.Caption = "Dit hoort in het submenu"
    btn.Tag = "tag"
    btn.OnAction = "Mijn_macro_1"
    End If
    End If

    End Sub[/code:1:c291093078]Succes.
  • Ik heb dit allemaal geprobeerd en heb nu inderdaad een menu met submenu's zoals ik het wil hebben op sheet1.

    Maar er gebeurt nu iets vreemds op de andere werkbladen.
    Voorbeeld: Ik ga naar sheet1 en klik daar met mijn rechtermuisknop, ik zie dan het menu met submenu zoals ik dit gemaakt heb.
    Tot zover alles goed, maar nu klik ik nog een keer en weer zie ik het juiste menu en submenu in sheet1.

    Maar nu komt het: vervolgens ga ik naar sheet2 en klik daar met de rechtermuisknop en er verschijnt dan het normale Excel rechtsklikmenu plus daaronder twee keer alleen het submenu zoals ik dit maar één keer zie in sheet1

    Het menu op alle andere sheets behalve sheet1 word dus steeds langer naarmate ik meer rechtsklik in sheet1.

    Ik gebruik de volgende macro om die teveel aangemaakte submenu's weer te wissen:
    [code:1:e2a6ceb53a]Sub ShortcutSub_DeleteItem2()
    CommandBars("Cell").Controls("Dit is een submenu..").Delete
    End Sub[/code:1:e2a6ceb53a]Ik moet dus als ik op sheet1 twee keer rechts geklikt heb twee keer deze macro uitvoeren om de rechtsklikmenu's van sheet2 en sheet3 weer goed te krijgen.

    Kan ik dit probleem verhelpen, want dan is het Excel document precies zoals ik dit wil hebben.
  • Het probleem wat ik omschrijf in de reactie hier vlak boven is verholpen.
    Ik heb alleen nu het eigen rechtsklikmenu op alle werkbladen in plaats van alleen op sheet1, maar dat is niet zo erg.

    Probleem wat nu is onstaan is dat het rechtsklikmenu wat ik gemaakt heb ook wordt weergegeven in andere Exceldocumenten.
    Welk document ik ook open, overal zie ik nu het nieuwe menu in plaats van het originele rechtsklikmenu van Excel.

    Kan ik een aanpassing maken zodat ik in alle documenten die ik open weer het normale Excelmenu terug heb, behalve in dat Exceldocument waar ik dat eigen gemaakte rechtsklikmenu in wil hebben?
  • [quote:7fd9b54d0f="Cor vd H"]Kan ik een aanpassing maken zodat ik in alle documenten die ik open weer het normale Excelmenu terug heb, behalve in dat Exceldocument waar ik dat eigen gemaakte rechtsklikmenu in wil hebben?[/quote:7fd9b54d0f]Sorry voor de late reactie, ik heb het nogal druk. Maar je kan zeker die aanpassing maken. Je moet ervoor zorgen dat voordat je custom Excelbestand wordt gesloten, het contextmenu weer gereset wordt naar de standaard waarden. En daarvoor kan je het event Workbook_BeforeClose gebruiken. Hierin moet je aangeven dat alleen Controls waarvan de eigenschap BuiltIn op true staat zichtbaar en enabled zijn. Het is in feite dezelfde code als in het Workbook_SheetBeforeRightClick event.
    [code:1:7fd9b54d0f]Private Sub Workbook_BeforeClose(Cancel As Boolean)

    ' Reset het contextmenu naar standaard waarden
    For Each icbc In Application.CommandBars("cell").Controls
    If icbc.BuiltIn = False Then
    icbc.Delete
    Else
    icbc.Visible = True
    icbc.Enabled = True
    End If
    Next icbc

    End Sub
    [/code:1:7fd9b54d0f]
    Deze code zorgt ervoor dat je contextmenu wordt teruggezet naar de standaard instellingen.

    Succes
    Ed
  • Ik heb je code getest en het werkt.

    Maar nu heb ik gisteren toevallig na wat uitzoekwerk zelf ook een manier gevonden met het zelfde resultaat:

    [code:1:e9bc85f5fe]Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Run ("Reset_rechtsklikmenu")
    End Sub[/code:1:e9bc85f5fe]
    En in de module de volgende code:
    [code:1:e9bc85f5fe]Sub Reset_rechtsklikmenu()

    CommandBars("Cell").Reset
    End Sub[/code:1:e9bc85f5fe]
    Ik kon alleen de code uit de macro niet plaatsen in het Beforeclose event want dan krijf ik een foutmelding (Fout91).

    Maakt het uit welke manier ik gebruik?, ik zie wat betreft het resultaat geen verschil.
  • [quote:807d3805f7="Cor vd H"]
    Ik kon alleen de code uit de macro niet plaatsen in het Beforeclose event want dan krijf ik een foutmelding (Fout91).
    [/quote:807d3805f7]Dit kan je oplossen door niet [code:1:807d3805f7]CommandBars("Cell").Reset[/code:1:807d3805f7], maar [code:1:807d3805f7]Application.CommandBars("Cell").Reset[/code:1:807d3805f7] in je BeforeClose event te plaatsen.
    [quote:807d3805f7="Cor vd H"]Maakt het uit welke manier ik gebruik?, ik zie wat betreft het resultaat geen verschil.[/quote:807d3805f7] Nee, maar als er al een standaardmethode is, dan zou ik die gebruiken. Tenzij je heel speciale wensen hebt, maar volgens mij voldoet in jouw geval de Reset methode prima.

    Groeten
    Ed
  • Bedankt voor de hulp en de duidelijke uitleg, mijn document is nu precies zoals ik het hebben wil.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.