Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Budujemy własną wstążkę w programie Microsoft Word

W poprzednich kilku wpisach zaprezentowałem przykłady zastosowania VBA w Wordzie i Excelu. Nie pokazywałem jednak w jaki sposób można wygodnie uruchamiać własne skrypty VBA. Standardową metodą uruchamiania makr jest otworzenie okna z listą dostępnych makr VBA (ALT+F8), a następnie wybranie makra i uruchomienie go przyciskiem. Nie jest to zbyt wygodna metoda, zwłaszcza jeśli z jakiegoś makra będziemy korzystać często. W dzisiejszym wpisie chciałbym Wam pokazać chyba najprostszą metodę przebudowy wstążki (RibbonX), dodawania do niej nowych elementów oraz tworzenia Własnych przycisków, którymi będziemy mogli uruchamiać własne makra. Temat jest dosyć obszerny, dlatego skupię się na podstawach, które powinny wystarczyć każdemu do prostej edycji wstążki. Zaprezentuję też dokumentację i materiały, które będą bardzo pomocne przy dalszej eksploracji tej techniki.

Wymagania wstępne

Przede wszystkim będziemy potrzebować edytora XML, który wykorzystamy do edycji pliku normal.dotm. Plik ten jest standardowym szablonem dokumentów, przechowującym nasze makra VBA. Służy on również do przechowywania wstążki. Standardowo jest zlokalizowany w: "C:\Users\NazwaUżytkownika\AppData\Roaming\Microsoft\Szablony"Dedykowany edytor Microsoftu (Custom UI Editor) można pobrać np. z tej strony. Testowałem go na wersjach 2007 i 2010, a pisząc ten wpis, sprawdzę czy jest kompatybilny także z wersją 2013. Poza samym edytorem potrzebna będzie nam dokumentacja, zawierająca nazwy poszczególnych elementów na wstążce. Każda wersja Office'a ma nieco inny zestaw elementów. Dokumentację do wersji 2013 znajdziecie na stronie Microsoftu tutaj. Na koniec równie ważny dokument, zawierający galerię ikonek wykorzystywanych w Wordzie. Możemy je przeglądać i zapoznać się z ich nazwami, poprzez otworzenie pliku, który można pobrać tutaj.

Na początek coś prostego

Uruchamiamy edytor XML i otwieramy w nim plik normal.dotm. Plik wydaje się być pusty. Z punktu widzenia tego edytora tak jest, ponieważ nie znajduje się w nim żadna niestandardowa konfiguracja wstążki.
Na początek proponuję wkleić poniższy kod:<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="CustomTab" label="Custom Tab"> <group id="CustomGroup" label="Custom Group"> <button id="CustomButton" label="Custom Button" size="large" imageMso="HappyFace" onAction="test" /> </group> </tab> </tabs > </ribbon> </customUI>Jest to nieco uproszczona wersja przykładu z MSDN Pomoże nam zrozumieć ogólne zasady budowania wstążki i przypisywania makr VBA do własnych elementów wstążki.
W efekcie otrzymujemy własną kartę z przyciskiem.

Schemat pliku xml

Pierwszy tag (customUI) reprezentuje własny wygląd wstążki. Jest potrzebny do zdefiniowania przestrzeni nazw atrybutem xmlns. Dalej mamy tag <ribbon>, który obejmuje samą wstążkę. Wewnątrz tagu <ribbon> mamy tag <tabs> reprezentujący zbiór kart, a w nim wiele tagów <tab>, czyli poszczególne karty. Każda karta może składać się z wielu grup <group>. Wewnątrz grupy umieszczamy poszczególne elementy. Ten prosty przykład tworzy nową kartę o nazwie "Custom Tab". Po zapisaniu pliku i uruchomieniu Worda, nasza karta pojawi się na końcu wstążki, jako ostatnia. Będzie się w niej znajdowała jedna grupa. Atrybut label decyduje o napisie, jaki pojawi się na karcie. Label jest ogólnie używane do podpisywania wszystkich elementów. Mamy więc label też jako nazwę grupy, a także napis na przycisku. <button> dodaje przycisk do grupy. Rozmiar przycisku ustawiamy za pomocą atrybutu size, który może przyjmować wartość normal lub large.

Dodawanie ikonek

Atrybut imageMso określa ikonkę przycisku ze zbioru predefiniowanych ikonek. Wygląd i nazwę ikonki możemy sprawdzić w pliku, który podałem we wstępie. Po otwarciu dokumentu, należy w Wordzie 2013 przejść do menu plik i na dole wybrać "ImageMso 0".
Istnieje możliwość wstawiania własnych ikon. W tym celu musimy posiadać plik w formacie .png. Jeśli już mamy plik ikony, to w edytorze xml z menu "Insert" wybieramy "Icons" i wskazujemy pliki ikony. Następnie w miejscu atrybutu "imageMso" wpisujemy "image", a jako wartość (nazwę) podajemy nazwę widoczną przy ikonce z lewej strony edytora. W moim przypadku jest to "dobreprogramy" (ikonka dobrych programów).
Efekt zmiany widoczny na zrzucie ekranu poniżej:

Podpinanie makra VBA pod własny przycisk

Aby podpiąć nasz przycisk do makra, używamy atrybutu onAction, którego wartość musi być dokładną nazwą makra, które ma zostać uruchomione po wciśnięciu przycisku. Aby przetestować atrybut onAction, w Wordzie musimy napisać jakieś makro o nazwie podanej w pliku normal.dotm z poziomu edytora XML. W moim przypadku jest to "test".
Jest to najprostsze makro, jakie można wymyślić. Wyświetla okienko z komunikatem. Pokazuje ono jednak jeden bardzo ważną rzecz, o której trzeba pamiętać. Nasze makro (procedura) przyjmuje jako parametr jeden argument - obiekt klasy IRibbonControl. Dzięki temu nasz kod VBA dostaje dostęp i kontrolę nad wstążką. Poniżej efekt działania makra wywołanego przez wciśnięcie przycisku z ikonką DP.

Dalsze modyfikacje wstążki

W wielu przypadkach utworzenie własnej karty na wstążce z kilkoma przyciskami uruchamiającymi nasze makra w zupełności wystarczy. Jest to najprostsza rzecz jaką można zrobić ze wstążką. Jednakże apetyt rośnie w miarę jedzenia. Gdy oswoimy się nieco z pisanie makr, a nasza biblioteka skryptów zacznie rosnąć, możemy odczuwać potrzebę dalszych modyfikacji. Sięganie po przyciski na ostatniej karcie jest niewygodne. Może lepiej byłoby je przenieść na początek? A może w ogóle przebudować całą wstążkę od podstaw? To wariant dla twardzieli, bardzo czasochłonny, ale dający najlepsze dopasowanie do naszych potrzeb i nawyków.

Ukrywanie standardowych kart

Relatywnie łatwo możemy poukrywać niektóre karty. Co prawda to samo można jeszcze łatwiej uzyskać bezpośrednio z poziomu Worda w opcjach dostosowywania wstążki, ale warto zapoznać się również z tą techniką, ponieważ będzie ona przydatna przy bardziej złożonych manipulacjach. Starsze wersje Worda nie miały tak rozbudowanych narzędzi dostosowywania wstążki i dla nich edycja pliku edytorem XML była jedynym rozwiązaniem. Poza tym, o ile możliwe jest z poziomu opcji dostosowywania wstążki położenie przycisku uruchamiającego własne makro, to nie da się w ten sposób dodawać innych elementów niż przyciski, połączone z makrami, a ilość ikonek jakie można przypisać jest mocno ograniczona.

Powiedzmy, że chcemy wyłączyć pierwszą kartę narzędzi głównych. W pliku z wykazem komponentów musimy odszukać angielską nazwę tej wstążki. W kolumnie ControlType włączamy sobie filtrowanie tak, aby pozostawić tylko elementy typu "tab". Są one wypisane w kolejności zgodnej z kolejnością wyświetlania na wstążce, co ułatwia identyfikację. Same nazwy mogą być w niektórych przypadkach mylące. Przykładowo "Narzędzia główne" nazywają się "TabHome". Gdy już znamy nazwę karty, którą chcemy ukryć, w kodzie XML, wewnątrz tagu <tabs> wstawiamy:<tab idMso="TabHome" visible="false" />Atrybut visible określa czy karta ma być wyświetlana czy nie. Wartość false ukrywa kartę.

Nasza karta pierwsza na wstążce

Zróbmy teraz lekką wariację i zamiast ukrywać domyślne wstążki, przesuńmy naszą wstążkę na sam początek. W tym celu wykorzystamy atrybut insertBeforeMso. Nasz tag wstawiający naszą kartę powinien wyglądać następująco:<tab id="CustomTab" label="Custom Tab" insertBeforeMso="TabHome"> Tab Home domyślnie jest pierwszą kartą, dlatego jeśli podamy ją jako wartość dla atrybutu insertBeforeMso, nasza karta wyświetli się jako pierwsza na liście.

Częściowo zmieniona wstążka standardowa

Stosunkowo łatwy iw miarę niezbyt czasochłonny sposób modyfikacji wstążki to ukrycie jednej lub dwóch grup ze standardowej karty i wstawienie w ich miejsce swojej grupy ze standardowymi przyciskami ułożonymi w pasujący nam sposób. Standardowe grupy może i nie są złe, aczkolwiek w codziennej pracy przeważnie wykorzystujemy tylko część umieszczonych przycisków. Jednocześnie zdarza nam się stosunkowo często korzystać z opcji ukrytych, pojawiających się we wstążkach kontekstowych, albo w ogóle niedostępnych z poziomu wstążki. W taki sytuacjach, miło jest położyć je w miejsce tych nieużywanych. Można też zastąpić standardowe przyciski, przyciskami, które zasadniczo robią to samo, ale w nieco inny sposób za pomocą naszych skryptów VBA. Przykładowo zamiast standardowego drukowania, możemy pod ikonkę drukowania, wstawić nasze makro, które drukuje dokumenty w jakiś zmieniony sposób (np. same parzyste strony). Możemy w ten sposób zmodyfikować działanie wielu domyślnych opcji.

Poniżej zamieszczam kod znaleziony na stronie Gregory K. Maxey'a, którą gorąco polecam! Była mi bardzo pomocna przy stawianiu pierwszych kroków z edycją wstążki. <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <ribbon> <tabs> <tab idMso="TabHome"> <group idMso="GroupEditing" visible="false" /> <group idMso="GroupClipboard" visible="false" /> <group id="CustomGroup" label="Editing and Clipboard" insertBeforeMso="GroupFont"> <splitButton idMso="PasteMenu" size="large" /> <button idMso="Cut" /> <button idMso="Copy" /> <control idMso="FormatPainter" /> <separator id="Sep1" /> <button idMso="FindDialog" /> <button idMso="ReplaceDialog" /> <menu idMso="SelectMenu" /> <dialogBoxLauncher > <button idMso="ShowClipboard" /> </dialogBoxLauncher> </group> </tab> </tabs> </ribbon> </customUI>

Powyższy kod zmienia wygląd standardowej karty Home (Narzędzia główne). Pierwsze dwa wiersze wewnątrz karty ukrywają grupę schowka (pierwsza grupa) i edycji (ostatnia grupa). W ich miejsce tworzona jest nowa grupa o nazwie "Editing and Clipboard", która ma połączyć te dwie standardowe grupy w całość. Wstawiana jest ona przed grupą czcionki, a więc po schowaniu grupy schowka, przed pierwszą grupą.

SplitButton jest przyciskiem z rozwijaną listą opcji. Separator dzieli pionową kreską grupę na podgrupy. Menu to rozwijana lista podobna do splitButton'a, ale jej kliknięcie samo w sobie nie wywołuje żadnej akcji, poza rozwinięciem listy. DialogBoxLauncher to mały kwadracik w prawym dolnym rogu grupy, po kliknięciu którego pojawia się okno lub inny element z opcjami.

Zróbmy krok dalej

Manipulowanie gotowymi komponentami takimi, jak karty, grupy czy poszczególne kontrolki jest stosunkowo proste. Znacznie trudniej jest sterować działaniem własnych kontrolek. W pierwszej części wpisu pokazałem jak połączyć makro VBA z własnym przyciskiem. Teraz chciałbym wyjaśnić jak pracować z rozwijanymi listami w sposób dynamiczny, tzn. taki, że ostateczny kształt naszej niestandardowej kontrolki zależy od wyniku wykonywanego kodu.

Statyczna lista rozwijana

Jeśli nie czujemy się na siłach aby zapanować nad kodem sterującym listę w sposób dynamiczny, możemy umieścić na wstążce statyczną listę rozwijaną. Używając pojęcia "statyczna" mam na myśli listę, której elementy są na sztywno zdefiniowane w pliku normal.dotm i za każdym razem lista ta będzie na wstążce zawierać te same elementy.
Listę taką tworzymy przy pomocy tagu <dropDown>.<dropDown id="dropDown" label="DropDown" onAction="PokazInfo"> <item id="item1" label="Item 1" /> <item id="item2" label="Item 2" /> <item id="item3" label="Item 3" /> </dropDown>Tag <item> to poszczególne elementy w rozwijanej liście. onAction reaguje na wybór elementu z listy. Pokażę teraz jak skonstruować makro, reagujące na takie zdarzenie.Sub PokazInfo(ByVal control As IRibbonControl, selectedID As String, selectedIndex As Integer) Select Case selectedIndex Case 0 Makro1 Case 1 Makro2 Case 2 Makro3 End Select End SubTym razem procedura przyjmuje aż 3 argumenty, choć w kodzie korzystamy tylko z jednego - selectedIndex. Wszystkie muszą być jednak wpisane, aby kontrolka działała prawidłowo. Konstrukcję Select Case omawiałem z jednym z poprzednich wpisów na temat VBA. Sprawdzamy tutaj, który element z rozwijanej listy został wybrany. Numeracja elementów zaczyna się od 0, więc pierwszy element ma wartość indeksu równą 0. Makro1, 2 i 3 to nazwy procedur VBA, które mają zostać uruchomione po wyborze danego elementu z rozwijanej listy. Możemy sobie zdefiniować np. kilka różnych sposobów wklejania zawartości schowka, np.: normalny, z pogrubioną czcionką, tekst pisany dużymi literami.

Dynamiczna lista rozwijana

Dynamiczna lista rozwijana daje dużo większe możliwości. Elementy listy mogą być przykładowo pobrane z bazy danych i wstawione do listy przy wczytywaniu wstążki. Niestety obsługa takiej listy jest odrobinę bardziej skomplikowana. Po pierwsze musimy zadbać o to by wraz z wczytywaniem wstążki były uruchamiane jakieś makro. Możemy je wykorzystać np. do pobrania danych z bazy, ale także do utworzenia instancji obiektu klasy IRibbonUI, który pozwoli na modyfikowanie wyglądu w trakcie pracy użytkownika.
Po stronie pliku normal.dotm w tagu <customUI> musimy dodać atrybut onLoad, który przyjmuje nazwę makra, mającego się uruchamiać wraz z wczytywaniem się wstążki. Ja zazwyczaj nazywam je po prostu Onload. Po stronie kodu VBA tworzymy to makro: Public myRibbon As IRibbonUI Sub Onload(ribbon As IRibbonUI) Set myRibbon = ribbon End SubPublic służy do deklarowania zmiennych publicznych. Są to zmienne, które są dostępne wewnątrz całego modułu, a więc można się do nich odwoływać z każdej procedury wewnątrz modułu. Deklarujemy zmienną interfejsu wstążki, a następnie wewnątrz procedury Onload przypisujemy jej wstążkę przekazaną z pliku normal.dotm jako parametr procedury. Może się to wydawać trochę niejasne, ale generalnie chodzi o to, żeby wczytana wstążka była dostępna w kodzie VBA dla każdej procedury. Za chwilę wyjaśnię na konkretnym przykładzie jak można to wykorzystać. Teraz w pliku normal.dotm musimy stworzyć dropDown w inny sposób niż poprzednio.<dropDown id="myDropDown" label="DropDown" onAction="PokazInfo" getItemCount="ItemCount" getItemLabel="ItemLabel" getSelectedItemIndex="ItemIndex"> </dropDown>Jak łatwo się zorientować nie ma tutaj zdefiniowanych elementów listy. Są za to trzy inne tajemnicze atrybuty. Pozwalają one na przekazanie do procedur VBA takich parametrów dropDown'a jak ilość elementów listy, etykiety poszczególnych elementów oraz domyślnie wybrany element. Dzięki temu możemy sobie zbudować dropDowna z poziomu kodu VBA.
Poniżej wkleję kod tych trzech procedur: "ItemCount", "ItemLabel", "ItemIndex". Ich nazwy są dowolne. Sub ItemCount(ByVal control As IRibbonControl, ByRef count) count = 4 End Sub Sub ItemLabel(ByVal control As IRibbonControl, Index As Integer, ByRef label) label = Choose(Index + 1, "Wybierz element...", "Element1", "Element2", "Element3") End Sub Sub ItemIndex(ByVal control As IRibbonControl, ByRef Index) If (control.ID = "myDropDown") Then Index = 0 End If End SubZmienna count w procedurze ItemCount przechowuje informację o ilości elementów rozwijanej listy. Domyślnie jest to wartość 0. Dlatego jeśli chcemy utworzyć jakieś elementy, musimy znać ich ilość i podać w tej procedurze przypisując tę wartość do zmiennej count. Ustawiam 4 elementy, ponieważ chcę, aby pierwszy element był poświęcony na etykietę typu "Wybierz odpowiednią wartość z listy".

Druga procedura może siać dezorientację. Spróbuję wyjaśnić w miarę łopatologicznie co się tutaj dzieje. Otóż procedura ta jest wywoływana tyle razy, ile elementów ma lista. Za każdym razem wartość zmiennej Index się zmienia, począwszy od 0, rosnąc o 1, zupełnie jakby procedura była wywoływana w pętli. Funkcja Choose zwraca element o zadanym indeksie z listy elementów, przy czym numeracja tej listy zaczyna się od 1, a nie od 0. Ot tak, dla zmylenia przeciwnika. Dlatego do zmiennej Index dodajemy 1, aby zniwelować tę różnicę. Kolejne argumenty funkcji Choose to etykiety naszych elementów rozwijanej listy, gdzie pierwszy, jak już wspomniałem, jest tylko informacją dla użytkownika, a nie wartością do wybrania przez niego. Tak wybraną wartość z listy elementów przypisujemy do zmiennej label, która przechowuje etykietę elementu listy rozwijanej.

Ostatnia procedura ustawia wartość zmiennej Index, która wskazuje na element, który ma być wybrany z rozwijanej listy w momencie wczytania się wstążki. Domyślnie jest to 0, więc w naszym przypadku użycie tej procedury jest zbędne, aczkolwiek pokazuję ją, bo czasem może się zdarzyć, że domyślnie chcemy wyświetlić inny element listy jako widoczny. Pozostaje nam nieco zmodyfikowana wersja procedury, która wywołuje inne procedury w zależności od indeksu wybranego elementu rozwijanej listy. Sub PokazInfo(ByVal control As IRibbonControl, selectedID As String, selectedIndex As Integer) Select Case selectedIndex Case 0 'Nic nie robimy bo zerowy element jest tylko etykietą Case 1 Makro1 Case 2 Makro2 Case 3 Makro3 End Select myRibbon.InvalidateControl control.ID End SubOstatnia linijka w procedurze powoduje "zaktualizowanie" wyglądu wstążki, a konkretnie to wskazanego elementu wstążki. Element ten wskazujemy przez id kontrolki. Odświeżenie sprawi, że indeks ponownie zostanie ustawiony na 0. Technikę tę możemy wykorzystywać do aktualizowania stanu każdej własnej kontrolki. W ten sposób możemy umieszczać na wstążce komunikaty jako reakcję na zachowanie użytkownika. Z własnego doświadczenia wiem, że odświeżanie stanu wstążki czasem może powodować wywalanie się kodu VBA, ale generalnie działa to dobrze.

Kod XML i VBA

Na koniec zamieszczam cały kod XML i VBA, gdyby ktoś chciał sobie potestować bez czytania dokładnie całości wpisu.

XML<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Onload"> <ribbon> <tabs> <tab id="CustomTab" label="Makra VBA"> <group id="CustGrp" label="Imieniny" > <dropDown id="myDropDown" label="DropDown" onAction="Items" getItemCount="ItemCount" getItemLabel="ItemLabel" getSelectedItemIndex="ItemIndex"> </dropDown> </group> </tab> </tabs> </ribbon> </customUI>

VBAOption Explicit Public myRibbon As IRibbonUI Sub Onload(ribbon As IRibbonUI) Set myRibbon = ribbon End Sub Sub Items(ByVal control As IRibbonControl, selectedID As String, selectedIndex As Integer) Select Case selectedIndex Case 0 'nic nie robimy Case 1 Makro1 Case 2 Makro2 Case 3 Makro3 End Select myRibbon.InvalidateControl control.ID End Sub Sub ItemCount(ByVal control As IRibbonControl, ByRef count) Debug.Print count count = 4 End Sub Sub ItemLabel(ByVal control As IRibbonControl, Index As Integer, ByRef label) label = Choose(Index + 1, "Wybierz element...", "Element 1", "Element 2", "Element 3") End Sub Sub ItemIndex(ByVal control As IRibbonControl, ByRef Index) Debug.Print Index If (control.ID = "myDropDown") Then Index = 0 End If End Sub Sub Makro1() MsgBox "Uruchomiono Makro1" End Sub Sub Makro2() MsgBox "Uruchomiono Makro2" End Sub Sub Makro3() MsgBox "Uruchomiono Makro3" End Sub

Podsumowanie

Modyfikowanie wstążki daje ogromne możliwości. Z jednej strony możemy poprawić układ istniejących kontrolek, dostosowując wstążkę pod własne preferencje i przyzwyczajenia, a także specyfikę pracy z Wordem. Z drugiej możemy wyposażyć wstążkę we własne narzędzia, których funkcjonalność zależy tylko od naszych umiejętności programowania w VBA oraz pomysłowości. Nawet taką prostą rozwijaną listę możemy podpiąć pod skrypty, które wykonują skomplikowane zadania, łącząc się z bazą danych. Możemy przykładowo wyświetlić w takiej liście imiona pracowników, którzy po rozpoczęciu pracy z dokumentem, wybierają z listy swoje imię, co skutkuje zapisanie w firmowej bazie danych informacji o edytowanym dokumencie i czasie rozpoczęcia pracy. Aby zabezpieczyć się przed przypadkowymi i niepowoływanymi zapisami do bazy, możemy stworzyć prosty formularz, w którym użytkownik podaje swoje hasło, a skrypt dodatkowo przed wysłaniem danych sprawdza MAC adres karty sieciowej.

Niniejszy wpis obejmuje jedynie wąski zakres możliwości modyfikacji wstążki, celem uświadomienia jak wiele można osiągnąć przy pomocy VBA oraz jak bardzo można zmienić zarówno wygląd jak i sposób pracy z Wordem.  

windows oprogramowanie porady

Komentarze

0 nowych
bravo   16 #1 19.11.2014 19:28

Gratulacja za pracę jaką włożyłeś w stworzenie tego wpisu. Szacun.
Gdy przechodziłem z Access-a 9x na 2007, to nie raz plułem sobie w brodę gdy usunięto prosty edytor menu i zastąpiono tą "piekielną" wstążką i jej "okodowanie" XML-em. Jednak z perspektywy czasu uważam, że możliwości personalizacji jakie daje, rekompensują ręczną zabawę. Tak, że aplikacje końcowe są lepiej dopasowane do potrzeb użytkownika i jego wygody.

Meszuge   15 #2 19.11.2014 22:18

Dobra robota! Nareszcie coś wartego uwagi. :-)

kilgour   8 #3 20.11.2014 10:40

@kaisuj Dobra robota!

Zaczyna mi na to wyglądać, że Twój cykl o VBA warto zebrać w całość i wydrukować do PDFa do pobrania rozpoczynając cykl "Poradniki DP".

Może Redakcja zassie taki pomysł?

Silver9999   5 #4 20.11.2014 15:02

No powiem Ci szczerze że wielki szacuneczek!

Nie sadziłem że tak fajnie będzie to wygladac.

koneton   6 #5 20.11.2014 19:24

@bravo: chyba nie wiesz o czym piszesz. Kiedyś zmianę robiłeś dla pliku, dzięki czemu w takim Accessie, czy Excelu mogłeś tworzysz zupełnie "nową" aplikację. Obecny sposób, nie dość że jest mniej czytelny, to na dodatek działa tylko lokalnie na komputerze, w którym zmieniłeś szablon. Nie zrobisz custom menu dla bazy w Accessie i nie wyślesz jej klientowi.

kaisuj   10 #6 20.11.2014 19:41

@koneton: Nigdy nie pracowałem z Accessem, ale wydaje mi się, że możesz być w błędzie. Używałem oprogramowania robionego w VBA na Accessie, najpierw w wersji 2003, później 2007 i nie było z tym problemu. Standardowa wstążka była ukryta i zastąpiona własną. W Excelu makra i wstążka są zapisywane dla każdego skoroszytu oddzielnie. Gorzej jest w Wordzie, ale nie słyszałem też, żeby ktoś tworzył programy w oparciu o Worda.
Z pewnością edycja menu w starych office'ach była prostsza i szybsza niż obecnie, aczkolwiek wstążka daje większe możliwości.

koneton   6 #7 20.11.2014 20:24

@kaisuj: Większe? Pod jakim względem?

kaisuj   10 #8 20.11.2014 23:12

Po pierwsze okna są pochowane i nie ma możliwości wyświetlania w nich żadnych komunikatów. Na wstążce jest pełno miejsca i można na niej umieścić sporo informacji. Po drugie wstążka ma komponenty, których chyba nie ma w klasycznym menu, np. galerie. Wstążka ma jeszcze tę przewagę, że łączy w sobie cechy menu i toolbara. Jest bardziej przejrzysta dla użytkownika i łatwiej na niej znaleźć opcje niż w menu. Ostatecznie wydaje im się, że użytkownicy przyzwyczaili się już do wstążki, która upowszechniła się przez tych kilka lat i pojawiła nawet w eksploratorze Windows. Moim zdaniem eksplorator ze wstążką jest wygodniejszy od starej wersji.

koneton   6 #9 20.11.2014 23:18

@kaisuj: widać, że nie pracowałeś z MS Access. Tam wstążka tylko utrudnia pracę. Dodatkowo, stary sposób umożliwiał programowe zarządzanie menu i toolbarami. Obecnie z wstążką nic nie zrobisz u klienta.

A tak swoją drogą, po co komuś galeria w menu?

kaisuj   10 #10 20.11.2014 23:37

@koneton: Galeria to nazwa komponentu i nie należy tego traktować dosłownie jako wystawki ze zdjęciami. Nie jestem na 100% pewien pisząc z pamięci, ale wydaje mi się, że np. style w Wordzie na głównej karcie są robione komponentem galerii. To prawda, że z Accessem nie pracowałem. VBA wykorzystywałem w Wordzie, Excelu i Outlooku, ale wstążkę w większym zakresie modyfikowałem tylko w Wordzie.

koneton   6 #11 21.11.2014 00:56

@kaisuj: modyfikowałeś wstążkę z poziomu VBA? Bo stary dobry toolbar i menu było w 100% konfigurowalne z poziomu kodu (VBA).

Fafrocel   8 #12 21.11.2014 11:09

@@kaisuj
"...Ostatecznie wydaje im się, że użytkownicy przyzwyczaili się już do wstążki, która upowszechniła się przez tych kilka lat i pojawiła nawet w eksploratorze Windows..."

Nie wszyscy, ja do tej pory nie trawię wstążki i zdecydowanie wolę stare rozwiązania.

kaisuj   10 #13 21.11.2014 12:09

@koneton: Nie wykonywałem zbyt wielu modyfikacji wstążki bezpośrednio z poziomu VBA. W zasadzie to ograniczałem się jedynie do zmiany elementów list rozwijanych, czy galerii oraz wyświetlałem komunikaty na wstążce. Dlatego ciężko mi się odnieść z własnego doświadczenia. Aczkolwiek wydaje mi się to możliwe. Znalazłem na StackOverflow temat, w którym podawany jest przykładowy kod, który z poziomu VBA robi to samo, co ja tu robiłem XMLem na sztywno.
https://stackoverflow.com/questions/18522048/customizing-a-ribbon-with-vba-in-excel

  #14 21.11.2014 16:48

Nie lepiej zainstalować Libre Office i mieć normalne menu?

kaisuj   10 #15 21.11.2014 21:20

@Anonim (niezalogowany): Na menu się program nie kończy. Poza tym dyskutujemy tu bardziej o łatwości edycji menu lub wstążki przez programistę, a nie o wyższości menu nad wstążką z punktu widzenia użytkownika. Swoją droga ja bym chętnie przywitał wstążkę w LibreOffice, przynajmniej opcjonalnie.

bravo   16 #16 22.11.2014 15:44

@koneton: Jeżeli dostarczasz użytkownikowi aplikację ze skompilowanym kodem do uruchomienia w środowisku runtime, to "wyłączasz" menu domyślne i systemowe czy podręczne i masz czystą aplikację z zestawem funkcji jakie uznasz za potrzebne czy stosowne. Możesz napisać osobne wstążki dla formularzy czy raportów, a poszczególne przyciski wyróżnić np. wielkością. Dla użytkownika końcowego to bajka, jak ma np. 3 potrzebne opcje do obsługi danej części aplikacji, zamiast malutkich pasków menu -to bardzo ułatwia pracę ZU.

PS. Wiem co piszę - tworzę aplikacje w Accessie już parę dobrych lat i wiele już widziałem

Autor edytował komentarz.
koneton   6 #17 23.11.2014 10:20

@bravo: właśnie o tym pisałem. Nigdzie nie mogłem znaleźć informacji jak to zrobić. Z tego co pamiętam, to w 2007 było to niemożliwe (przynajmniej w MS Access). Teraz mam w pracy 2010 i też nie widzę takiej możliwości. Chętnie się dowiem, jak z poziomu VBA można konfigurować wstążkę na potrzeby konkretnej aplikacji.

bravo   16 #18 23.11.2014 15:09

@koneton: generalnie jak utworzysz swoją aplikację, to odkrywasz tabele systemowe i tworzysz rekordy w tabeli "USysRibbons", które zawierają definicje XML wstążek. Możesz ich utworzyć tyle ile potrzebujesz. W kodzie XML wstawiasz wiersz:(ribbon startFromScratch="true") . Powoduje to wyczyszczenie wszystkich domyślnych kart i pokazanie tylko tych z twojego pliku xml. Potem ustawiasz właściwą wstążkę dla każdego obiektu w jego właściwościach. Dla mnie nie potrzeba nic więcej. Wszystko eksportuje Ci się razem z aplikacją.

Możesz sobie zerknąć jeszcze tutaj:
http://office.microsoft.com/pl-pl/access-help/dostosowywanie-wstazki-HA010211415...
http://www.accessribbon.de/en/?Access_-_Ribbons:Create_XML_File

Autor edytował komentarz.
koneton   6 #19 23.11.2014 15:15

@bravo: jesteś wielki. :) Kiedyś długo tego szukałem i nie mogłem nic znaleźć. Nawet na formach Microsoftowych ichniejsi MVP pisali, że w Accessie się nie da.

bravo   16 #20 23.11.2014 15:20

@koneton: wiersz do wyłączania domyślnych kart to:
(ribbon startFromScratch="true")

piszę jeszcze raz, bo wstawiłem w nawiasach "ostrych" i moderacja wycięła :-)

Autor edytował komentarz.
przemor25   14 #21 24.11.2014 20:04

@kaisuj: Wstążka w LibreOffice raczej nie zawita. Microsoft nie pozwala na wykorzystywanie wstążki w aplikacjach firm trzecich, które są alternatywą dla programów od Microsoftu. Czyli w LibreOffice nie będzie, bo jest już w Microsoft Office ale wydawca takiego edytora plików PDF już może wykorzystać wstążkę w swoim oprogramowaniu. Świetny wpis :)

kaisuj   10 #22 25.11.2014 09:17

@przemor25: Nie wiem skąd masz takie informacje, ale przykładowo taki WPS Office jest moim zdaniem taką alternatywą, używa wstążki.
http://www.wps.com/

Autor edytował komentarz.
tubularbits   4 #23 26.11.2014 21:59

@kaisuj: Jest to produkt chińskiej myśli technologicznej. Nie pytają się o pozwolenie tylko od razu biorą się za kopiowanie. O ile się nie mylę to właśnie Chińczycy skopiowali najnowszego iPhone'a zanim on został oficjalnie zaprezentowany miastu i światu. Świetny wpis!

Autor edytował komentarz.