Generátor menu – vlastní CommandBar

Generátor menu verze 1.1 je nástroj pro vytváření menu a vlastních panelů nástrojů typu CommandBar, jak je známe z Excelu 2003 a dřívějších. Nenutí uživatele zasahovat do programového kódu VBA, pokud se změní požadavky na jeho strukturu, položky a přidružená makra. Jako asi první s ním kdysi dávno přišel John Walkenbach, uplatnění má ale i dnes.

Generátor - list nastavení
Generátor – list nastavení

Generátor umožňuje vytvářet tři typy panelů CommandBar:
– jednořádkový panel nástrojů pod kartou Doplňky (Excelu 2007 a novější)
– přidružené kontextové menu pod pravým tlačítkem myši
– samostatné kontextové menu pod pravým tlačítkem myši za současného stisku CTRL nebo SHIFT
– bonusový panel využitelných vestavěných ikon a jejich vlastností FaceID

Vlastní panel nástrojů CommandBar pod kartou Doplňky
Vlastní panel nástrojů CommandBar pod kartou Doplňky
Přidružené kontextové menu
Přidružené kontextové menu
Samostatné kontextové menu
Samostatné kontextové menu

Panel nástrojů FaceID

Těchto panelů lze najít na internetu spousty. Bohužel drtivá většina z nich není optimalizovaná pro zobrazování v Pásu karet. Pustil jsem se tedy do inovace vlastního panelu z dřívější doby.

Panel nástrojů FaceID
Panel nástrojů FaceID

Panel najdete pod kartou Doplňky. Vlastnost FaceID můžete vidět v popisku po najetí myši nad prvek. Klepnutí na ikonu vloží její FaceID do aktivní buňky. Poslední čtyři prvky jsou ovládací.

Tip
Přehled prvních 10000 ikon s čísly ID

Technická část
Menu jsou tříúrovňová. Veškerá nastavení se nachází na jednom listu. Předpokládá se, že ten bude nedílnou součástí sešitu (lze jej pochopitelně skrývat). Ruční vytváření/odstranění panelu zastoupí programový kód umístěný v modulu ThisWorkbook.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'událost otevření sešitu
Private Sub Workbook_Open()

    'vytvoření panel po otevření sešitu
    Call VytvoritPanel

End Sub

'událost zavírání sešitu
Private Sub Workbook_BeforeClose(Cancel As Boolean)

    'odstranění panelu při zavírání sešitu
    Call SmazatPanel

End Sub

Procedura pro odstranění panelu je užitečná jen za předpokladu, že nevytváříme dočasné. tzv. „temporary“ panely (viz volba Stálý panel). O ty se postará během zavírání sešitu Excel sám.

Samostatné kontextové menu lze navázat na konkrétní list nebo všechny listy sešitu. V prvním případě se umístí obslužná událostní procedura do modulu daného listu, ve druhém do modulu sešitu ThisWorkbook.

modul listu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'událost klepnutí pravým tlačítkem myši platná pro daný list

Private Const VK_CONTROL As Long = &H11
Private Const VK_SHIFT As Long = &H10

Private VK_KEY As Long

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

    Select Case wshPanel.Range("E7").Text
        Case "CTRL"
            VK_KEY = VK_CONTROL
        Case "SHIFT"
            VK_KEY = VK_SHIFT
    End Select

    If (GetKeyState(VK_KEY) And &HF0000000) <> 0 Then
        Call ZobrazitKontextovyPanel
        Cancel = True
    End If

End Sub

nebo modul sešitu ThisWorkbook:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Const VK_SHIFT As Long = &H10

Private VK_KEY As Long

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

'událost klepnutí pravým tlačítkem myši platná pro celý sešit
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    Select Case wshPanel.Range("E7").Text
        Case "CTRL"
            VK_KEY = VK_CONTROL
        Case "SHIFT"
            VK_KEY = VK_SHIFT
    End Select

    If (GetKeyState(VK_KEY) And &HF0000000) <> 0 Then
        Call ZobrazitKontextovyPanel
        Cancel = True
    End If

End Sub

Daná technika využívá odchytávání kláves při stisknutí pravého tlačítka myši s pomocí API funkce GetKeyState.

Tip
Samostatné kontextové menu (ShowPopup) lze vyvolávat kupříkladu i na formuláři ve VBA.

U položek menu lze navolit ikony 16×16 px. Jako zdroj poslouží samostatný soubor BMP (včetně masky průhlednosti), nebo odkaz na vlastnost FaceID vestavěné ikony (na výběr tisíce ikon).

Proč to všechno?
Panel nástrojů (CommandBars) představují klasické ovládání aplikací. Do Excelu verze 2007 bylo možné je kotvit ke krajům okna nebo je mít plovoucí a víceřádkové. Běžný uživatel byl schopen si je navrhnout sám. Tohle všechno Microsoft v Excelu 2007 zabil a přišel s nafouknutým Pásem karet (ribbonem), ve kterém si běžný smrtelník neupraví prakticky nic. Návrh a změny dodnes není možné kloudně uskutečnit v reálném čase, Office Custom UI Editor pokud vím stále neumí češtinu, Ribbon Designer ve Visual Studiu má své mouchy, a celá obsluha je jeden velký otravný moloch, kterému nepomůže ani nabídka nových ovládacích prvků. Microsoft přitom záměrně mlží s tím, že CommandBar není možné v novodobých Excelech zobrazit. Původní panely (Worksheet Menu Bar, Standard, Formatting a další) stále obsahuje a zatraceně dobře si hlídá, aby nešly vyvolat! Navíc některé z nich doposud zobrazuje a zvládá i hybridní panely (Envelope, Kukátka). A že to jde, dokazují i doplňky třetích stran. Ostatně volnost obojího můžeme vidět i v báječné kancelářské „kopírce“ – WPS Office. Nejsou výjimkou aplikace, v nichž lze vzhled prostředí přepínat.

Víte už, jak danou pomůcku využijete? Umíte ocenit práci a čas nad ní strávený? Dejte to znát…

Tip
Pokud má vaše aplikace složité menu, které se navíc liší podle oprávnění uživatelů, nabízím polotovar grafického menu. Kromě uvedeného umí řešit i jazyk, barevnost a další věci.

Moderní grafické menu v Excelu
Moderní grafické menu v Excelu
Moderní grafické menu v Excelu - náhled do nastavení
Moderní grafické menu v Excelu – náhled do nastavení

Příloha
generator_menu_11.zip