3e niveau in rechtermuisknop Excel

Status
Niet open voor verdere reacties.

Plotinus

Gebruiker
Lid geworden
25 mrt 2007
Berichten
649
Ik wil graag in een bepaald gebied van een excelsheet zelf een menu aan mijn rechtermuisknop toevoegen en al het andere verwijderen. Dit lukt aardig, zie bijgevoegde voorbeeld. Ik heb echter een paar wensen/uitdagingen:
  • Het lukt me niet om alles uit het standaardmenu te vegen: bij mij blijft de optie 'plakken' staan;
  • Het lukt me niet om een derde niveau aan te brengen, dit komt toch ook af en toe voor;
  • Met elke keuze (meestal twee niveaus, soms drie niveaus) zou ik graag steeds dezelfde makro aanroepen, waarbij de gemaakte keuzes in het menu als parameters worden meegegeven. Kan ik dat eenmalig, aan het einde van de menudefiniëring doen?, of moet ik achter elke menukeuze een makro aanroepen, zoals nu gedaan; een beetje veel code.
  • Hoe voeg ik een icoontje aan het begin (in de linkerkantlijn) van het menu toe? zoals MS dat heeft gedaan bij bijvoorbeeld sorteren

Iemand een idee hoe deze uitdagingen op te lossen?
 

Bijlagen

  • test met rechtermuisknop.xlsm
    20,6 KB · Weergaven: 38
Voor dat icoontje kan je de FaceID optie gebruiken. Bijvoorbeeld:
Code:
With Application.CommandBars("cell").Controls.Add(Type:=msoControlButton)
    .Caption = "Test1"
    .FaceId = 317
    .OnAction = "Mijn_macro_1"
    .Tag = "brccm"
End With

Een lijst met alle FaceID's kan je hier vinden:
http://www.outlookexchange.com/articles/toddwalker/BuiltInOLKIcons.asp

Overigens kan je er beter een invoegtoepassing van maken zodat je zo'n contextmenu in ieder document beschikbaar hebt zonder het iedere keer te moeten toevoegen. Dat gaat echter op een compleet andere manier. Hiervoor gebruik je de CustomUI waarbij je de menu's in XML maakt en de Callback routines in standaard VBA.

De XML voor het contextmenu is dit:
Code:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <contextMenus>
      <contextMenu idMso="ContextMenuCell">

De hoofdingang van je eigen menu wordt dan onderdeel van het standaard contextmenu van een werkblad.
Je kan dan net zo diep gaan met submenu's als nodig is. Hiervoor is wel minimaal Excel 2010 nodig.
Dit is uiteraard een heel andere manier van werken maar als je er een voorbeeldje van wilt hebben dan laat het maar weten.
 
Laatst bewerkt:
Bedankt Edmoor.

Dat van FaceId werkt. Wel vreemd dat het niet werkt als er een submenu volgt; het werkt alleen op het laatste niveau blijkbaar.

Ik zit met het feit dat iets probeer te maken voor anderen waarbij men enkel in één bepaald document in een bepaald gebied mijn rechtermuisknop-menu te zien moet krijgen én dat het moet werken vanaf Office 2007. Een invoegtoepassing (dat werkt vanaf 2010) heb ik dus niets en is dus ook niet zo zinvol.

Blijf ik dus met de belangrijkste vraag zitten hoe ik een derde niveau aan mijn menu toevoeg(?) en hoe ik dat ene item (Plakoties) verwijder uit mijn menu.

Ik heb mijn code flink opgeruimd, zodat het veel beter leesbaar is (in Blad1)...
 

Bijlagen

  • test met rechtermuisknop.xlsm
    23,4 KB · Weergaven: 34
Die plakopties kan je verwijderen door het hele menu te verwijderen, zo dus:
Code:
    [COLOR="#008000"]' Reset het contextmenu naar standaard waarden[/COLOR]
    For Each icbc In Application.CommandBars("cell").Controls
        [COLOR="#008000"]'If icbc.Tag = "brccm" Then[/COLOR]
            icbc.Delete
        [COLOR="#008000"]'Else
        '    icbc.Visible = True
        '    icbc.Enabled = True
        'End If[/COLOR]
    Next icbc

Ik gebruik dergelijke menu's nooit en weet zo niet waarom de FaceId in het eerste menu niet werkt.
Ook kan ik zo niet zeggen of een derde level wel mogelijk is.
Momenteel heb ik helaas geen tijd er verder naar te kijken, later misschien.
 
Laatst bewerkt:
Invoegtoepassingnen werken al vanaf Excel 95.
 
Klopt, maar waar ik op doelde was het lint menu. Dat werkt vanaf Office 2007 zoals je weet. Het maken van functies onder de rechter muisknop werkt daarin echter pas vanaf Office 2010.
 
@edmoor

Ik reageerde op een onjuiste opmerking van Plotinus....
 
Ondertussen toch echt al wat verder: menukeuze (Optie) 1, 1.1. en 1.1.2 (dus drie niveaus) levert in de klommen B en C op Blad1 middels een macro een melding op het scherm op - het principe werkt dus!. Optie 1.1.1 geeft nog wel een foutmelding, omdat ik daar aan de macro info mee wil geven, wat nog niet lukt. Iemand een idee hoe dat moet?
Uiteindelijk is het de bedoeling dat steeds dezelfde macro wordt aangeroepen, maar dat de uitvoering wordt gestuurd door de meegegeven inhoud via de rechtermuisknop.
De code ziet er overigens niet uit; als iemand een handiger/overzichtelijkere manier weet: heel graag!
 

Bijlagen

  • test met rechtermuisknop.xlsm
    26,2 KB · Weergaven: 35
Is dit voldoende ?

Code:
Sub M_snb()
   Application.CommandBars("Cell").Reset

  sn = Split("1 2 3 4 5")
  sp = Split("1 2 3 4")
  sq = Split("1 2 3")
  
 With Application.CommandBars("Cell").Controls
     For Each it In sn
       With .Add(10)
             .Caption = "Optie " & it
             .Tag = "vvv"
             .BeginGroup = False
             For Each it1 In sp
                With .Controls.Add(10)
                    .Caption = "Optie " & it & "." & it1
                    .Tag = MY_TAG
                    .BeginGroup = False
                    For Each it2 In sq
                        With .Controls.Add
                            .Caption = "Optie " & it & "." & it1 & "." & it2
                            .OnAction = "TestMacro " & .Caption
                            .FaceId = 80
                        End With
                    Next
                End With
            Next
        End With
    Next
End With
 
Laatst bewerkt:
Heel mooi snb en zeker, na wat omwerken, heel bruikbaar. Ik zit echter nog met één probleem, namelijk dat
Code:
.OnAction = "TestMacro " & Caption
de volgende foutmelding geeft: "Het argument is niet optioneel". Mogelijk ligt het aan mijn aan te roepen Testmacro (al lijkt mij daar niet eens te komen):
Code:
Sub TestMacro(optie)
    MsgBox "Het werkt" & optie & " - hoera!"
End Sub
 
De .OnAction kan je alleen de naam meegeven van de te starten macro. dus deze regel:
.OnAction = "TestMacro " & Caption
bevat geen parameter. Hij start een macro met als naam de samenvoeging van "TestMacro " en de waarde van de variabele Caption. In het voorbeeld van snb is deze echter in alle gevallen leeg.
 
Laatst bewerkt:
Ik heb voor mij de oplossing gevonden:
Code:
.OnAction = "'Test ""a "",""b "",""c ""'"
En de macro als volgt aanroepen:
Code:
Sub Test(Arg1 As String, Arg2 As String, Arg3 As String)
    MsgBox Arg1 & Arg2 & Arg3
End Sub

Allen hartelijk dank!
 
Yep! Dat werkt. Goed gevonden! :thumb:
 
Laatst bewerkt:
Iets verder kijken dan de neus...

.OnAction = "TestMacro " & .Caption
 
Dat had ik inderdaad wel gezien maar dacht er niet over te hoeven zeuren omdat het dan nog steeds niet de bedoelde parameter leverde ;)
 
@edmoor

Ik heb alleen de code uit #9 gefatsoeneerd.

Voor het beoogde doel lijkt mij een combobox voor de hand liggender; dan hoeft alleen een keuze gemaakt te worden voor de parameter die aan de macro moet worden meegegeven. Daar zijn al die extra controls niet voor nodig.
 
Zelf had ik het ook met een combobox of zelfs een userform opgelost. Maar het is ook wel een keer leuk om te zien hoe dit draadje zich toch met die code ontwikkeld heeft :)
 
edmoor, snb, jullie suggestie het probleem met comboxen op te lossen heb ik al werkend en daarbij dankbaar gebruik gemaakt van jullie hulp

http://www.helpmij.nl/forum/showthread.php/871749-groep-comboboxen-in-een-loop-aanpassenhttp://

Dit gewerkt op zich prima, maar is wat traag bij duizenden rijen, wat - helaas - voor komt. Daarnaast werk je niet in de betreffende rij, wat sommige gebruikers wat lastig vinden. Vandaar mijn idee het - ook - met een rechtermuisknop op te lossen. Of dat snelheidswinst gaat opleveren weet ik nog niet (moet het het nog inbouwen), maar rechtstreeks werken in de juiste rij is er in ieder geval wel. Er zijn straks dus twee invulopties beschikbaar.
Aan de userform heb ik ook gedacht, maar dat leek me wat meer werk om het netjes te maken en daarmee mogelijk niet op tijd klaar. Wellicht op te pakken voor volgend jaar als ik het rond deze tijd weer nodig heb.
 
Dacht ik er eindelijk te zijn, blijkt het niet te werken in een tabel; krijg weer gewoon de oude rechtermuistoetsinhoud.
Iemand een verklaring en een mogelijke oplossing?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan