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

Excel 2007, UserForm i Combobox

05 Lip 2011 20:36 13906 14
  • Poziom 10  
    Witam,
    Próbuję zwiększyć działanie arkuszy poprzez formularze. Mam arkusz z listą sal wykładowych (kolumna A = nr sali, kolumna B = opis sali) i formularz do wprowadzania danych z nowymi salami. Na drugim arkuszu, w nowym formularzu poprzez kontrolkę combobox chciałabym wybierać salę z pierwszego arkusza (Arkusz1!A) z jej opisem (Arkusz1!B) i wpisać daty i godziny rezerwacji. Lista sal jest zmiennej długości - sal będzie przybywać (do pewnego momentu, oczywiście). W związku z tym mam pytanie:
    Czy można i jeśli tak to w jaki sposób wyświetlać w combobox listę składającą się z dwóch kolumny (czyli nr sali i drugą kolumnę zawierającą jej opis) a nie jednej jak to zazwyczaj ma miejsce, a do arkusza zapisywać tylko dane z jednej wyświetlanej kolumny czyli numer sali.
    Mam nadzieję, że zbytnio nie zagmatwałam tematu.
    Prośba o pomoc początkującej.
  • Poziom 22  
    Nie ma standardowych "podwójnych" combo box - trzeba wyświetlaniem w drugim sterować na podstawie tego co jest w pierwszym. Jeśli tylko do tego ma służyć UserForm, to można rozważyć inną koncepcję:
    - na górze arkusza zrobić "sekcję" wprowadzania danych i zablokować przez okno-> zablokuj okienka
    - wybór sali w komórce z listy zadeklarowanej w Dane-> sprawdzanie poprawności (z nazwy lub zakresu)
    - opis sali pojawi się automatycznie w innej komórce- funkcja WYSZUKAJ.PIONOWO
    - nie trzeba wywoływać okna UserForm, bo zawsze "jest dostępne".

    Jeśli jednak ma być UserForm, to drugi combo box nie jest potrzebny - gdzieś na formie ma być wyświetlany opis sali, prawda? Można ten opis wyświetlić w zwykłym label - to ma być pole wyłącznie informacyjne, bez interakcji z użytkownikiem?
  • Moderator Programowanie
    Venrica napisał:
    Czy można i jeśli tak to w jaki sposób wyświetlać w combobox listę składającą się z dwóch kolumn
    Jeśli chodzi o dwie kolumny w combobox'ie
    Wartość BoundColumn to kolumna, z której pobierane są dane.

    Excel 2007, UserForm i Combobox

    Excel 2007, UserForm i Combobox

    Wczytanie zakresu z kolumn A:B oraz wpisanie wartości do komórki.
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 29  
    W prosty sposób robi się to w okienku ListBox. Poniżej opiszę krok po kroku jak to zrobić ( opis dotyczy Excel 2003 )
    1. stworzyć listę , w kolumnie A numer sali , w kolumnie B opis sali
    2. utworzyć na arkuszu ( tym samym co spis ) okienko ListBox ( menu Narzędzia/ Dostosuj, wybrać w zakładce Paski narzędzi, Przybornik formantów )
    3. z paska Przybornik formantów wybrać ListBox
    4. narysować na arkuszu okienko ListBox
    5. nadać nazwę zakresowi komórek zawierających dane sal np. A1:B50 ( tylko do takiej wielkości jaką określimy w nazwie będziemy widzieli dane w ListBox ( w tym przypadku 50 pozycji ), oczywiście możemy to zmienić na dowolny rozmiar. Jak nadać nazwę? zaznaczyć zakres komórek( A1:B50 ) menu Wstaw/Nazwa/Definiuj nadać w okienku nazwę np. sale1
    6. wybrać ( podświetlić ) ListBox i prawym przyciskiem myszy z ukazanego menu wybrać Właściwości
    Interesują nas pola:
    BoundColumn - wpisujemy do niego wartość określającą z której kolumny mają się wyświetlić dane ( w naszym przypadku 2 )
    ColumnCount - wpisujemy do niego wartość z ilu kolumn mają się wyświetlić dane w ListBox ( u nas 2 )
    Linked Cell - podajemy adres komórki gdzie ma się pojawi wybrana przez nas w ListBox informacja ( u nas I1 )
    ListFillRange - wpisujemu nazwę zakresu komórek z danymi ( u nas sale1 )
    Zamykamy okno Properties i cieszymy się efektami
    Pozdrówka
    PS. w załaczniku prosty przykład, na obrazkach ruchy po Excelu
    Excel 2007, UserForm i Combobox
  • Poziom 10  
    Dzięki za odpowiedzi.
    "Aldrin" niestety opis sali nie będzie tylko informacją, więc nie mogę wstawić tego do labela, ale posunąłeś mi pomysł by rozwiązać to przy pomocy 2 pól ComboBox, dając możliwość wyboru danych - jeśli wiadomo jaki nr ma sala wybieramy poprzez pierwszy formant, a jeśli nie znamy numeru szukamy/wybieramy salę po opisie w drugim formancie. Dzięki za pomysł.
    "bobo" dzięki za obszerny opis ale w excelu 2007 (nie wiem czy też tak jest w 2003) jest rozróżniany formant ActiveX, który opisałeś i formant formularza w którym nie występuje pole ListFillRange niezbędne w tym przypadku.
    "adamas_nt" próbuję zastosować podanym przez Ciebie kod i mam pytanie czy mogę wykorzystać nazwany zakres z arkusza z salami obejmujący komórki A1:D12 (poprzez UserForm dodaję salę wstawiając wiersz do zakresu) odwołując się tylko do części tego zakresu?

    Dodano po 58 [minuty]:

    Zrobiłam poniższy przykład ale pewnie coś pominęłam bo mam pustą listę Combo Box ?

    Excel 2007, UserForm i Combobox

    Wczytanie zakresu z kolumn A:B oraz wpisanie wartości do komórki.
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    [/quote]
  • Poziom 22  
    Literówki. Trzeba zrobić dwie zmiany:
    - zakres wczytujemy z Arkusz1, a dane wpisujemy do Arkusz2
    - CommandButton nazywa się "cmbOK", a powinien cmdOK

    i wtedy bedzie dobrze.

    Można jeszcze określić szerokość kolumn w ComboBox - ColumnWidths wpisując np.: 20 pt;25 pt. Pierwsza wartość określi szerokość pierwszej kolumny, a druga drugiej, ale priorytetem jest chyba dostosowanie tej "pozostałej" szerokości do szerokości ComboBox, więc mimo tego że wpisane jest "25", to szerokość dla drugiej kolumny dostosowana będzie automatycznie. Tak jest w v. 2003 i 2007.

    Cytat:
    odwołując się tylko do części tego zakresu

    do części "zwartej", w jednym bloku, np. kolumny A i B, czy z przerwą np. kolumny A i C? A może rozdzielone w wierszach?
  • Poziom 10  
    Aldrin napisał:
    Literówki. Trzeba zrobić dwie zmiany:

    Dzięki, późna pora jednak pogarsza wzrok.

    Ustawiłam szerokość wyświetlanej kolumny oraz podpowiedzi Numer_sali po naciśnięciu pierwszej litery i mam pytanie:
    - dlaczego w oknie Combo Box podpowiada się tylko pierwsza kolumna z numerem sali a nie widać opisu sali, opis widać dopiero po rozwinięciu listy Combo Box?
    - czy jest jakiś parametr powodujący automatyczne rozwinięcie listy po wpisaniu pierwszej litery? Tak by było widać przesuwane się po liście wpisując kolejne litery czy liczby z kolumny Numer_sali?
    - jak posortować dane na liście Combo Box? Czy trzeba utrzymywać dane na Arkusz1 zawsze posortowane?

    Cytat:
    odwołując się tylko do części tego zakresu

    Aldrin napisał:
    do części "zwartej", w jednym bloku, np. kolumny A i B, czy z przerwą np. kolumny A i C? A może rozdzielone w wierszach?


    W jednym przypadku będzie to część "zwarta" zakresu czyli kolumny A:B, a w następnym niestety z przerwą czyli kolumna A i D. Zakres o nazwie "zakrSale" będzie obejmował kolumny A1:F9 z Arkusza1 i będzie się powiększał o kolejne wiersze.

    Dla ułatwienia dodaję plik z powyższym przykładem.
  • Moderator Programowanie
    Może jednak lepszym rozwiązaniem będzie ListBox (załącznik).
    Sortowanie prościej przeprowadzić w arkuszu.

    Cytat:
    czy jest jakiś parametr powodujący automatyczne rozwinięcie listy po wpisaniu pierwszej litery?
    Substytut w załączniku. Można realizować wyszukiwanie w polu tekstowym, gdzie zdarzenie "przy zmianie" spowoduje filtrowanie danych dla pola listy. Dla wielu kolumn konieczne będzie wykorzystanie tablicy dwuwymiarowej.
  • Poziom 10  
    adamas_nt napisał:
    Może jednak lepszym rozwiązaniem będzie ListBox (załącznik).
    ListBox jest dobrym rozwiązaniem i wykorzystam ten formant w innym miejscu przy krótkiej liście. Przy liście sal ListBox będzie trochę uciążliwy, gdyż lista ta będzie dość długa a początek numeru sali będzie podobny np. "A01100", "A01101", "A01..." i tak przez kilkadziesiąt wierszy, więc trzeba byłoby wielokrotnie wciskać literę A aby dojść do szukanego numeru sali. Myślałam raczej o wpisywaniu kolejnych znaków sądząc iż lista sal będzie się zmniejszać, im dłuższy będzie podanym numer sali jako ciąg znaków zgodny z całkowitym ciągiem występującym na liście sal tym lista ta będzie krótsza, aż dojdziemy do jednego wiersza gdzie podany przez nas ciąg znaków będzie zgodny z tym występującym na liście.

    Cytat:
    Można realizować wyszukiwanie w polu tekstowym, gdzie zdarzenie "przy zmianie" spowoduje filtrowanie danych dla pola listy. Dla wielu kolumn konieczne będzie wykorzystanie tablicy dwuwymiarowej.
    To może być to. Filtrowanie danych dla pola listy - nie bardzo wiem jak to zapisać. Zrobiłam plik z przykładem. Pole do wpisywania numeru sali ma nazwę "txtNrSali" ale zupełnie nie wiem jak zapisać filtrowanie w VB?
  • Poziom 10  
    Dzięki, dokładnie o to chodziło.
    Dorobiłam wyszukiwanie dla pola "Opis sali" i "Adres sali" i znów mam pytanie:
    - dlaczego ograniczenie listy następuje dopiero po wpisaniu spacji, tzn. w polu "txtOpisSali" wpisuję "e" i dopiero gdy wpiszę spację lista się "zawęża"?
    W ListBox chciałam wyświetlić nazwy kolumn, ustawiłam więc właściwość ColumnHead na "True" i w RowSource chciałam podać nazwy kolumn ale za każdym razem mam błąd o nieprawidłowych wartościach dla właściwości. Czy nazwy kolumn dla ListBox trzeba wpisać za pomocą kodu VBA? Czy ustawia się je we właściwościach pola?
  • Pomocny post
    Moderator Programowanie
    Venrica napisał:
    dlaczego ograniczenie listy następuje dopiero po wpisaniu spacji
    Należy zmienić warunek porównujący stringi. Funkcja InStr szuka także wewnątrz. Np pamiętasz, że sala ma w nazwie "020" a nie pamiętasz początku. W przypadku długich ciągów metoda nie sprawdza się. Spróbuj
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Jeśli chodzi o nagłówki. VBA jest "ślepy" jeśli przypisujesz listę inaczej niż przez RowSource. W naszym przypadku filtrujemy tablicę i jeśli przypiszemy listę z nagłówkami na sztywno (lstSala.RowSource = "=Arkusz1!A1:D" & ostWrs), rozjedzie się filtrowanie. Oczywiście przed wpisaniem tablicy można wyczyścić listę (RowSource=""), ale wtedy nagłówki nam "uciekną". Po mojemu rozwiązanie z labelem jest wystarczające (i pewniejsze). Wyłącz nagłówki, dla labela ustaw Height=10 i Top=62 i będzie ładnie.
  • Poziom 10  
    adamas_nt napisał:
    Jeśli chodzi o nagłówki. VBA jest "ślepy" jeśli przypisujesz listę inaczej niż przez RowSource... Po mojemu rozwiązanie z labelem jest wystarczające (i pewniejsze). Wyłącz nagłówki, dla labela ustaw Height=10 i Top=62 i będzie ładnie.

    Czyli pierwszy pomysł najlepszy. Ok
    Rozbudowałam formularz dodając ikonę z kalendarzem i Checkbox-y z dniami tygodnia. Mam mały problem z wstawieniem wybranej daty do formantu "txtDataDo". Pierwsza ikona z kalendarzem "imgKalendarzOd" przypisuje wybraną datę do formantu "txtDataOd", wybierając drugą datę też chciałam wykorzystać ten sam kalendarz i przypisać ją do formantu "txtDataDo" tylko czy do tego trzeba utworzyć drugą zmienną dData w klasie "clsWpisz"? Czy napisać warunek "jeśli została naciśnięta ikona "imgKalendarzOd" to przypisz zmienną "dData" do formantu "txtDataOd" a jeśli została naciśnięta ikona "imgKalendarzDo" to przypisz zmienną "dData" do formantu "txtDataDo"? Tylko czy jest taka możliwość?
    Drugie moje pytanie dotyczy kroku zapisywania danych z formularza do "Arkusza2" i warunku dla "CheckBox-ów" czy dla każdego muszę zapisywać pętlę, czy tego kawałka kodu nie dałoby się skrócić?

    I jeszcze taki drobiazg. Jak na koniec po wybraniu przycisku "Dodaj" wyczyścić formanty z ostatniego wyboru/danych. Dla formantów TextBox nie ma metody "Clear", czy wstawić do nich pusty ciąg znaków? (to chyba mało profesjonalne?). Czy jedyną metodą jak gdyby "wyzerowania" pól jest "Unload UserForm1"?
    Będę wdzięczna za pomoc i wskazówki.
    Pozdrawiam
  • Moderator Programowanie
    Kontrolki należą do kolekcji obiektu nadrzędnego i mają swój typ (Typename), co można wykorzystać (załącznik). Jeśli chodzi o daty, hmm. Dodałem nowy moduł, zadeklarowałem zmienną publiczną, której wartość zmienia kliknięcie w ikonkę, a która sprawdzana jest w module klasy, uff (patrz załącznik). Plus kilka poprawek, które przyszły mi do głowy...
  • Poziom 8  
    1.

    Jak zmodyfikować kod, aby formularz wyrzucał nie tylko nr sali w pierwszej kolumnie, ale również nr budynku w drugiej kolumnie i dopiero dalej datę, dni tygodnia, itd.

    2.

    Czy można przypisać do każdej z sal zdjęcie? Tak jakby się przeglądało automatycznie zdjęcia by się zmieniały..?