Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel- Jak utworzyć listę pracowników w ComboBox

JaroFon 25 Lis 2012 13:27 4995 12
  • #1 25 Lis 2012 13:27
    JaroFon
    Poziom 23  

    Witam. Mam dwa pytania i prośbę o pomoc. W załączonym pliku zrobiłem wniosek z oknem 'Forms' który ułatwia mi jego wypełnianie. Jednak mam mały problem jak zrobić żeby w oknie ComboBox pojawiła się cala lista pracowników która jest w osobnym arkuszu 'Lista pracowników'? I jeszcze jedno pytanko jak zablokować czerwony przycisk zaznaczony na screenie do zamykania okna aby był nieaktywny?
    Excel- Jak utworzyć listę pracowników w ComboBox

    0 12
  • #2 25 Lis 2012 19:50
    JaroFon
    Poziom 23  

    Już znalazłem w necie jak to można zrobić. Wpisałem w VBA 'Initialize' poniższy kod i działa wyśmienicie. Jednak w opisie było jeszcze podane żeby zakres listy z pracownikami nazwać i w odnośniku do zakresu wpisać =OFFSET(Lists!$A$2, 0, 0, COUNTA(Lists!$A:$A)-1,1)
    Jednak opis jest z anglojęzycznej stronki i nie wiem co to jest w PL wersji OFFSET i COUNTA. Proszę o podpowiedź jak mam sformułować tą formułę.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [minuty]:

    Przeszukałem trochę neta i znalazłem że OFFSET to WYSZUKAJ a COUNTA to ILE.NIEPUSTYCH. Jednak z tą formułą która została podana na tej stronce: Link jest coś nie tak bo nie działa poprawnie. Jak poprawnie powinna wyglądać formuła która poprawnie pokaże w rozwijanej liście ComboBox tylko listę z pełnymi komórkami?

    0
  • Pomocny post
    #3 25 Lis 2012 22:01
    marek003
    Poziom 40  

    Różne drogi prowadzą do Rzymu

    Zastosowałeś jedną w VBA (jak dla mnie trochę przekombinowaną - ale działa)
    Ja bym to zrobił np. tak

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Pętla warunkowa po kolumnie B która "wypada" gdy będzie pusta komórka


    Ale zaznaczam że twoja też działa więc nie ma co się kłucić (co prawda twoja złapie wszystkie zapisane komórki w arkuszu ale jeżeli tam będzie tylko lista pracowników to czemu nie.


    To co znalazłeś Offset i Count tyczy się innego rozwiązania (a właściwie kosmetyki rozwiązania).


    Kiedy wykorzystasz do "stworzenia" okienka kombinowanego nie Additem tylko RowSource (wiersze źródłowe -czy jakoś tak) musisz wskazać zakres wierszy którego ma dotyczyć dane okienko kombinowane.
    Możesz wskazać na stałe zakres od B3 do B500 w danym arkuszu i będzie działało ale... na końcu będą (nie wiem jak to nazwać) puste "wersy" do wyboru.

    Aby się tego pozbyć (tych pustych miejsc) stosuje się wybieg z nazwanym zakresem (Menadżer nazw).
    W tym menadzerze możesz przypisać danemu zakresowi komórek jakąś nazwę np. "zakresik" i później zamiast odwoływać się do zakresu w stylu a1:a100 możesz wpisać "zakresik" i na to samo wyjdzie.

    I teraz sedno sprawy: poprzez funkcje excela możesz też zrobić tak że nazwany zakres będzie w rzeczywistości płynny tzn. np. wraz z powiększeniem zakresu o kolejne dane będzie on się powiększał lub np. zmieniał całkowicie, jeżeli założymy że osiągnie się jakiś inny warunek. (to wszystko zależy od wizji autora)

    Ale wracając do twojego zagadnienia

    Offset to nie wyszukaj tylko przesunięcie i w twoim przypadku ta funkcja powinna wyglądać tak:
    =PRZESUNIĘCIE('Lista pracowników'!$B$3;0;0;ILE.NIEPUSTYCH('Lista pracowników'!$B:$B);1)
    i powinna być wpisana jako "żródło" w nazwę danego zakresu (menadżer nazw)

    Dzięki temu każde dopisanie nowego pracownika będzie poszerzało zakres pomijając puste wiersze.


    A się narozpisywałem

    Poniżej przykład

    z "moim" AddItem [combobox2]

    z rowSource z wykorzystaniem nazwanego stałego zakresu "Lista_pr" [combobox3]


    z rowSource z wykorzystaniem nazwanego zmiennego zakresu "Listka" [combobox4]


    Co do blokady wyłączenia iksikiem X

    Przykład:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    edit:
    Jak teraz patrze na "twoje" rozwiązanie to widzę że właściwie są tam zmieszane ze soba (przedstawione wyżej przeze mnie) dwie metody na raz, co jeszcze bardziej przekonuje mnie w stwierdzeniu "przekombinowane".

    0
  • #4 25 Lis 2012 22:21
    JaroFon
    Poziom 23  

    Dzięki bardzo za pomoc. Z tego co mi napisałeś mam zrozumieć że wystarczy tylko nazwać zakres i podać w zakresie formułę =PRZESUNIĘCIE('Lista pracowników'!$B$3;0;0;ILE.NIEPUSTYCH('Lista pracowników'!$B:$B);1) a w VBA Initialize wpisać ComboBox4.RowSource = "Listka" a kodu

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    wcale nie muszę wykorzystywać?

    0
  • Pomocny post
    #5 25 Lis 2012 22:32
    marek003
    Poziom 40  

    Tak.
    Możesz nawet nie pisać:

    Code:
    ComboBox4.RowSource = "Listka"

    a we właściwościach ComboBox4 (okienko combobox'a na Form) we "właściwości" RowSource wpisać "Listka" i też zadziała.
    Warunek: taka nazwa musi być w arkuszu.

    0
  • #6 25 Lis 2012 22:53
    JaroFon
    Poziom 23  

    Dzięki bardzo, znowu się czegoś nowego dowiedziałem

    Dodano po 16 [minuty]:

    A jeszcze mam takie pytanko. Chcę bardziej rozszerzyć listę pracowników i w kolumnie 'D' jest jeszcze numer pracownika. Ja zrobić żeby połączyć ze sobą te dwie kolumny w liście? Chcę w oknie Forms dodać dodatkowy przycisk (powiedzmy CheckBox) którym będę mógł wybrać czy lista ma być z czy bez numera pracownika.

    0
  • #7 25 Lis 2012 23:25
    marek003
    Poziom 40  

    Rozumiem że zaczynasz kombinować i to pozytywne ale ... im więcej kombinacji tym więcej wiedzy co się robi.
    Przykład dla nr pracownika w kolumnie A
    Masz jak zwykle parę rozwiązań.

    Jedno z nich:
    robisz jeden nazwany zakres np. "Listka" (jak wyżej) i drugi Listka2 ze "źródłem"

    Cytat:
    =PRZESUNIĘCIE('Lista pracowników'!$A$3;0;0;ILE.NIEPUSTYCH('Lista pracowników'!$B:$B);2)

    Zwróć uwagę na subtelne różnice.

    Teraz za pomocą jeżeli (if) w VBA w zależności od twojego wyboru (checkbox) zamiast
    RowSource="Listka"
    "podstaw" RowSourse = "Listka2"

    Ale by to "działało" trzeba zmienić we właściwościach comboBox'a to by pokazywał dwie kolumny czyli ColumnCount=2 (zamiast 1) [może to być "wciśnięte" w kodzie wcześniejszego "if"]

    Pozostaje kwestią dodatkową jakie dane ma zwracać okienko combobox.value w takim przypadku.
    Gdy się wybierze danego pracownika ma pokazać jego numer czy nazwisko.
    Za to odpowiedzialna jest własność:
    BoundColumn=2 / lub 1 (która kolumna)

    W miarę zrozumiałe?

    0
  • #8 26 Lis 2012 18:49
    JaroFon
    Poziom 23  

    Trochę jest to skomplikowane. Ogólnie to rozumiem co napisałeś ale problem jest w tym że lista pracowników jest w kolumnie 'B' a lista numerów pracowników jest w kolumnie 'D' więc tego nie połączę chyba tak jak napisałeś bo lista pokaże jeszcze zawartość kolumny 'C'. Ale zastanawiam się nad innym rozwiązaniem i tu mam pytanie, czy można połączyć teksty dwóch kolumn w poniższej formule? Czyli połączyć teksty z kolumn 'B' i 'D' tak żeby teksty były od siebie oddzielone spacją?
    =PRZESUNIĘCIE('Lista pracowników'!$B$3;0;0;ILE.NIEPUSTYCH('Lista pracowników'!$B:$B);1)
    Jeśli jest taka możliwość to wtedy zrobiłbym dwie listy, jedna z samymi nazwiskami a druga z nazwiskami i numerami

    Dodano po 1 [godziny] 19 [minuty]:

    Zrobiłem to trochę tak na skróty. W arkuszu w którym jest lista pracowników dodałem pomocniczą kolumnę a w niej połączyłem dwa teksty taką formułą: =ZŁĄCZ.TEKSTY(B3;" ";D3) i przeciągnąłem przez całą listę pracowników a nawet więcej gdybym dodawał nowe pozycje. Z nowo utworzonej kolumny zrobiłem listę. Teraz w oknie UserForms dodałem przycisk 'CheckBox1' a w nim kod:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Wszystko jest ok, po przełączaniu przyciskiem 'CheckBox1' mam dostęp do obydwóch list, jednak jest jeden mały szkopuł. Nowo utworzona lista ma w swoich komórkach formuły i niestety poniższa formuła bierze to pod uwagę i nie pokazuje tylko listę pracowników z numerami ale cały zakres nawet tam gdzie nie ma pracownika ale jest formuła. Jak to można ugryźć?
    =PRZESUNIĘCIE('Lista pracowników'!$AA$3;0;0;ILE.NIEPUSTYCH('Lista pracowników'!$AA:$AA)-1;1)

    0
  • Pomocny post
    #9 26 Lis 2012 20:01
    marek003
    Poziom 40  

    Tak na szybko bo nie mam czasu.
    Jeżeli AA wynika z B i D to spokojnie można zrobić tak:
    =PRZESUNIĘCIE('Lista pracowników'!$AA$3;0;0;ILE.NIEPUSTYCH('Lista pracowników'!$B:$B)-1;1)

    Choć myślę że trzeba by było zmienić całkiem podejście. Ale to może później bo teraz muszę lecieć.

    0
  • #11 02 Gru 2012 08:50
    JaroFon
    Poziom 23  

    Mam pytanie związane z oknem TextBox i wyświetlanymi dwoma kolumnami. Czy można te kolumny przybliżyć do siebie (bez konieczności rozszerzania okna TextBox) bo jak widać na screenie druga kolumna jest niewidoczna?
    Excel- Jak utworzyć listę pracowników w ComboBox

    0
  • #12 02 Gru 2012 13:16
    marek003
    Poziom 40  

    Możesz wpisać w właściwościach boxa:

    Excel- Jak utworzyć listę pracowników w ComboBox

    lub w kodzie zarządzać tą właćsiwością:

    combobox1.ColumnWidths=10;20

    0