RSS

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.

OBS: I Excel 2007 og nyere erstatter man ikke Excels indbyggede menu, og jeg ved ikke, om det kan lade sig gøre. I stedet vises et nyt menupunkt, "AddIns" eller "Tilføjelsesprogrammer," og klikker man på dette, vises den skræddersyede menu.

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".

Hvis du læser dette på en lille skærm, kan nogle af kodelinjerne se "knækkede" ud, men linjeskiftene er OK, når du indsætter den kopierede kode i et VBA-modul.

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 indsæ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.

Relaterede sider: