12. august 2009 - 15:18Der er
11 kommentarer og 1 løsning
VBA Excel: Lave menu i addin - problemer med undermenu
Hej
Jeg laver en addin i Excel (.xla) der skal lave en menu med en undermenu i Excels toolbar. Det virker - næsten...
Problemet er at vil have denne skruktur
1. Menu 1 1.a Undermenu y 1.b Undermenu x 2. Menu 2 2.a Undermenu y 2.b Undermenu x
Men jeg får
1. Menu 1 1.a Undermenu y 1.b Undermenu x 2. Menu 2 2.a Undermenu y 2.b Undermenu x
Det er som omjeg ikke kan "lukke" menu 1 når jeg vil tilføje menu 2.
Kode:
Set cbMainMenuBar = Application.CommandBars("Worksheet Menu Bar") iHelpMenu = cbMainMenuBar.Controls("Help").Index Set cbcCutomMenu = cbMainMenuBar.Controls.Add(Type:=msoControlPopup, Before:=iHelpMenu) cbcCutomMenu.Caption = "&Statistik" With cbcCutomMenu.Controls.Add(Type:=msoControlButton) .Caption = "Menu 1" .OnAction = "MyMacro1" End With
'---------------------MENU 1--------------------- Set cbcCutomMenu = cbcCutomMenu.Controls.Add(Type:=msoControlPopup) cbcCutomMenu.Caption = "1. Menu"
With cbcCutomMenu.Controls.Add(Type:=msoControlButton) .Caption = "1.a undermenu" .FaceId = 420 .OnAction = "Run_1a" End With With cbcCutomMenu.Controls.Add(Type:=msoControlButton) .Caption = "1.b undermenu" .FaceId = 430 .OnAction = "Run_1b" End With
'---------------------MENU 2---------------------
'!!!!!!!!!!!!!!'Denne menu skulle gerne starte i Roden, men den bliver bare et underpunkt til menu 1!!!!!!!!!!!!!!!!!
Set cbcCutomMenu = cbcCutomMenu.Controls.Add(Type:=msoControlPopup) cbcCutomMenu.Caption = "2. Menu"
With cbcCutomMenu.Controls.Add(Type:=msoControlButton) .Caption = "2.a Undermenu" .FaceId = 420 .OnAction = "Run_2a" End With With cbcCutomMenu.Controls.Add(Type:=msoControlButton) .Caption = "2.b undermenu" .FaceId = 430 .OnAction = "Run_2b" End With
Problemet er, at du undervejs ændrer på, hvad cbcCutomMenu er - og så bliver de nye controls føjet til under det, cbcCutomMenu er på det tidspunkt.
Jeg har erklæret en ny variabel, cbcSubMenu, som jeg har brugt til undermenuerne. Jeg har desuden indsat "oprydning" sidst i makroen. Prøv denne version - den virker hos mig:
Sub CreateMenu()
'Jeg har indsat deklaration af dine variable - det har du måske på modul-niveau Dim cbMainMenuBar As CommandBar Dim iHelpMenu As Long Dim cbcCutomMenu As CommandBarControl
'Ny Variabel, som bruges til undermenuerne Dim cbcSubMenu As CommandBarControl
Set cbMainMenuBar = Application.CommandBars("Worksheet Menu Bar") iHelpMenu = cbMainMenuBar.Controls("Help").Index Set cbcCutomMenu = cbMainMenuBar.Controls.Add(Type:=msoControlPopup, Before:=iHelpMenu) cbcCutomMenu.Caption = "&Statistik" With cbcCutomMenu.Controls.Add(Type:=msoControlButton) .Caption = "Menu 1" .OnAction = "MyMacro1" End With
'---------------------MENU 1--------------------- Set cbcSubMenu = cbcCutomMenu.Controls.Add(Type:=msoControlPopup) cbcSubMenu.Caption = "1. Menu"
With cbcSubMenu.Controls.Add(Type:=msoControlButton) .Caption = "1.a undermenu" .FaceId = 420 .OnAction = "Run_1a" End With With cbcSubMenu.Controls.Add(Type:=msoControlButton) .Caption = "1.b undermenu" .FaceId = 430 .OnAction = "Run_1b" End With
'---------------------MENU 2---------------------
'!!!!!!!!!!!!!!'Denne menu skulle gerne starte i Roden, men den bliver bare et underpunkt til menu 1!!!!!!!!!!!!!!!!!
Set cbcSubMenu = cbcCutomMenu.Controls.Add(Type:=msoControlPopup) cbcSubMenu.Caption = "2. Menu"
With cbcSubMenu.Controls.Add(Type:=msoControlButton) .Caption = "2.a Undermenu" .FaceId = 420 .OnAction = "Run_2a" End With With cbcSubMenu.Controls.Add(Type:=msoControlButton) .Caption = "2.b undermenu" .FaceId = 430 .OnAction = "Run_2b" End With
On Error GoTo 0
'Ryd op Set cbcCutomMenu = Nothing Set cbcSubMenu = Nothing
Smukt - kunne jeg lokke dig til at lave et eksemlep på et 3. nuveau?
Fx
1. Menu 1 1.a Undermenu y 1.b Undermenu x 2. Menu 2 2.a Undermenu y 2.b Undermenu x 3. Menu 3 3.a Undermenu y 3.a.1 UnderUndermeny yx 3.a.2 UnderUndermeny yx 3.b Undermenu x 3.a.1 UnderUndermeny yx 3.a.2 UnderUndermeny yx 4. Menu 4 4.a Undermenu y 4.b Undermenu x
Men ville gerne have et flueben eller en anden markering til at blive tændt/slukket ud for et af menu-punkterne (næsten som jd for tools-Spelling i Excel)
OK. Det vigtige er, at du hele tiden holder styr på, at det er den rigtige control, du gør noget med. Hvis du senere får brug for at gøre noget med en control, du har brugt "Set" til, så kan du undlade at overskrive den ved at lave en ny "Set" med samme variable. Du kan i stedet - som jeg gjorde - benytte en ny variabel.
Der er jo altid mange måder at løse tingene på, og i den version, jeg lavede i første omgang, prøvede jeg at holde fast i så meget som muligt af det, du selv havde lavet. Det kunne måske hjælpe dig at kalde control-variablerne noget, som gør, at du kan se af navnet, hvilket niveau, de er på i menuen.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.