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
ID tematu: 68801 Skopiuj do schowka Kontrolka Dropdown x2, lista zależna
Autor Wiadomość
Tassan
Starszy Forumowicz


Wersja: Win Office 2019
Posty: 32
Wysłany: 01-09-2020, 03:05   Kontrolka Dropdown x2, lista zależna

Witam

Sądziłem, że jakoś pójdzie ale to nie takie proste.
DD1 udaje mi się wypełnić i filtrowanie z niego działa ale zmontowanie z tego listy zależnej podpiętej do DD2 to już poza moim zasięgiem. Dodam że pozycje DD1 nijako "wklepane z palca" a wolałbym jednak aby to się sczytywało z nagłówków tabeli z Tab6, ale to można sobie darować

Generalnie jakby to miało działać ? -
DD1 wypełniany nagłówkami z tabeli ale można też ręcznie wklepać
DD2 lista zależna od DD1 a pozycje dla DD2 z tabeli
"Wyczyść" czyści wszystko i ustawia index 0 w DD czyli <Wybierz>

Widzę, też że jest konflikt z TB bo jak używam filtrowania przez DD a potem jeszcze korzystam z TB to jak TB przyjmuje pozycję False to nie zważając na wybór z DD czyści wszystkie filtry, tu potrzebny byłby warunek na stan DD, nie wspominając już, że użycie "Zerowania" też musi pociągać za sobą zerowanie kontrolek DD
normalnie koszmar :-( więc ciąg dalszy prośby o pomoc

Generalnie to jest fajna sprawa taka modyfikacja wstążki , proste rzeczy da się dosyć łatwo zaimplementować i "zmusić" do działania ale już jak są zależności to lipa.

Testwersja.xlsm
Pobierz Plik ściągnięto 18 raz(y) 99.62 KB

ID posta: 391455 Skopiuj do schowka
 
 
Tassan
Starszy Forumowicz


Wersja: Win Office 2019
Posty: 32
Wysłany: 01-09-2020, 07:14   

Tak naszło mnie jeszcze jedno pytanko ,
Otóż czy możliwe jest podpięcie na wstążce do DD1 dwóch list wyboru i sterowanie nimi , która ma być aktywna , za pomocą TB ? Taki myk rozwiązałby mi sprawę zależności, które się pojawią.
ID posta: 391457 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1306 razy
Posty: 4517
Wysłany: 03-09-2020, 19:57   

Tassan napisał/a:
Tak naszło mnie jeszcze jedno pytanko ,
Otóż czy możliwe jest podpięcie na wstążce do DD1 dwóch list wyboru i sterowanie nimi , która ma być aktywna , za pomocą TB ? Taki myk rozwiązałby mi sprawę zależności, które się pojawią.

Piszę z pamięci:
- w OnAction TB po zrobieniu potrzebnych rzeczy wywołaj ribbon.Invalidate lub ribbon.InvalidateControl DD1
- w DD1_getItemCount odczytaj bieżący stan TB. Jeśli Pressed to zwróć liczba1 obliczoną na podstawie czegoś (np. lista1 = A2:A10 -> liczba1 = 9), w przeciwnym razie zwróć liczba2 obliczoną na podstawie czegoś (n. lista2 = B2:B17 -> liczba2 = 16).
- w DD1_getItemLabel odczytaj bieżący stan TB. Jeśli Pressed to zwróć pozycje z lista1 (tablica1, np. A2:A10), w przeciwnym razie zwróć pozycje z lista2 (tablica2, np. B2:B17)
ID posta: 391619 Skopiuj do schowka
 
 
Tassan
Starszy Forumowicz


Wersja: Win Office 2019
Posty: 32
Wysłany: 04-09-2020, 18:57   

Dzięki @apollo za podpowiedzi, postaram się coś podziałać zobaczymy co wyjdzie z tego ale coś czuję, że przez braki wiedzy z VB będą problemy.
ID posta: 391671 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1306 razy
Posty: 4517
Wysłany: 04-09-2020, 21:09   

Tassan napisał/a:
Dzięki @apollo za podpowiedzi, postaram się coś podziałać zobaczymy co wyjdzie z tego ale coś czuję, że przez braki wiedzy z VB będą problemy.

Tylko tak pisałem. A tak naprawdę nie rozumiem, co chcesz robić.

Jeśli potrzebujesz pomocy to napisz konkretniej. Dołącz plik i opisuj szczegółowo: skąd ma być lista1 do DD1 i skąd lista2 dla DD1 czy dla DD2.

Najpierw pisałeś, że "DD2 lista zależna od DD1". Ja to zrozumiałem, że DD2 lista zależy od wyboru pozycji w DD1. Potem pisałeś coś o TB, a rozumiałem teraz, że DD2 lista zależy od stanu TB.

Napisz coś podobnego: "Na początku w DD1 jest lista z sheet1.A1:A5 (=Jakub, Marcin, Michał, Paweł, Tomek), a w DD2 lista jest pusta. Jeśli wybieram np. "Marcin" to w DD2 pojawia się lista z sheet1.C1:C12, a jeśli "Paweł" to w DD2 lista z sheet1.E1:E7..."

Podsumowanie:
- jeśli lista w DD2 jest zależna od wyboru w DD1 to lista w DD1 jest stała, DD2 musi być, i lista w DD2 jest zmienna. Czyli muszą być 2 DD.
- jeśli są tylko 2 listy i chcemy wywietlić jedną kiedy TB jest naciśnięty a drugą kiedy jest zwolniony to oczywiście tylko 1 DD
ID posta: 391679 Skopiuj do schowka
 
 
Tassan
Starszy Forumowicz


Wersja: Win Office 2019
Posty: 32
Wysłany: 05-09-2020, 02:16   

Już uściślam jak to miałoby działać:

Dane do załadowania w DD1 i DD2 - zakładka Tab6, Tabela10

1) TB (Pracownik/Zakres) w pozycji False, czyli TB podpisany Pracownik:

- do DD1 ładowana jest lista z Tab6 i są to nagłówki tej tabeli (<Wybierz>, Jakub, Marcin itd.)
- po załadowaniu ustawiony index 0 czyli <Wybierz> a więc tabela wyświetla wszystkie dane (wszystkich pracowników), po zmianie wyboru pracownika tabela jest filtrowana zgodnie z wyborem, czyli filtruje po Pracownikach - tabela główna kolumna Pracownik

- dodatkowo do DD2 ładowana jest lista zależna od wyboru w DD1 i można dokładniej filtrować korzystając z kryterium "zakresu" dla poszczególnych pracowników.
Dane dla list zależnych są w Tab6 Tabela10 - kolumna z danym pracownikiem czyli jeżeli wybieram w DD1 np. Jakub to w DD2 wyświetla mi się lista z zakresami dla Jakuba czyli "1, 2, 3, 4, Wszystkie" i po wybraniu którejś pozycji następuje filtrowanie po kolumnie "Zakres". "Wszystkie" oznacza wszystkie zakresy

2) TB (Pracownik/Zakres) w pozycji True, czyli TB podpisany Zakres:

- do DD1 ładowana jest lista z Tab6 Tabela10 i jest to kolumna 1 razem z nagłówkiem, czyli ładowane jest "Wybierz, 1, 2, 3, 4, 5," i po wybraniu pozycji następuje filtrowanie tabeli głównej kolumna Zakres
- kontrolka DD2 jest w tym momencie nieaktywna


Generalnie ta Tabela10 stanowi unikaty kolumny "Pracownik" i "Zakres" , na razie wypisane ręcznie.

Testwersja.xlsm
Pobierz Plik ściągnięto 13 raz(y) 102.96 KB

ID posta: 391686 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1306 razy
Posty: 4517
Wysłany: 05-09-2020, 21:14   

Tassan napisał/a:
Już uściślam jak to miałoby działać:

Dane do załadowania w DD1 i DD2 - zakładka Tab6, Tabela10

1) TB (Pracownik/Zakres) w pozycji False, czyli TB podpisany Pracownik:

Proponuję:
1. W module RibbonControl.
- deklaruj stałą:
Kod:

Private Const PracownikRange = "Tabela10"

- nie używać zmiennej g_lCntFltrs i całej procedury PracownikArray, oraz skasować Call PracownikArray w Ribbon_onLoad
- Deklaruj zmienną
Kod:

Public currCol As Long

- następujące procedury są w module RibbonControl. Jeśli jakieś procedury już są w pliku to zastąp nową wersją, pozostałe dopisz do modułu.
Kod:

Public Sub Tab_getLabel(control As IRibbonControl, ByRef returnedVal)
    If m_Counter < ThisWorkbook.Sheets.Count Then
        m_Counter = m_Counter + 1
        returnedVal = ThisWorkbook.Sheets(m_Counter).Name
    End If
End Sub

Public Sub Dropdown1_getItemCount(control As IRibbonControl, ByRef returnedVal)
    If TogB4 Then
        returnedVal = Range(PracownikRange).Rows.Count + 1
    Else
        returnedVal = Range(PracownikRange).Columns.Count
    End If
End Sub

Public Sub Dropdown2_getItemCount(control As IRibbonControl, ByRef returnedVal)
    If Not TogB4 And currCol > 1 Then returnedVal = Range(PracownikRange).Rows.Count
End Sub

Public Sub Dropdown1_getItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
    If TogB4 Then
        returnedVal = Range(PracownikRange).Cells(1, 1).Offset(index - 1).Value
    Else
        returnedVal = Range(PracownikRange).Cells(1, index + 1).Offset(-1).Value
    End If
End Sub

Public Sub Dropdown2_getItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
    returnedVal = Range(PracownikRange).Cells(index + 1, currCol).Value
End Sub

Public Sub Dropdown1_getSelectedItemIndex(control As IRibbonControl, ByRef returnedVal)
    returnedVal = 0
End Sub

Public Sub Dropdown2_getSelectedItemIndex(control As IRibbonControl, ByRef returnedVal)
    returnedVal = Range(PracownikRange).Rows.Count - 1
End Sub

Public Sub DropDown1_onAction(control As IRibbonControl, id As String, index As Integer)
    If TogB4 Then
        FiltrZakres Range(PracownikRange).Cells(1, 1).Offset(index - 1).Value, True
    Else
        currCol = index + 1
        FiltrPracownik Range(PracownikRange).Cells(1, currCol).Offset(-1).Value
        g_RbnX.InvalidateControl "Dropdown2"
    End If
End Sub

Public Sub DropDown2_onAction(control As IRibbonControl, id As String, index As Integer)
    FiltrZakres Range(PracownikRange).Cells(index + 1, currCol).Value, False
End Sub

Sub TB4_GetLabel(ByVal control As IRibbonControl, ByRef label)
    If control.id = "TB4" Then
        ActiveSheet.ListObjects(1).AutoFilter.ShowAllData
        Select Case TogB4
        Case True: label = "Zakres"
        Case False: label = "Pracownik"
        End Select
    End If
End Sub


2. W module Makra.
- Usuń wszystkie procedury Wszyscy, Jakub, ..., Tomek
- Dopisz
Kod:

Sub FiltrPracownik(ByVal pracownik As String)
Dim lo As ListObject
    Application.ScreenUpdating = False
    Set lo = ActiveSheet.ListObjects(1)
    lo.AutoFilter.ShowAllData
    If LCase(pracownik) <> "wszyscy" Then lo.Range.AutoFilter Field:=2, Criteria1:=pracownik
    Application.ScreenUpdating = True
End Sub

Sub FiltrZakres(ByVal zakres, ByVal tylko_zakres As Boolean)
Dim lo As ListObject
    Application.ScreenUpdating = False
    Set lo = ActiveSheet.ListObjects(1)
    If tylko_zakres Then lo.AutoFilter.ShowAllData
    If LCase(zakres) = "wszystkie" Or LCase(zakres) = "<wybierz>" Then
        lo.Range.AutoFilter Field:=4
    Else
        lo.Range.AutoFilter Field:=4, Criteria1:=zakres
    End If
    Application.ScreenUpdating = True
End Sub


3. Nie patrzyłem na inne kody. Nie testowałem dokładnie.
ID posta: 391731 Skopiuj do schowka
 
 
Tassan
Starszy Forumowicz


Wersja: Win Office 2019
Posty: 32
Wysłany: 06-09-2020, 14:59   

Wdrożone, sprawdzone, działa ładnie i zgodnie z założeniami za co dziękuję.
Przydałaby się tylko jedna korekta dotycząca wyświetlania listy w DD2 tak aby nie wyświetlało "pustych" miejsc z tabeli, przykład kolumna Michał "1,4,5,puste,Wszystkie". Dzięki raz jeszcze.
ID posta: 391754 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1306 razy
Posty: 4517
Wysłany: 06-09-2020, 18:39   

W module RibbonControl
Kod:

Public zakresy()

...

Public Sub Dropdown2_getItemCount(control As IRibbonControl, ByRef returnedVal)
Dim r As Long, count As Long
    If Not TogB4 And currCol > 1 Then
        count = Range(PracownikRange).Rows.count
        If count = 1 Then count = 2 ' następna linia zakresy = powoduje błąd jeśli Range ma tylko 1 komórkę
        zakresy = Range(PracownikRange).Resize(count, 1).Offset(, currCol - 1).Value
        count = 0
        For r = 1 To UBound(zakresy)
            If zakresy(r, 1) <> "" Then
                count = count + 1
                zakresy(count, 1) = zakresy(r, 1)
            End If
        Next r
        returnedVal = count
    End If
End Sub

Public Sub Dropdown2_getItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
    returnedVal = zakresy(index + 1, 1)
End Sub
ID posta: 391761 Skopiuj do schowka
 
 
Tassan
Starszy Forumowicz


Wersja: Win Office 2019
Posty: 32
Wysłany: 07-09-2020, 01:34   

Dziękuję za wprowadzone zmiany, w temacie Dropdown wszystko ładnie działa.
ID posta: 391774 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