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 listbox nie wyświetla obiektu

muchajarek 15 Kwi 2012 00:22 2667 20
  • #1 15 Kwi 2012 00:22
    muchajarek
    Poziom 10  

    Witam. Potrzebuję porady. Utworzyłem kod, który przy użyciu kilku listboxów tworzy, a następnie wpisuje do arkusza ciąg znaków (tzw pozycję kosztów). Działa to prawidłowo, jeśli dodaje nowe pozycje kosztów. Czasami jednak potrzeba poprawić źle napisaną pozycję (zmienić jeden element). Zaznaczam komórkę z tą pozycją kosztów (w listboxach zaznaczają się odpowiednie obiekty) zmieniam błędny element, klikam "Dodaj" i .... No właśnie i tu jest problem. Wszystko jest OK jeśli wcześniej pracowałem na listboxach (tzn jeśli zmieniałem w nich obiekty). Jednak w świeżo otwartej formatce dodają się tylko obiekty z 4, 5 i 6 listboxa, oraz ten poprawiony. Reszta, mimo że obiekty są odznaczone w listboxach nie przenoszą się do komórki. Trochę długi opis problemu, ale chciałem sprawę wyjaśnić klarownie.
    Proszę o poradę.

    0 20
  • #2 15 Kwi 2012 02:15
    walek33
    Poziom 28  

    Cytat:
    ale chciałem sprawę wyjaśnić klarownie.

    No i nie wyszło. :D
    O jakie obiekty chodzi? Dla mnie obiektem w VBA jest Forma, ListBox, Button itd. Myślę jednak, że to co dla mnie jest obiektem dla Ciebie wcale być nie musi (i odwrotnie). Najprostsze i najłatwiejsze wyjaśnienie w czym tkwi problem to moim zdaniem załączenie przykładowego pliku, w którym coś nie działa (albo chociaż rzeczony kod).
    Określenie:
    Cytat:
    dodają się tylko obiekty z 4, 5 i 6 listboxa

    jest mocno nieprecyzyjne. Bo skąd taki ja, co nie widziałem jak wygląda Twoje arcydzieło mam wiedzieć dlaczego się nie dodaje to co dodawać się powinno. Ja wiem, że Ty wiesz, że ja nie wiem o co chodzi. Takie jest właśnie piękne opisowe przedstawienie problemu. Napisałeś się niewąsko i to co Ci w tej chwili mogę powiedzieć z całą pewnością to w tekście Twojego opisu użyłeś:
    - 121 wyrazów
    - 695 znaków (bez spacji)
    - 814 znaków (ze spacjami)
    To wszystko w 2-óch akapitach.

    0
  • #3 15 Kwi 2012 14:16
    muchajarek
    Poziom 10  

    No tak należało mi się. Chciałem umieścić przykładowy plik i myślałem, że to zrobiłem. Niestety plik nie pojawił się.Naprawiam błąd.

    0
  • #4 15 Kwi 2012 15:01
    walek33
    Poziom 28  

    Cytat:
    Proszę o podpowiedź.

    Znaczy się rozumiem, że chodzi o podpowiedź w sprawie zamieszczenia załącznika.
    Właściwe (?) pytanie i konkretna podpowiedź:
    Jak będziesz pisał następny post zjedź poniżej paska z napisem Dodaj załącznik (max. 50MB)
    Kliknij na Przeglądaj.
    W okienku dialogowym, które Ci się ukaże wybierz właściwy plik i kliknij Otwórz.
    Kliknij na przycisk Dodaj załącznik (+5pkt) znajdujący się poniżej Przeglądaj.
    Wyłącz prowizję (znaczy punkty za plik). W TBoxie powinna być wartość ujemna (-0.01).
    Załącznik dodany. Weź jednak pod uwagę, że nie wszystkie rozszerzenia są akceptowane (xls przechodzi).

    Dodane:
    Ha, widzę, że się spóźniłem. :D

    0
  • #5 15 Kwi 2012 15:05
    muchajarek
    Poziom 10  

    Dzięki za pomoc w sprawie wstawienia pliku. Poradziłem sobie. Problem był właśnie z plikiem rozszerzonym.

    0
  • #6 15 Kwi 2012 15:22
    walek33
    Poziom 28  

    Znaczy od początku. Gdybyś mógł zapisać plik w formacie starszego Excela to (przynajmniej mnie) będzie łatwiej. W OO makra nie do końca chcą działać a nowym Excelem nie dysponuję. :cry:
    A teraz do tematu. Co nie działa? Na pierwszy rzut oka bez uruchamiania to wystąpił drobny problem z tablicą (znaczy z jej deklaracją).
    W VBA zapis:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    deklaruje tablicę z elementami:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Sprawdź to.

    0
  • #8 15 Kwi 2012 16:16
    walek33
    Poziom 28  

    Czemu w odwołaniach do ListBox-ów używasz Object?
    Mają przecież taką piękną właściwość jak Value. Spróbuj z nią.
    Na marginesie. Wspomniana wcześniej deklaracja tablicy nie ma negatywnego wpływu na działanie Twojego kodu. Po prostu niepotrzebnie zadeklarowałeś tablicę o jeden element większą.
    Jeżeli chcesz, żeby tablica zaczynała się o 1 zadeklaruj:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #9 15 Kwi 2012 16:50
    muchajarek
    Poziom 10  

    Przykro. Nie pomogło. Opisze co nie wychodzi. W otwartym arkuszu zauważam błąd w jednej z komórek (pozycji kosztów)np komórka A6 "T14013D2033". Wciskam "Otwórz". Otwiera się formatka z listboxami. Zaznaczam komórkę A6. W listboxach zaznaczają się odpowiednie wartości (ja wcześniej nazwałem je obiektami. Pewnie błędnie ?). Zmieniam wartość w jednym z listboxów (poprawiam błąd). Np w listbox1, z "T14" na "K14". Wciskam "Dodaj". W komórce A6 powinno wyświetlić się " K14013D2033" a tak się nie dzieje. Wyświetla się tylko zmieniona wartość i wartość 4 ,5 i 6 listboxa. Co dziwniejsze w excel 2003 wyświetla się zmieniona wartość i wartość 1 ,2 i 3 listboxa.

    0
  • #10 15 Kwi 2012 17:01
    walek33
    Poziom 28  

    Wstaw nowy moduł (standard) i zadeklaruj w nim tablicę element:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Pozostałe deklaracje tej tablicy usuń.

    0
  • #11 15 Kwi 2012 17:11
    muchajarek
    Poziom 10  

    Jestem bardzo początkujący. Co to jest moduł standard ? :cry:

    0
  • #13 15 Kwi 2012 17:39
    muchajarek
    Poziom 10  

    Zmylił mnie ten "standard" :D .Nadal nie pomogło.Do czegoś jednak doszedłem.

    muchajarek napisał:
    Wciskam "Otwórz". Otwiera się formatka z listboxami.
    . Zauważyłem, że po tej czynność niektóre listboxy mają wartość NULL, a niektóre wartość "".Te które mają wartość NULL po zaznaczeniu komórki A6 przyjmują odpowiednią wartość, a te z wartością "" pozostają "".Nie wiem tyko, dlaczego niektóre mają wartość NULL, a niektóre "". Co ciekawe po ponownym uruchomieniu pliku, to sie zmienia.

    0
  • #14 15 Kwi 2012 17:47
    walek33
    Poziom 28  

    Też się z tym kopię.
    Przypisz wszystkim null w zdarzeniu selectionchange arkusza1.
    ListBox1 = Null itd. Wstaw to po wypełnieniu tablicy a przed przypisywaniem TBoxom wartości

    Dodane:

    Chyba jednak nie pomoże.

    0
  • #15 15 Kwi 2012 18:15
    muchajarek
    Poziom 10  

    Też na to wpadłem, nie pomogło.

    Dodano po 25 [minuty]:

    Jeszcze jedno spostrzeżenie. to nie ponowne otwarcie pliku powoduje zmianę wartosci NULL i "" w listboxach. Te wartości zmieniają się, gdy podczas projektowania je "poruszam" na formatce. Nie ma reguły, że "poruszony" listbox będzie miał NULL. Jedyna reguła to, że zawsze 3 listboxy są NULL, a 3 "". :?:

    0
  • #16 15 Kwi 2012 18:18
    walek33
    Poziom 28  

    Doraźne rozwiązanie problemu to przy aktywacji danie focusa każdemu LBoxowi.

    Code:
    ListBox1.SetFocus

    Tak po kolei dla wszystkich w UserForm_Activate.

    0
  • #17 15 Kwi 2012 18:25
    muchajarek
    Poziom 10  

    Huuura. Dzięki za pomoc i za cierpliwość. Jeszcze dwa pytania. 1. Dlaczego doraźnie. 2. Co daje SetFokus (przypominam, bardzo początkujący, ale się uczę). I tak na marginesie to ciekawe czemu tak się dzieje ?

    0
  • Pomocny post
    #18 15 Kwi 2012 18:35
    walek33
    Poziom 28  

    1 - Bo nie do końca tak być powinno lecz w tej chwili nie bardzo mam czas żeby dalej w tym kopać. :cry: Chodzi mi o start formularza.
    2 - SetFocus "wybiera" kontrolkę jakby była kliknięta myszą.
    Na marginesie - w tej chwili nie wiem, ale jak będę miał czas to spróbuję dojść co Ci się udało ściemnić w ListBoxach. :D

    0
  • #19 15 Kwi 2012 18:39
    muchajarek
    Poziom 10  

    Jeszcze raz serdeczne dzięki. :D

    0
  • #20 15 Kwi 2012 20:35
    walek33
    Poziom 28  

    Nie ma za co. Mam tylko nadzieję, że nie pisałeś sześć razy LB.SetFocus (to tak trochę nieprofesjonalnie :D ) a zastosowałeś pętelkę w stylu:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    deklarując przedtem w procedurze:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Dodatkowo, jak już tak upierdliwie marudzę, pozbądź się niepotrzebnych kropek. Czym ich mniej tym lepiej.
    Których kropek? Ano tych gdzie wiersz po wierszu powtarzasz UserForm1.Listbox...
    Ładniej wygląda i szybciej (co w przypadku tak skomplikowanego kodu nie ma znaczenia :D ) działa:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    To tak na przyszłość do wykorzystania w innych przypadkach kilkukrotnego odwoływania się do jednej kontrolki. Teraz odwołanie do formularza w ogóle wyrzuć bo jest zbędne. VBA samo wie gdzie szukać tych LBoxów. To samo dotyczy Me. w pozostałych procedurach. Po co niepotrzebnie Me-czeć? :D
    To pozostawmy kozom.

    Dodane:
    A żeby jeszcze bardziej namieszać Ci w głowie to te sześć linijek zamieniłbym na trzy:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    nie zapominając oczywiście o deklaracji oListBox w procedurze.

    0
  • #21 19 Kwi 2012 18:13
    muchajarek
    Poziom 10  

    Dawno tu nie zaglądałem. Chciałbym częściej, ale praca nie pozwala. Dzięki za konstruktywne porady. Jak już wspominałem jestem bardzo początkujący, ale nie ukrywam, że trochę mnie to wciągnęło. Tak wiec takie wskazówki nie mieszają mi w głowie, tylko rozjaśniają temat. Dzięki.

    0
  Szukaj w 5mln produktów