Po wprowadzeniu wstążki w Excelu 2007, obiekt CommandBar zaczął tracić na znaczeniu. Tradycyjne menu i paski narzędzi praktycznie odeszły do lamusa. Obecnie przydają się tylko do modyfikacji wyglądu edytora Visual Basic. Wciąż jednak obecny jest trzeci typ pasków – menu kontekstowe, które pojawia się po kliknięciu w prawy przycisk myszy.
Zapomniany obiekt CommandBar
Obiekt CommandBar posiada trzy typy pasków.
W Excelu, począwszy od wersji 2007, już go nie uświadczymy. Jest on jednak wciąż dostępny w edytorze VBE.
Paski narzędzi
Gdy nie było wstążki, paski narzędzi stanowiły podstawę interfejsu Excela i aplikacji klienckich. Na paskach standardowo umieszczamy przyciski i menu rozwijane.
Menu kontekstowe
Wyskakujące okienko pop-up, które pojawia się po kliknięciu w prawy przycisk myszy na wybranym obiekcie.
Nazywane też często menu podręcznym.
Umieszcza się na nim kontrolki typu button (przyciski) i rozwijane podmenu, które również składają się z przycisków.
Do buttonów przypisujemy makra za pomocą właściwości OnAction.
Kreatywny przykład z książki
Czytając książkę Johna Walkenbacha spodobał mi się pewien przykład. Chodziło w nim o wyświetlenie nazw wszystkich arkuszy w kontrolce typu ListBox na formularzu.
Po wybraniu arkusza, automatycznie stawał się on aktywny. Celem takiego rozwiązania było zapanowanie nad większą ilością zakładek w pliku, łatwiejsza nawigacja i kontrola.
Odkrywanie koła na nowo…
O ile rozwiązanie na początku uznałem za bardzo pomysłowe, o tyle po dłuższym namyśle stwierdziłem, że jest to w pewien sposób odkrywanie koła na nowo.
Taka lista arkuszy jest już przecież zaimplementowana w Excelu. Możemy ją uaktywnić klikając prawym klawiszem myszy w jedną ze strzałek w lewym dolnym rogu obok zakładek.
Jest to menu podręczne o nazwie Workbook Tabs.
Żeby mieć szybszy dostęp do takiej listy, możemy napisać makro i podpiąć je pod przycisk. Następnie ten przycisk dodać do wyskakującego menu podręcznego.
Lista arkuszy dostępna „pod ręką”
Krótki kod wyświetla listę arkuszy w pliku. Przyznam szczerze, że nie wiem dlaczego ta kontrolka wygląda inaczej po wywołaniu makrem.
1 2 3 4 5 |
Sub WyswietlListeArkuszy() CommandBars("Workbook Tabs").ShowPopup End Sub |
Poniższy kod dodaje kontrolkę do menu podręcznego Cell. Uruchamia się ono, po kliknięciu w prawy przycisk myszy. Zaznaczonym obiektem musi być komórka lub zakres komórek.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Sub DodajKontrolke() Dim cbrPopup As CommandBar ' CommandBar Cell Dim cbrPrzycisk As CommandBarButton ' Przycisk z listą arkuszy ' Przypisujemy zmienną do menu podręcznego 1 Set cbrPopup = Application.CommandBars("Cell") ' Zresetuj menu podręczne, aby nie dodać dwa razy tego samego przycisku. ' Można ewentualnie usunąć samą kontrolkę: ' - CommandBars("Cell").Controls("&Arkusze w pliku...").Delete 2 CommandBars("Cell").Reset ' Dodajemy nowy przycisk 3 Set cbrPrzycisk = cbrPopup.Controls.Add( _ Type:=msoControlButton, Before:=1, Temporary:=True) ' Dodajemy do menu kontrolkę, określamy jej cechy 4 With cbrPrzycisk 5 .Caption = "&Arkusze w pliku..." 6 .OnAction = "WyswietlListeArkuszy" 7 .FaceId = 53 8 End With ' Zwalniamy miejsce w pamięci 9 Set cbrPopup = Nothing 10 Set cbrPrzycisk = Nothing End Sub |
Nawigacja w praktyce
Po kliknięciu w kontrolkę Arkusze w pliku… wyświetlona zostaje lista wszystkich zakładek w skoroszycie..
Zwróć proszę uwagę na kilka rzeczy:
- Szybki skrót. Listę arkuszy wyświetlisz klikając PPM i klawisz A. Nie musisz klikać myszą w przycisk Arkusze w pliku… – ja zrobiłem to w celach demonstracyjnych.
- Przycisk jest tymczasowy. Oznacza to, że nie będzie go po ponownym uruchomieniu Excela (właściwość Temporary = True).
- Reset menu podręcznego. Przed dodaniem przycisku, resetujemy menu. Nie chcemy mieć bowiem kilku takich samych przycisków Arkusze w pliku…
Na koniec jeszcze jedna bardzo ciekawa rzecz.
Za pomocą zdarzenia Worksheet_BeforeRightClick możemy przechwycić moment kliknięcia w prawy przycisk myszy (PPM). Zdarzenie to posiada dwa parametry: Cancel i Target. Możemy więc zablokować domyślne menu kontekstowe i zamiast niego wyświetlić inne.
1 2 3 4 5 6 |
Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True ' Nie wyświetlaj domyślnego okienka Application.Dialogs(xlDialogCalculation).Show End Sub |
Poniżej, w Arkusz1 wyświetlam okienko związane z przeliczaniem danych. W Arkusz2 działa zaś domyślne okienko pop-up.