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.

[vba][Excel] - Dodawanie pozycji listy do CmboBox (AddItem)

siwek62 13 Paź 2012 14:46 4695 10
  • #1 13 Paź 2012 14:46
    siwek62
    Poziom 11  

    Witam
    Chciałbym prosić o wyjaśnienie przyczyny pewnego błędu. W mojej procedurze wykorzystuje metodę AddItem dla dodania nowej pozycji listy w kontrolce ComboBox. Wszystko jest ok gdy dodaję do listy kolejną pozycję problem pojawia się gdy na liście nie ma jeszcze żadnych pozycji, czyli gdy dodaję pierwszą pozycję.
    Fragment kodu wygląda tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Błąd pojawja się w miejscu:
    .List(.ListCount - 1, 10) = varIndex

    Błąd to - Could not set the list property. Invalid property value.

    Dodam, że ComboBox cmbAdresat ma właściwość ColumnCount = 13.
    W procedurze UserForm Initialize ładuję dane do ComboBox-a z zewnętrznego pliku, jeżeli nie ma danych do załadowania to robię cmbAdresat.Clear.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Próbowałem różnych prostackich rozwiązań, np. gdy nie ma danych to wstawiałem do każdego pola listy pusty ciąg "", albo stworzyłem dodatkową kontrolkę TextBox z wartością "-" i zamiast varIndex było Trim(Me.txIndex.Text) ale efekt zawsze był ten sam, błąd invalid property value.
    Czy ktoś mógłby mi wyjaśnić na czym polega problem? Z góry dzięki.

    0 10
  • #2 13 Paź 2012 16:10
    adamas_nt
    Moderator Programowanie

    Problem, zdaje się, jest innej natury:

    [vba][Excel] - Dodawanie pozycji listy do CmboBox (AddItem)

    0
  • #3 13 Paź 2012 17:02
    siwek62
    Poziom 11  

    Czyli z tego co zrozumiałem, wynikałoby że maksymalna liczba kolumn to 10. Ale używam ComboBoxy i ListBoxy z większą liczbą kolumn. Także odwołuje się do wartości kolumn o indeksie powyżej 10 i jest ok. Także przy dodawaniu, jak wspomniałem, jeżeli na liście są już jakieś pozycje to nie ma problemu żeby dodać kolejną.
    Chyba że źle rozumiem ten fragment helpa, który mi cytujesz. Dałoby by radę trochę rozwinąć twoją odpowiedz?

    0
  • #4 13 Paź 2012 20:44
    adamas_nt
    Moderator Programowanie

    Dla pewności zrobiłem mały eksperyment. Nie ma problemu przy przypisywaniu tablicy dwuwymiarowej (0 to 11, 0 to 11) lub zakresu (ListFillRange="A1:L12"). Natomiast próba z Add/Column kończy się błędem na 10 indeksie...

    0
  • #5 14 Paź 2012 11:25
    siwek62
    Poziom 11  

    Ok, nie dyskutuję, że to jest źródło błędu, wspominam jedynie, że dopóki nie miałem doczynienia z dodawaniem do pustej listy nie zauważyłem błędu. Ponieważ staram się słuchać rad mądrzejszych odemnie zmieniam właśnie mój kod tak aby nie mieć w ComboBoxach więcej niż 9 kolumn. Tak na wszelki wypadek, zakładam bowiem, że jeśli w jednym przypadku pojawił się błąd to może ujawnić się jeszcze w jakimś innym.
    Problem, który w związku z tym muszę rozwiązać to jak skojarzyć większą ilość danych niż zawartą w 9 kolumnach. Może mógłbyś mi doradzić jak w sposób optymalny się to realizuje.
    Chodzi o to, że dane pobieram z tabeli Accessa, która ma np. 14 kolumn. Wybór pozycji na liście ComboBoxa wypełnia kilka TextBoxów plus ustawia wartość kilku zmiennych. Rozwiązanie, które mi chodzi po głowie jest następujące. Pobrać wartości kilku kolumn (<10) i załadować je na listę ComboBoxa pozostałe dane pobrać do zmiennej tablicowej. Trzeba by zabezpieczyć się przed rozjechaniem się danych (dane z tabeli podlegają sortowaniu), ListIndex ComboBoxa musałby odpowiadać indeksowi zmiennej tablicowej.
    Albo drugie rozwiązanie, wybierając pozycję na liście ComboBox, pobieram indeks pozycji w tabeli Accessa i na podstawie tego indeksu pobieram pzostałe dane. To rozwiązanie nie za bardzo mi się podoba, za często musiałbym się łączyć z Accessem.
    Staram się nie pobierać danych do arkusza Excela, mógłbyś mi doradzić w jakim kierunku pójść?

    0
  • #6 14 Paź 2012 13:11
    adamas_nt
    Moderator Programowanie

    W załączniku jest procedura "sub elka", która jeszcze wczoraj wysypywała się na 10 indeksie.

    Przed momentem dorobiłem "resetowanie" ustawień i miałem zamiar zademonstrować przypisanie tablicy do listy (TblToList)... Coś mnie tknęło, spróbowałem wpisać bezpośrednio do listy i... zaczęło działać. Wczorajsze "złe" makro również.

    Wygląda na to, że ustawienia we właściwościach swoje, a zdefiniowane w kodzie swoje. Przyznam się, że nie rozumiem o co tu chodzi.
    Żeby uniknąć błędu, najpewniej będzie zapisywać rekord do tablicy i tablicę przypisywać do ComboBox'a.

    Edit: No teraz już całkiem zgłupiałem. Dopiero po wpisaniu tablicy do listy, następnie jej usunięciu zaczyna działać bez błędu makro "elka" i działa do zamknięcia pliku. Po ponownym otwarciu to samo :?: tablica, zapis, reset, działa...

    0
  • #7 14 Paź 2012 14:55
    siwek62
    Poziom 11  

    Mam wątpliwości czy zrozumiałem to co chciałeś mi przekazać, ale mam wrażenie, że opisałeś to co było sednem mojego pierwotnego pytania.
    Czyli jeżeli na liście ComboBoxa są już wprowadzone dane (kolumn >10) to dodawanie kolejnych pozycji działa bez błędu. Pierwsze załadowanie listy też realizowałem przepisując tablicę, trochą co prawda inaczej niż w twoim przykładzie, ale to chyba bez znaczenia. Ja to robiłem tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    i następnie hurtem całą tablice do ComboBoxa
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Niestety jeżeli x = 0 to AddItem/Column 10 się wysypuje, a moja procedura musi uwzględniać także sytuację gdy nie ma danych do załadowania na listę.

    0
  • #8 14 Paź 2012 15:27
    adamas_nt
    Moderator Programowanie

    Wygląda to na błąd Excela, albo dzieje się coś, czego nie rozumiem.
    Można to ominąć przez, jak pisałem, załadowanie i usunięcie nawet pustej tablicy, zawierającej >10 kolumn jako "inicjacji" listy combobox'a. Do zamknięcia pliku/formularza dopisywanie do listy, bez względu na ilość kolumn, będzie działać.

    W załączniku plik z demonstracją. Po otwarciu próba dopisania rekordu do listy kończy się błędem. Po naciśnięciu Inicjacja, można dopisywać aż do zamknięcia pliku...

    0
  • #9 14 Paź 2012 19:34
    siwek62
    Poziom 11  

    Dzięki, zaadaptowałem twoją demonstrację do swojej procedury. Sam też kombinowałem podobnie, dodawałem w pętli puste ciągi.
    Ale jest to pewna proteza dlatego wykombinowałem jeszcze inne rozwiązanie. Wartości, które chcę dodać na listę zapisuje najpierw w bazie z której pobieram dane przy inicjacji. W następnym kroku pobieram dane z tabeli, która już nie jest pusta i ładuję na listę ComboBoxa. Ale mam pewien kłopot. W dalszej części kodu potrzebny mi ListIndex nowej pozycji. Jeśli dodaję pozycję metodą AddItem nowa pozycja jest na ostatnim miejscu i łatwo mogę odczytać ListIndex np. funkcją UBound. Jeżeli załaduję listę ponownie i zrobię sortowanie to nie wiem jak mógłbym ustalić ListIndex nowej pozycji. Mógłbym ewentualnie zrezygnować z sortowania ale wolałbym nie. Wartość pola Combo nie jest unikalna, może się powtarzać, różnią się wartości skojarzonych pól.
    Może mógłbyś coś doradzić?

    0
  • #10 14 Paź 2012 20:41
    adamas_nt
    Moderator Programowanie

    W ogóle zrezygnowałbym z metody AddItem, chociażby ze względu na poruszony problem. Najprościej zadeklarować tablicę i nią się posługiwać. Przy każdej zmianie czyszczenie i ponowne przypisanie jako listę Combobox'a. Wtedy ListIndeks będzie identyczny z pozycją w tablicy.
    Nie widzę Twojego projektu, ale takie rozwiązanie wydaje się sensowne.

    0
  • #11 14 Paź 2012 21:01
    siwek62
    Poziom 11  

    Dziękuje za rady, też skłaniałem się do zmiennej tablicowej, utwierdziłeś mnie że jest to dobry kierunek kombinowania.

    Pozdrawiam

    0
  Szukaj w 5mln produktów