Avatar billede martin_moth Mester
12. august 2009 - 15:18 Der 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

On Error GoTo 0
Avatar billede Lene Fredborg Ekspert
12. august 2009 - 15:49 #1
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

End Sub
Avatar billede martin_moth Mester
12. august 2009 - 16:06 #2
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
Avatar billede martin_moth Mester
12. august 2009 - 16:07 #3
hov - skrev forkert ved underundermenuerne til 3.b - kom til at kalde dem 3.a
Avatar billede Lene Fredborg Ekspert
12. august 2009 - 16:09 #4
Er du sikker på, at du gerne vil have det? Det er jo ikke specielt brugervenligt at vælge kommandoer på 3. niveau ;-)
Avatar billede martin_moth Mester
12. august 2009 - 16:12 #5
kan nok klare det selv, tror jeg
Avatar billede martin_moth Mester
12. august 2009 - 16:13 #6
ja, er sikker :-)

Smid svar
Avatar billede martin_moth Mester
12. august 2009 - 16:17 #7
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)
Avatar billede Lene Fredborg Ekspert
12. august 2009 - 16:25 #8
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.
Avatar billede martin_moth Mester
12. august 2009 - 16:29 #9
altså .faceid = xxx
Avatar billede martin_moth Mester
12. august 2009 - 16:32 #10
smukt svar - takker...

Hvor får man mon en liste over hvilke faceID der viser hvad...
Avatar billede martin_moth Mester
12. august 2009 - 16:55 #11
Avatar billede Lene Fredborg Ekspert
12. august 2009 - 17:04 #12
Se f.eks.:
http://www.j-walk.com/ss/excel/tips/tip40.htm

Jeg tror, det kan hjælpe dig.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester