Hvordan man med VBA udskifter Excels standardmenu
På denne side viser jeg, hvordan man nemt kan udskifte Excels standardmenu med sin egen tilpassede menu. På siden egne menupunkter i Excel viste jeg, hvordan man kan tilføje et eller flere menupunkter til standardmenuen, men i dette eksempel erstatter vi altså standardmenuen fuldstændig.
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," og klikker man på dette, vises den skræddersyede menu, man selv har lavet.
Det kan der være idé i at gøre, hvis man har lavet et program med mange specielle faciliteter, eller hvis man ønsker en stram styring af brugerens gøren og laden.
Specialmenuen vil kun være aktiv for det pågældende regneark. Det sikres af de to sidste makroer på siden ("Private Sub Workbook_Activate" og "Private Sub Workbook_Deactivate"), som skal indsættes i makrokoden til "ThisWorkbook". Det er nemt - forklaring følger længere nede på siden.
I eksemplet erstatter vi først Excels standardmenu med vores egen "tomme" menu for derefter at bygge den op punkt for punkt. Som det første menupunkt til venstre laver vi en "skrabet" version af Excels fil-menu, hvorfra man kan åbne, lukke, gemme, printe og afslutte. Det har jeg gjort for at vise, hvordan man kan kalde Excels indbyggede funktioner.
Derefter tilføjer vi vores skræddersyede menupunkter. Du må selvfølgelig selv skrive de makroer, som skal køres ved forskellige menuvalg - i eksemplet har jeg blot lavet nogle bokse, som popper op med en besked.
Du kan markere koden på denne side, kopiere (CTRL+C) og sætte den ind i et Excel VBA-modul. Du kan også downloade denne tekstfil, men skal så blot huske, at de 2 sidste makroer skal indsættes i makrodelen til ThisWorkbook.
Sub MakeMenu()
Dim cbMyBar As CommandBar
Dim cbcMain As CommandBarControl
Dim cbcSub As CommandBarControl
On Error GoTo ErrorHandle
Set cbMyBar = CommandBars.Add(Name:="Custom", _
Position:=msoBarTop, MenuBar:=True, Temporary:=True)
With cbMyBar
.Visible = True
.Protection = msoBarNoMove
End With
Set cbcMain = cbMyBar.Controls. _
Add(msoControlPopup, Temporary:=True)
With cbcMain
.Caption = "&Filer"
.Tag = "Filer"
.TooltipText = "Åbn, Gem, Udskriv og Afslut"
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Åbn..."
.OnAction = "FilOp"
.Style = msoButtonIconAndCaption
.FaceId = 23
.Visible = True
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Luk"
.OnAction = "Luk"
.Style = msoButtonAutomatic
.Visible = True
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Gem"
.OnAction = "Gem"
.Style = msoButtonIconAndCaption
.FaceId = 3
.Visible = True
.BeginGroup = True
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Gem som..."
.OnAction = "GemSom"
.Style = msoButtonIconAndCaption
.FaceId = 3
.Visible = True
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Udskriv..."
.OnAction = "Udskriv"
.Style = msoButtonIconAndCaption
.FaceId = 4
.Visible = True
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Afslut"
.OnAction = "Afslut"
.Style = msoButtonAutomatic
.Visible = True
.BeginGroup = True
End With
Set cbcMain = cbMyBar.Controls. _
Add(Type:=msoControlPopup, Temporary:=True)
With cbcMain
.Caption = "&MinMenu1"
.TooltipText = "Gør dit og dat"
End With
Set cbcSub = cbcMain.Controls. _
Add(Type:=msoControlPopup, Temporary:=True)
With cbcSub
.Caption = "&Dippedutter m.m..."
End With
With cbcSub.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "D&ippeduttter..."
.OnAction = "DummyMacro1"
.Style = msoButtonIconAndCaption
.FaceId = 136
End With
With cbcSub.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "D&uppeditter..."
.OnAction = "DummyMacro2"
.Style = msoButtonIconAndCaption
.FaceId = 136
.Enabled = True
End With
With cbcSub.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "Du&ttedipper..."
.OnAction = "DummyMacro3"
.Style = msoButtonIconAndCaption
.FaceId = 136
End With
With cbcSub.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "D&appedytter..."
.OnAction = "DummyMacro1"
.Style = msoButtonIconAndCaption
.FaceId = 136
End With
Set cbcSub = cbcMain.Controls. _
Add(Type:=msoControlPopup, Temporary:=True)
With cbcSub
.Caption = "&Varelager..."
End With
With cbcSub.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Hyldevarer..."
.OnAction = "DummyMacro1"
.Style = msoButtonIconAndCaption
.FaceId = 136
End With
With cbcSub.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Metervarer..."
.OnAction = "DummyMacro1"
.Style = msoButtonIconAndCaption
.FaceId = 136
.Enabled = True
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Kalorieberegning"
.OnAction = "DummyMacro1"
.Style = msoButtonIconAndCaption
.FaceId = 133
.Visible = True
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Beregning af overtræk"
.OnAction = "DummyMacro2"
.Style = msoButtonIconAndCaption
.FaceId = 133
.Visible = True
End With
Set cbcMain = cbMyBar.Controls.Add _
(msoControlPopup, 1, , , True)
With cbcMain
.Caption = "M&inMenu2"
.Tag = "MinMenu2"
.TooltipText = "Helte && skurke"
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Helte"
.OnAction = "DummyMacro2"
.Style = msoButtonIconAndCaption
.FaceId = 990
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Skurke"
.OnAction = "DummyMacro2"
.Style = msoButtonIconAndCaption
.FaceId = 990
End With
With cbcMain.Controls. _
Add(Type:=msoControlButton, Temporary:=True)
.Caption = "&Gem helt"
.OnAction = "DummyMacro2"
.Style = msoButtonIconAndCaption
.FaceId = 3
End With
BeforeExit:
Set cbcMain = Nothing
Set cbcSub = Nothing
Set cbMyBar = Nothing
Exit Sub
ErrorHandle:
MsgBox Err.Description & " Fejl i MakeMenu", _
vbCritical + vbOKOnly, "Fejl"
Resume BeforeExit
End Sub
Sub RemoveMenu()
Dim cbBar As CommandBar
On Error GoTo ErrorHandle
For Each cbBar In Application.CommandBars
If Not cbBar.BuiltIn Then cbBar.Delete
Next
Exit Sub
ErrorHandle:
MsgBox Err.Description & " RemoveMenu", vbOKOnly, "Fejl"
End Sub
Her følger de makroer, som køres af de forskellige menupunkter.
Sub FilOp()
Application.Dialogs(xlDialogOpen).Show
End Sub
Sub Luk()
ActiveWorkbook.Close
End Sub
Sub Gem()
ActiveWorkbook.Save
End Sub
Sub GemSom()
Application.Dialogs(xlDialogSaveAs).Show
End Sub
Sub Udskriv()
Application.Dialogs(xlDialogPrint).Show
End Sub
Sub Afslut()
Application.Quit
End Sub
Sub DummyMacro1()
MsgBox "Skriv din egen makro i stedet for denne besked.", _
vbOKOnly, "Hej-hej"
End Sub
Sub DummyMacro2()
MsgBox "Skriv noget kode i VBA.", _
vbOKOnly, "Hallo De dér!"
End Sub
Sub DummyMacro3()
MsgBox "Og med min pil og bue jeg skød en albatros.", _
vbOKOnly, "Anders And"
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()
MakeMenu
End Sub
Private Sub Workbook_Deactivate()
RemoveMenu
End Sub
De enkelte menupunkter har flere properties (egenskaber) end vist i eksemplet MakeMenu. 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
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:
|