W programie Access podobnie jak w przypadku Excela, Worda, PowerPointa czy Visio możemy tworzyć własne przyciski na wstążce.
Nie będę opisywał podstaw związanych z tworzeniem wstążki (składnia XMLa), dlatego jeśli nigdy nie miałeś do czynienia z wstążką zerknij do wpisu: Dodawanie przycisków do własnych funkcji na wstążce. Ten artykuł jest uzupełnieniem wyjaśniającym różnice pomiędzy tworzeniem wstążki dla Excela a Accessa.
Pliki dla nowego pakietu Office (Word, Excel, PP) to tak naprawdę archiwa ZIP zawierające kilka(naście) plików XML. Dodanie własnych przycisków na wstążce polegało tak naprawdę na wstrzyknięciu dodatkowego pliku XML (oraz ewentualnie plików z własnymi ikonami) do archiwum zawierającego opis wstążki (i dodanie odpowiedniej referencji do tego pliku). W przypadku programu Access pliki tworzone przez ten program nie są archiwami ZIP tylko plikami binarnymi. Dlatego też nie możemy do takiego pliku „dokleić” pliku XML zawierającego opis wstążki. Dlatego też należy wygenerować kod XML wstążki i zapisać go w specjalnej tabeli.
W tym celu utwórz nową tabelę i nazwij ją: USysRibbons. Następnie w tej tabeli należy utworzyć minimum 3 kolumny o następujących nazwach:
Kolumna | Typ danych |
ID | Autonumerowanie |
RibbonName | Krótki tekst |
RibbonXml | Długi tekst |
Oczywiście ta tabela może mieć więcej kolumn natomiast te 3 wykorzystuje program Access. Ja dodatkowo w tej tabeli dodaję swoją dodatkową kolumnę o nazwie komentarz (zapisuję tam dodatkowe swoje notatki).
Pobierz przykładowy plik Accessa z wstążką
Tutaj mała uwaga wszystkie tabele mające nazwy zaczynające się od przedrostków MSys lub USys są domyślnie niewidoczne w okienku nawigacji. Dlatego też należy się upewnić czy mamy aktywną opcję Pokaż obiekty systemowe. W tym celu wybierz polecenie Plik->Opcje. Następnie w oknie dialogowym Opcje programu Access wybierz zakładkę Bieżąca baza danych i odnajdź przycisk Opcje nawigacji… Pojawi się okno dialogowe Opcje nawigacji. Zaptaszkuj w tym oknie opcję Pokaż obiekty systemowe. Oczywiście jak skończysz pisać swoją aplikację w programie Access to warto odptaszkować to pole aby nikt nie grzebał w tabelach systemowych.
Garść wskazówek
Zanim przejdziemy dalej zapoznaj się z moimi przemyśleniami, które ułatwią Tobie pracę nad wstążką.
Wskazówka: ponieważ niewygodnie się edytuje rekordy będąc w tabeli warto utworzyć na bazie tej tabeli wygody formularz (najzwyczajniej w świecie mając otworzoną tabelę USysRibbons na karcie Tworzenie wybierasz polecenie Formularz)
Wskazówka2: jeśli formularz będzie miał domyślną nazwę taką samą jak tabela tj. USysRibbons to również nie będzie on wyświetlany w okienku nawigacji, gdy jest odptaszkowane pole Pokaż obiekty systemowe. Jeśli chcesz ukryć obiekty systemowe, ale mieć dostęp do formularza to po prostu zmień mu nazwę np. na Wstążka.
Wskazówka3: jeśli mimo wszystko chcesz aby formularz był niewidoczny, ale czasem chcesz uruchomić ten formularz możesz wejść do edytora VBA i w okienku Immediate wpisać następujący kod: Docmd.OpenForm(„USysRibbons”) Jeśli nie tworzyłeś formularza to możesz również z poziomu okienka Immediate otworzyć tę tabelę pisząc: Docmd.OpenTable („USysRibbons”)
Wskazówka4: jakoś na formularzu niezbyt wygodnie mi się edytuje kod XML. Ja osobiście edytuję kod wstążki w programie Office RibbonX Editor (utworzyłem sobie taki pusty plik XLSX i na Excelu testuję wygląd wstążki). Kolejną zaletą jest to, że program Office RibbonX Editor ma przycisk Validate sprawdzający czy w kodzie XML wstążki nie ma jakiś błędów. Po utworzeniu kodu kopiuję go do schowka i wklejam w formularzu w programie Access. Nawet dla wygody na formularzu utworzyłem dwa pomocnicze przyciski: Kopiuj i Wklej, które kopiują/wklejają do/z schowka zawartość pola tekstowego RibbonXml.
Oto kod obsługujący kopiowanie, wklejanie
Private Sub cmdCopy_Click()
On Error GoTo cmdCopy_Click_Error
Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
Me.RibbonXml.SetFocus
clipboard.SetText Me.RibbonXml.Text
clipboard.PutInClipboard
cmdCopy_Click_Error2:
Exit Sub
cmdCopy_Click_Error:
MsgBox Err.Description, vbExclamation, "cmdCopy_Click"
Resume cmdCopy_Click_Error2
End Sub
Private Sub cmdPaste_Click()
On Error GoTo cmdPaste_Click_Error
Dim clipboard As MSForms.DataObject
Dim strContents As String
Dim txt As String
Me.RibbonXml.SetFocus
Me.RibbonXml.Text = ""
Set clipboard = New MSForms.DataObject
clipboard.GetFromClipboard
txt = clipboard.GetText
Me.RibbonXml = txt
DoCmd.RunCommand acCmdSaveRecord
cmdPaste_Click_Error2:
Exit Sub
cmdPaste_Click_Error:
MsgBox Err.Description, vbExclamation, "cmdPaste_Click"
Resume cmdPaste_Click_Error2
End Sub
Aby kod zadziałał należy w oknie References (Tools->References…) dodać bibliotekę Microsoft Forms 2.0 Object Library (jeśli nie znajdziesz jej na liście to kliknij w przycisk Browse i wskaż plik: c:\Windows\System32\fm20.dll)
Do dzieła!
Uzbrojeni w tę wiedzę możemy zaprojektować wstążkę. W tym celu w tabeli USysRibbons dodaj następujący rekord:
RibbonName – Domyślna
RibbonXml:
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="tabTestowaKarta" label="Moje przyciski" insertBeforeMso="TabHomeAccess">
<group id="grpPierwszaGrupa" label="Pierwsza grupa">
<button id="Pierwszy" label="Pierwszy przycisk" imageMso="FileNew" onAction="ButtonOnAction" />
<button id="Drugi" label="Drugi przycisk" imageMso="Folder" onAction="ButtonOnAction" />
</group>
<group id="grpDrugaGrupa" label="Druga grupa">
<button id="Trzeci" label="Trzeci przycisk" imageMso="HappyFace" size="large" onAction="ButtonOnAction" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Uwaga: w przypadku większości programów pakietu Office karta Narzędzia główne ma ID TabHome. W przypadku programu Access ma ona ID TabHomeAccess.
Musimy jeszcze dodać w VBE dodać nowy moduł a w nim następujący kod:
Option Compare Database
Option Explicit
Public Const SW_SHOWNORMAL = 1
#If VBA7 Then
Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal Hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal Hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Sub Open_WWW()
Dim Z As Long
Z = ShellExecute(0, "open", "https://www.kursvba.pl", "", "", SW_SHOWNORMAL)
End Sub
Public Sub ButtonOnAction(control As IRibbonControl)
Select Case control.ID
Case "Pierwszy"
MsgBox "Kliknąłeś w PIERWSZY przycisk", vbInformation
Case "Drugi"
MsgBox "Kliknąłeś w DRUGI przycisk", vbInformation
Case "Trzeci"
MsgBox "Kliknąłeś w TRZECI przycisk", vbInformation
Case "WWW"
Call Open_WWW
Case Else
MsgBox "Dodaj kod obsługujący przycisk o ID: " + control.ID, vbExclamation
End Select
End Sub
Następnie zapisz zmiany i zamknij program Access. Przejdź do Plik->Opcje i w oknie dialogowym Opcje programu Access wybierz zakładkę Bieżąca baza danych i w polu Nazwa wstążki wybierz naszą wstążkę (nadaliśmy jej nazwę Domyślna)
Uwaga: nowo dodana wstążka będzie widoczna dopiero gdy zamkniesz i ponownie uruchomisz program Access.
Bonus – inne wstążki
Nasza wstążka o nazwie Domyślna jest globalną wstążką dla całej aplikacji. Ale jeśli chcesz to dla dowolnego raportu lub formularza możesz utworzyć inną wstążkę. W tym celu dodaj nową wstążkę. W RibbonName wpisz jej nazwę np. inna. W RibbonXml wpisz następujący kod XML:
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="tabTestowaKarta2" label="Inne przyciski" insertBeforeMso="TabHomeAccess">
<group id="grpWWW" label="WWW">
<button id="WWW" label="WWW" imageMso="_4" onAction="ButtonOnAction" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Następnie zapisz zmiany i ponownie uruchom program Access. Przejdź do dowolnego formularza a następnie w Arkuszu właściwości wybierz tę nowo utworzoną wstążkę.
Teraz ilekroć uruchomisz ten formularz będą dostępne dwie karty. Karta Moje przyciski (bo cały czas jest widoczna domyślna wstążka) i karta Inne przyciski (bo jest załadowana też wstążka dla tego formularza). Ale w przypadku innych formularzy karta Inne przyciski nie będzie widoczna.
Wskazówka: ponieważ można tworzyć własne niestandardowe wstążki zawierające dodatkowe karty dla każdego z formularzy/raportów ja zawsze w tabeli USysRibbons dodaję kolumnę Komentarz i tam zamieszczam dodatkowe informacje np. na jakich formularzach owa wstążka jest używana.
Wskazówka: Ilekroć w tabeli USysRibbons dodajesz nowy rekord (nową wstążkę) to aby program Access „ją widział” musisz zamknąć i ponownie uruchomić program Access co jest upierdliwe. Ja zawsze na karcie Narzędzia bazy danych klikam w przycisk Kompaktuj i napraw bazę danych. Kompaktowanie ma ten efekt uboczny, że Access musi zamknąć, skompaktować i ponownie uruchomić bazę danych 😊