Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
Przesunięty przez: Artik
27-09-2019, 00:11
Excel 2010 - Combobox na wstążce (Ribbon)
Autor Wiadomość
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 983
Wysłany: 09-01-2018, 07:47   Excel 2010 - Combobox na wstążce (Ribbon)

Dla pewnego porządku zakładam nowy temat.

Chciałbym aby przycisk na wstążce 'Autofiltr OFF' oprócz uruchamiania makra zdejmującego filtry w arkuszu, czyścił również ostatnią wybraną wartość w polu combi (na wstążce).

Po prostu nie wiem jak się odwołać do tej kontrolki.

I to by było tyle ;-)

Wstążka - pole combi.zip
Pobierz Plik ściągnięto 88 raz(y) 21.78 KB

_________________
Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują.
ID posta: 337389 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2890 razy
Posty: 9579
Wysłany: 10-01-2018, 02:05   

Odpowiadając krótko na pytanie, to potrzebne Ci wywołanie zwrotne _getText dla kontrolki Combo1 i unieważnienie tej kontrolki (InvalidateControl) w wywołaniu x_autofiltr_off.

Ale żeby nie było za nudno, to pokażę jak tworzyć dynamicznie listę dla Combo.
Kod XML
Kod:
<customUI
    xmlns="http://schemas.microsoft.com/office/2006/01/customui"
    onLoad="rxIRibbonUI_onLoad">
    <ribbon >
        <tabs >
            <tab
                id="CustomTab"
                insertBeforeMso="TabHome"
                label="Moje MENU">
                <group
                    id="rxGrpFilters"
                    label="Filtry">
                    <button
                        id="rxBtnAfltrOff"
                        imageMso="AutoFormatChange"
                        label="Czyść Autofiltr"
                        onAction="rxBtnAfltrOff_onAction"/>
                    <comboBox
                        id="rxCmbFltrs"
                        label="Odfiltruj wiek:"
                        getItemCount="rxCmbFltrs_getItemCount"
                        getItemLabel="rxCmbFltrs_getItemLabel"
                        getText="rxCmbFltrs_getText"
                        onChange="rxCmbFltrs_onChange"/>
                </group >
            </tab >
        </tabs >
    </ribbon >
</customUI >

I większa część kodu VBA
Kod:
Option Explicit

Public RibbonUI     As IRibbonUI
Public g_varrFltrs  As Variant
Public g_lCntFltrs  As Long


Public Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
   
    Call PopulateFiltersArray

    Set RibbonUI = ribbon
End Sub



Public Sub rxBtnAfltrOff_onAction(control As IRibbonControl)
    RibbonUI.InvalidateControl "rxCmbFltrs"
End Sub



Public Sub rxCmbFltrs_getItemCount(control As IRibbonControl, ByRef returnedVal)
    returnedVal = g_lCntFltrs
End Sub

Public Sub rxCmbFltrs_getItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
    returnedVal = g_varrFltrs(index)
End Sub



Public Sub rxCmbFltrs_getText(control As IRibbonControl, ByRef returnedVal)
    returnedVal = "<wybierz>"    'lub ""
    If Arkusz1.FilterMode = True Then Arkusz1.ShowAllData
End Sub



Public Sub rxCmbFltrs_onChange(control As IRibbonControl, Text As String)
    Call FilterByAge(Text)
End Sub



Private Sub PopulateFiltersArray()
    g_varrFltrs = Split("20-22,23-25,26-29,>=30", ",")
    g_lCntFltrs = UBound(g_varrFltrs) + 1
End Sub

Wcześniej już tłumaczyłem jak to jest na starcie i przy unieważnieniu kontrolki, dlatego nieco w skrócie.
Odpalamy plik, uruchamia się rxIRibbonUI_onLoad, gdzie wołana jest procedura PopulateFiltersArray, która wypełnia danymi tablicę g_varrFltrs oraz zlicza liczbę elementów tablicy, przypisując do zmiennej g_lCntFltrs. Następnie uruchamia się rxCmbFltrs_getText. Dzięki wpisaniu w tej procedurze polecenia ShowAllData, po otwarciu pliku filtry są wyczyszczone (o ile filtrowanie jest zastosowane).
Dochodzimy do użycia naszego ComboBox-a. Mamy dwa scenariusze.
1. Nie klikając w strzałkę rozwijającą listę, tylko od razu w polu edycyjnym wpisujemy interesujący nas zakres, np. 20-28 otrzymamy wszystkich z tego zakresu. Przy wpisywaniu pierwszych cyfr nie otrzymujemy żadnej podpowiedzi, gdyż lista jest pusta!
2. Klikamy w strzałkę i... dopiero teraz rozpoczyna się wypełnianie listy. Najpierw uruchamia się wywołanie rxCmbFltrs_getItemCount, by "dowiedzieć się" ile będzie elementów do dodania, a następnie tyle razy jest uruchamiane wywołanie rxCmbFltrs_getItemLabel. To dzieje się tylko raz, po pierwszym kliknięciu w strzałkę. Wybór jednego ze zdefiniowanych zakresów wyświetli nam odpowiednie wyniki.
Jak więc widać, pole Combo pozwala nam na filtrowanie w dowolnym zakresie, a lista rozwijana zawiera predefiniowane przedziały lat.
Klikając w przycisk [Czyść Autofitr] wzbudzamy rxBtnAfltrOff_onAction, gdzie następuje tylko unieważnienie kontrolki rxCmbFltrs. I zabawa rozpoczyna się od nowa. Czyli uruchamia się rxCmbFltrs_getText, a gdy klikniemy na strzałkę w Combo wzbudzamy jednokrotnie rxCmbFltrs_getItemCount i wielokrotnie rxCmbFltrs_getItemLabel.
Chcę zwrócić uwagę, że unieważnienie kontrolki nie powoduje wyczyszczenia listy. Mówił o tym apollo w wątku wspomnianym wyżej.

I to by było na tyle. :-)

Ah, zapomniałem jeszcze o aktywowaniu naszego taba. Jeśli umieścimy go przed tabem TabHome, to nasz będzie aktywowany po otwarciu pliku. Dlatego nic w kodzie na temat aktywacji nie ma. :-)
I druga sprawa. Zastosowałeś w kodzie XML wstążkę dla wersji wyższej niż XL2007. W związku z tym Twój tab nie wyświetli się w Excelu 2007. A w ogóle byłem zaskoczony, że Twój XML zadziałał, gdyż w nieprawidłowym miejscu wpisałeś insertBeforeMso="TabHome" co skutkowało wyświetleniem się taba na końcu wstążki.

Artik

Dynamic rx_ComboBox.xlsm
Pobierz Plik ściągnięto 101 raz(y) 23.37 KB

_________________
Persistence is a virtue in the world of programming.
ID posta: 337457 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4482
Wysłany: 10-01-2018, 09:31   

Artik napisał/a:
Odpowiadając krótko na pytanie, to potrzebne Ci wywołanie zwrotne _getText dla kontrolki Combo1 i unieważnienie tej kontrolki (InvalidateControl) w wywołaniu x_autofiltr_off.

Ale żeby nie było za nudno, to pokażę jak tworzyć dynamicznie listę dla Combo.

Artik, nie ma nudno.
Żeby zrobić porządnie musi być dynamiczne tworzenie pozycji tak, jak pokazałeś dalej. Dlaczego?
Otóż InvalidateControl nie usuwa pozycji. Jeśli pozycje ComboBox są tworzone statycznie tak, jak w XML pytającego to getItemCount i getItemLabel nigdy nie zostaną wywołane, nawet jeśli dodamy do XML. Kiedy InvalidateControl jest wywołana w onAction to tylko getText będzie wywołana (natychmiast). Jeśli w getText zwracamy pusty string to część TextBox kontrolki ComboBox zostanie wyczyszczona. Ale ponieważ lista nigdy nie zostaje tworzona od nowa, cały czas jest ta sama lista, to indeks ostatniej wybranej w ComboBox pozycji nadal jest zapamiętany taki sam. Wskutek tego jeśli teraz klikamy strzałkę to wybranie tego samego indeksu nie powoduje wybrania tej pozycji, i na marginesie nie wywołuje onChange. Musimy wybrać pozycję inną niż przed czyszczeniem, po czym wybrać pozycję taką jak przed czyszczeniem.

Sprawdzenie: wybierzemy 26-29 -> nastąpi filtrowanie i w części TextBox kontrolki ComboBox mamy 26-29 -> klikniemy przycisk -> wszystkie dane zostaną odkryte i w TextBox mamy pusty string zwracany przez GetText -> klikniemy strzałkę i wybierzemy znowu 26-29 -> nic się nie dzieje, czyli nie ma filtrowania i TextBox nadal jest pusty. Jeśli koniecznie chcemy filtrować wg 26-29 to najpierw musimy wybrać inną pozycję, po czym wybrać 26-29. Taka jest niedogodność.

Dlatego jeśli chcemy zrobić porządnie to musi być dynamiczne tworzenie tak, jak pokazałeś. Wtedy wywołanie InvalidateControl skutkuje tym, że pierwsze kliknięcie (po InvalidateControl) strzałki powoduje wywołanie getItemCount i getItemLabel w celu tworzenia listy, tej samej lub innej, bo możemy tworzyć różne listy w czasie działania, i index jest ustawiony na < 0. Dlatego po wyświetleniu listy można wybrać dowolną pozycję.
ID posta: 337466 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2890 razy
Posty: 9579
Wysłany: 10-01-2018, 10:35   

Czyli, nudno nie jest w tym wątku.
A nawet jest porządnie. :mrgreen:

Artik
_________________
Persistence is a virtue in the world of programming.
ID posta: 337470 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 983
Wysłany: 10-01-2018, 10:41   

Cytat:
Odpowiadając krótko na pytanie, to potrzebne Ci wywołanie zwrotne _getText dla kontrolki Combo1 i unieważnienie tej kontrolki (InvalidateControl) w wywołaniu x_autofiltr_off.


Wielkie dzięki za kolejną lekcję.

Na początku poprawiłem sobie tylko VBA ale nie poprawiłem kodu XML i nie dodałem
Kod:
getText="Combo1_getText"
i było :// - no bo mi nie chciało działać.

Jak już się dopatrzyłem :hamer - to wszystko ruszyło.

I pomimo mojego statycznego tworzenia listy Combi, wszystko zachowuje się prawidłowo, nawet jeśli ciągle wybieram tą samą pozycję z listy, to zawsze po użyciu zerowania filtrów, odfiltrowuje mi arkusz prawidłowo :-)

A jeśli chodzi o wyświetlanie się pozycji zmodyfikowanej wstążki, to wszystko OK, bo właśnie ta nowa pozycja na wstążce ma być ostatnia a nie pierwsza ;-)
_________________
Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują.
ID posta: 337474 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4482
Wysłany: 10-01-2018, 11:32   

Marti napisał/a:


I pomimo mojego statycznego tworzenia listy Combi, wszystko zachowuje się prawidłowo, nawet jeśli ciągle wybieram tą samą pozycję z listy, to zawsze po użyciu zerowania filtrów, odfiltrowuje mi arkusz prawidłowo :-)

Czyli chcesz powiedzieć, że pisałem nieprawdę?
Nie chcę ciebie przekonać, chcę pokazać innym. W dołączonym pliku AVI widać, że po wybraniu 26-29 było filtrowanie i w TextBox kontrolki ComboBox jest 26-29. Po naciśnięciu "Autofiltr OFF" widać wszystkie dane i w TextBox kontrolki ComboBox jest pusty string. Teraz 3 razy wybrałem 26-29 i nic się nie dzieje: wszystkie dane nadal widać, i TextBox nadal pusty. Dopiero wybraniu 20-23 coś się dzieje.

Po naciśnięciu "Autofiltr OFF" przy otwieraniu listy (kliknięcie strzałki) widać, że pozycja 26-29 jest "żółta". To oznacza, ze indeks 2 ciągle jest zapamiętany - pozycja 2 (licząc od 0) obecnie jest wybrana, mimo, ze TextBox jest pusty, dlatego nie można wybrać tej samej pozycji 2.

Możesz pisać, co chcesz, być może masz jakiś powód. Ale na szczęście mogę pokazać, jak jest. Co najmniej u mnie.

test.rar
Pobierz Plik ściągnięto 78 raz(y) 619.75 KB

ID posta: 337478 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 983
Wysłany: 10-01-2018, 11:56   

apollo napisał/a:
Czyli chcesz powiedzieć, że pisałem nieprawdę?


Chcę powiedzieć, że u mnie po prostu nie ma takiego efektu.

apollo napisał/a:
Możesz pisać, co chcesz, być może masz jakiś powód.


Powód to działający załącznik. Artik - jeszcze raz BIG THX :beer

Wstążka - pole combi.zip
Pobierz Plik ściągnięto 72 raz(y) 22.53 KB

_________________
Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują.
ID posta: 337481 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4482
Wysłany: 10-01-2018, 12:12   

A możesz dać plik AVI? Bo u mnie z tym nowym plikiem to samo. Zresztą jak może być inaczej.

Czyli wybrać 26-29 -> kliknąć OFF -> otworzyć listę i wybrać 26-29. Da się? U mnie nie.
ID posta: 337484 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 983
Wysłany: 10-01-2018, 12:19   

Nie mam teraz takich możliwości aby nagrać avi.
Ale musisz mi uwierzyć, że tak właśnie robię i u mnie działa (za każdym razem zakładam ten sam filtr na arkusz). Z resztą jaki miałbym interes w tym żeby pisać że działa gdybym miał taki efekt jak u Ciebie?
Taka sytuacja jaka jest u Ciebie byłaby dla mnie również nie do zaakceptowania i wtedy budowałbym listę combi dynamicznie.

W każdym bądź razie w pracy działa na 2 różnych kompach. Wieczorem sprawdzę w domu jeszcze na 2 laptopach.
_________________
Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują.
ID posta: 337487 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 983
Wysłany: 10-01-2018, 12:59   

Do pewnej mojej aplikacji na której dziennie pracuje w mojej firmie ok setka ludzi w całej Polsce, dołożyłem jej do wstążki dzisiaj pole combi. Łączyłem się teraz zdalnie z kilkunastoma osobami i sprawdzałem jak działa filtrowanie + Autofiltr OFF ze wstążki. U wszystkich działa prawidłowo :-)
_________________
Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują.
ID posta: 337493 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 983
Wysłany: 10-01-2018, 20:06   

Ta sama aplikacja o której wyżej pisałem, u mnie w domu niestety posiada objawy opisane przez apollo :-|

Nie używam jej w domu, więc to nie problem, ale pozostaje ciekawostką, dlaczego u mnie w pracy nie obserwuję takich niepożądanych objawów. Dobrze, że ich nie ma ale chyba dla świętego spokoju przerobię kod pod dynamiczne ładowanie listy combi.
_________________
Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują.
ID posta: 337519 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2890 razy
Posty: 9579
Wysłany: 11-01-2018, 00:09   

Kurczę, to po co my się produkujemy? Co, tak dla rozrywki, by się poczepiać biednego Martiego?
Marti napisał/a:
chyba dla świętego spokoju przerobię kod
I to jak najszybciej, zanim się coś posypie. Inny zonk jaki zaobserwowałem, to wyświetlenie ostatnio wybranego zakresu ( w Combo), gdy przejdziesz do innego Tab-a i wrócisz. Mimo że wcześniej było InvalidateControl. Przed wyjściem było <wybierz>, a po przyjściu ostatni wybór.

Przemyślałem jeszcze trochę temat. Z kodu wynika, że w Combo filtrujesz tylko po zdefiniowanych zakresach lat, nie pozwalasz użytkownikowi na swobodę. Skoro tak, to wydaje się, że odpowiedniejszą kontrolką powinna być DropDown. W załączniku porównanie zachowań obu kontrolek, przy liście statycznej. DD też ma swoje niedogodności, jak choćby niemożność wyczyszczenia pola tekstowego. Dlatego jeszcze jedna pozycja na liście.

Skoro już się zdecydujesz na poprawki, ponownie przypominam, że wstążkę przygotowałeś na wersje 2010+, a w kodzie chcesz aktywować Tab-a także dla wersji 2K7. Twój tab w 2007 się nie pojawi!!! W załączniku poprawiłem, by było także widoczne w 2K7.

Artik

Wstążka - Combo & DropDown.xlsm
Pobierz Plik ściągnięto 86 raz(y) 25.22 KB

_________________
Persistence is a virtue in the world of programming.
ID posta: 337534 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4482
Wysłany: 11-01-2018, 19:49   

Artik napisał/a:
Inny zonk jaki zaobserwowałem, to wyświetlenie ostatnio wybranego zakresu ( w Combo), gdy przejdziesz do innego Tab-a i wrócisz. Mimo że wcześniej było InvalidateControl. Przed wyjściem było <wybierz>, a po przyjściu ostatni wybór.

Bo ta sama sytuacja ;-)
Napisałem
Cytat:

Jeśli w getText zwracamy pusty string to część TextBox kontrolki ComboBox zostanie wyczyszczona. Ale ponieważ lista nigdy nie zostaje tworzona od nowa, cały czas jest ta sama lista, to indeks ostatniej wybranej w ComboBox pozycji nadal jest zapamiętany taki sam.

Wybieramy 26-29 -> przycisk OFF -> TextBox = <wybierz>, ale ciągle jest zapamiętany indeks 2 - obecnie wybrany. Dlatego po ponownym otwieraniu listy nie można wybrać tego samego indeksu 2. I widać teraz (wykryłeś), że po przełączeniu na inny Tab i po powrocie to pozycja o indeksie 2 zostaje wybrana i TextBox = 26-29
ID posta: 337612 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe