Home Rejser Gæstebog Erics blog Kontakt
 

Home > Excel makroer & VBA > Egne menupunkter i Excel med VBA

Egne menuer i Excel med VBA

I Excel (og andre Officeprogrammer) er det nemt at lave sine egne skræddersyede menupunkter, som tilføjes Excels standardmenu. Man kan også helt erstatte standardmenuen eller lave sine egne værktøjslinier.

I eksemplet på denne side tilføjes et nyt menupunkt, "Menukort", med underpunkter til højre for standardmenuens "Hjælp-menu". Menuen er kun synlig, når det pågældende regneark er aktivt. Skifter man til eller åbner et andet regneark, er menupunktet der ikke.

Hvert underpunkt i menuen "Menukort" har tilknyttet en makro (her MinMakro1 og MinMakro2), som i dette eksempel blot er en messagebox. Du kan prøve eksemplet ved at åbne Excels VBA editor (ALT+F11) og indsætte et modul. Markér koden på denne side, kopiér (CTRL+C) og indsæt det kopierede i modulet. Kør makroen "TilfoejMenu".

De to sidste makroer ("Private Sub Workbook_Activate" og "Private Sub Workbook_Deactivate") skal indsættes i makrokoden til "ThisWorkbook". Det er nemt - forklaring følger længere nede på siden.


Option Explicit

Sub TilfoejMenu()

Dim cbHovedMenu As CommandBar
Dim cbcMinMenu As CommandBarControl
Dim cbcUnderMenu As CommandBarControl

'Trin 1
'Slet menuen hvis den allerede eksisterer.
'Hvis den ikke eksisterer, giver det en fejl,
'og derfor bruger vi On Error Resume Next.

On Error Resume Next
Application.CommandBars("Worksheet Menu Bar"). _
Controls("&Menukort").Delete

'Trin 2
'Sæt en CommandBar variabel som Worksheet menu bar

On Error GoTo ErrorHandle
Set cbHovedMenu = Application.CommandBars _
("Worksheet Menu Bar")

'Trin 3
'Tilføj et menupunkt til hovedmenuen.

Set cbcMinMenu = cbHovedMenu.Controls.Add _
(Type:=msoControlPopup)

'Trin 4
'Giv menupunktet en caption

cbcMinMenu.Caption = "&Menukort"

'Trin 5
'Nu tilføjer vi underpunkter til vores nye menupunkt.
'Vi giver underpunktet en tekst og fortæller, hvilken
'makro det skal køre (OnAction). Her "MinMakro1".

With cbcMinMenu.Controls.Add(Type:=msoControlButton)
  .Caption = "Lammekølle"
  .OnAction = "MinMakro1"
End With

'Trin 6
'Tilføjer endnu et underpunkt

With cbcMinMenu.Controls.Add(Type:=msoControlButton)
  .Caption = "Oksesteg"
  .OnAction = "MinMakro2"
End With

'Gentag trin 6 for hvert underpunkt, du ønsker
'at tilføje.
'Trin 7
'Nu tilføjes et underpunkt som fører til en undermenu
'Vi giver den en ny CommandBarControl variabel.

Set cbcUnderMenu = cbcMinMenu.Controls.Add _
(Type:=msoControlPopup)

'Undermenuen får en caption
cbcUnderMenu.Caption = "Ne&xt Menu"

'Trin 8
'Nu tilføjes indholdet til undermenuen

With cbcUnderMenu.Controls.Add(Type:=msoControlButton)
  .Caption = "&Grillretter"
  'Et FaceId tilknytter et lille ikon
  .FaceId = 2173
  .OnAction = "MinMakro2"
End With

'Trin 9
'For eksemplets skyld tilføjer vi lige et punkt mere

With cbcMinMenu.Controls.Add _
(Type:=msoControlButton, Temporary:=True)
  .Caption = "Gryderetter"
  .OnAction = "MinMakro2"
  'BeginGroup indsætter en linie over menupunktet
  .BeginGroup = True
  .FaceId = 1252
End With

BeforeExit:
Set cbcMinMenu = Nothing
Set cbcUnderMenu = Nothing
Set cbHovedMenu = Nothing

Exit Sub
ErrorHandle:
MsgBox Err.Description & " Fejl i TilfoejMenu"
Resume BeforeExit
End Sub


Sub SletMenu()

'Sletter det brugerdefinerede menupunkt

On Error Resume Next
Application.CommandBars("Worksheet Menu Bar"). _
Controls("Menukort").Delete

End Sub


Sub MinMakro1()

MsgBox "Ikke meget kød på denne makro", vbInformation, _
"Lammekølle"

End Sub


Sub MinMakro2()

MsgBox "Der er heller ikke meget kød på den her, vel?", _
vbInformation, "Menu"

End Sub


De følgende 2 makroer skal indættes i makrodelen til "ThisWorkbook". I VBA editoren dobbeltklikker du på ikonet ThisWorkbook, som står lige over moduloversigten i Projektoversigten. Er den ikke synlig, klikker du CTRL+R.

Makroerne sørger for, at din menu er synlig, når regnearket er aktivt, og usynlig, hvis det ikke er aktivt. Hvis du ønsker, at menuen kun skal være aktiv på et bestemt faneblad, skal du vælge det pågældende worksheet i stedet for ThisWorkbook.


Private Sub Workbook_Activate()
TilfoejMenu
End Sub


Private Sub Workbook_Deactivate()
SletMenu
End Sub


De enkelte menupunkter har flere properties (egenskaber) end vist i eksemplet TilfoejMenu. Ud over .OnAction med videre er der f.eks. mulighed for at gøre menupunktet synligt eller usynligt med egenskaben .Visible = True eller .Visible = False.

Det kan f.eks. være styret af en betingelse:

If et-eller-andet Then
    .Visible = False
Else
    .Visible = True
end If

Så skal man lige huske at køre makroen TilfoejMenu, hvis betingelsen ændrer sig på et tidspunkt, så menupunktet skal være synligt.

Der er tusindvis af de små ikoner (FaceId), som kan stå ud for de enkelte menupunkter. På denne side er en oversigt over dem alle med tilhørende numre.