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 / VBA - Generowanie tabeli C na podstawie danych z A i B

sanda20wr 16 Sty 2015 21:27 1797 8
  • #1 16 Sty 2015 21:27
    sanda20wr
    Poziom 5  

    Cześć,
    mam duży problem z VBA w Excelu... Muszę coś zrobić, a nie potrafię. Przesiedziałam już mnóstwo godzin, przejrzałam kilka tutoriali, ale dalej jest to dla mnie czarna magia... Czy ktoś mógłby mi pomóc? Dołączam plik z przykładem oraz opis jak powinno to działać.


    Mam dwie tabele (A i B), które są wypełniane danymi ręcznie, chcę aby trzecia tabela C generowała się automatycznie, na podstawie zebranych danych z tabeli A i B, wg następujących założeń:

    1. W tabeli A sprawdza wszystkie niepuste linie (niepusta linia = zawsze ma wypełnione pole data) i dla tych, które mają kolumnę G (TEST) = X pobiera wybrane komórki do wrzucenia w tabeli C (wybrane komórki, czyli data, kwota, numer).

    2. W tabeli B sprawdza wszystkie niepuste linie i dla tych, które mają kolumnę O (TEST) = X lub L (RODZAJ) = X, pobiera również wybrane komórki do wrzucenia w tabeli C (wybrane komórki tak samo jak w przypadku pkt. 1).

    3. W tabeli C wrzuca dane, każdą w nowej linii, bez powielania ich. Jedyna różnicą to w przypadku danych z tabeli A uzupełnia komórkę w kolumnie U (MINUS), a z tabeli B w kolumnie T (PLUS).

    4. Dane sortuje pod dacie.

    Innymi słowy: to coś podobnego do raportu kasowego, gdzie mamy z jednej strony na plus, z drugiej na minus.

    5. Chciałabym, aby tabela C tworzyła się w pełni automatycznie, np. przy zmianie dowolnego pola w tabelach A lub B albo ew. przy każdym otwarciu pliku lub naciśnięcia jakiegoś buttona, do którego byłby przypisany skrypt.

    W dołączonym pliku stworzyłam tabelę C ręcznie - dla przykładowych danych z A i B dokładnie tak powinna wyglądać ta wygenerowana automatycznie.


    Z góry serdecznie dziękuję za jakąkolwiek pomoc!
    Sandra

    0 8
  • Pomocny post
    #2 16 Sty 2015 22:17
    marek003
    Poziom 40  

    sanda20wr napisał:
    Przesiedziałam już mnóstwo godzin, przejrzałam kilka tutoriali, ale dalej jest to dla mnie czarna magia... Czy ktoś mógłby mi pomóc?

    Ok. przedstawiłeś logicznie jak ma to wyglądać. Ale w czym ci pomóc?
    Przecież to proste więc nie wiem gdzie szukałeś.
    Dwie pętle "for".
    Najpierw dla tabeli A z warunkowym "if" jak w G jest X i zapis do tabeli C. Potem druga pętla dla tabeli B z warunkowym "if" jak w O jest X i w L jest X i zapis do tabeli C.
    Sortowanie tabeli C
    Koniec.

    Aby się aktualizowało wrzucić trzeba wykonanie procedury w odpowiednie miejsca czyli Open w "Ten skoroszyt" i change arkusza z danymi., a jak jest powyższe to przycisk mija się z celem aczkolwiek też można podpiąć pod przycisk.

    2
  • #3 17 Sty 2015 17:33
    sanda20wr
    Poziom 5  

    Szukałam i czytałam ogólne tutoriale z VBA dla początkujących, ale nigdy z tym nie miałam styczności i dla mnie to nie takie proste.

    Dziękuję za sugestie, może teraz mi się uda! :)

    marek003 napisał:

    Aby się aktualizowało wrzucić trzeba wykonanie procedury w odpowiednie miejsca czyli Open w "Ten skoroszyt" i change arkusza z danymi., a jak jest powyższe to przycisk mija się z celem aczkolwiek też można podpiąć pod przycisk.


    Czy możesz napisać jak wrzuca się Open w skoroszyt i Change w arkusz? Albo jakiś przykład? Z góry dzięki.

    0
  • Pomocny post
    #4 17 Sty 2015 20:14
    marek003
    Poziom 40  

    :)
    Wiesz co, szybciej wyjdzie tworzenie tego pliku i makra niż tłumaczenie.
    Masz.
    Pooglądaj gdzie i w jakim bloku jest umieszczone wywołanie makra "Wykonaj".
    Nie podpinałem do przycisku bo jakakolwiek zmiana w tabeli A i B (tak jak chciałeś) odświeża tabelę. Jest to trochę "upierdliwe" ale jak "klient" chce ... :)

    1
  • #5 18 Sty 2015 23:51
    sanda20wr
    Poziom 5  

    Dziękuję! Dokadnie o to chodziło.

    Masz rację, odświeżanie na zmianie jest uciążliwe... Usunęłam to i zostawiłam na otwarciu + dodałem przycisk. W takiej formie będzie to dla mniej wystarczająco funkcjonalne :).

    Pomęczę Cię jeszcze jednym pytaniem. Widziałam, że oparłeś to na nazwie arkusza, a sortowanie na nazwie tabeli. Czy jest jakaś opcja, aby zrobić to bardziej uniwersalnie?

    Jak skończę wzorcowy arkusz to chcę go przekopiować x12 (dla każdego miesiąca w roku). Oczywiście mogę po prostu przekopiować funkcję do każdego arkusza i zmienić te nazwy ręcznie, ale to rozwiązanie trochę mało eleganckie. A może dodać te nazwy jako parametr, dać funkcję globalnie dla skoroszytu i w poszczególnych arkuszach tylko wywoływac ją z parametrami, hmm?

    0
  • Pomocny post
    #6 19 Sty 2015 08:41
    marek003
    Poziom 40  

    Jeżeli chodzi o arkusz to nie ma problemu. Zamień
    Sheets("Arkusz1") na ActiveSheet wtedy wypełnianie tabeli będzie dotyczyć aktywnego arkusza.

    W załączeniu sortowanie nie na "Tabeli"

    edit
    --------------------------
    Jak już jest sortowanie trochę inaczej, to numerację (Lp) dodałem do pętli wpisujących dane tabeli C

    1
  • #7 20 Sty 2015 02:53
    sanda20wr
    Poziom 5  

    Dzięki! O to chodziło :). Ale natrafiłam na kolejny problem... co zrobić, aby uzupełniając komórki w tabeli C zachować jej format? Np. zminiejszam sobie czcionkę w tabeli C, a po wywołaniu funkcji wraca mi do poprzedniej (domyślnej?), nawet jeśli w tabeli A i B też zmodyfikuję format. Może coś trzeba dodać w samej funkcji, aby nie ruszało w ogóle formatu w tabeli C?

    Dodano po 16 [minuty]:

    Źle to okresliłam - w poprzednim poście chodziło o formatowanie, ale docelowo o format też pytam, np. ustawiam sobie w tabeli C format walutowy, a po wywołaniu funkcji przywraca zwykłe liczby.

    0
  • #8 20 Sty 2015 13:07
    marek003
    Poziom 40  

    Zamień linię kodu (początek - tam gdzie jest napisane "czyszczenie tabeli C")
    .Range("Q3:U10000").Clear
    na
    .Range("Q3:U10000") = ""

    I sformatuj w tabeli C, a najlepiej we wszystkich tabelach (A,B,C) kolumny z wartościami jako walutowe.


    Poradzisz sobie czy dać przykład?

    edit
    --------------------------

    Jeżeli wszystkie dane w tabeli C maja mieć inna czcionkę to nie ma sprawy. Gorzej jeżeli będziesz chciała wyróżnić jakiś zapis w samej tabeli C inna czcionką. Formatowanie takie zostaje przypisane do danego "wersu" tabeli. Makro po zmianie uzupełnia na nowo tabelę C nieuporządkowanymi danymi, więc inna "dana" może "dostać" tą nową czcionkę. Następnie wykonywane jest sortowanie, które już uwzględnia wielkość czcionki i docelowo wcześniejsze wyróżnienie (przed odświeżeniem tabeli) jest na innym wierszu z innymi danymi.

    edit 2
    ----------------------------
    W załączeniu wersja z kodem który "przenosi" format. Zaznaczam: odznaczony format ma być w tabeli A lub B Bo jeżeli będzie tylko w C nie będzie miało to sensu bo za każdym razem tabela jest tworzona od początku więc wyróżniony format może się znaleźć na innej pozycji - choć w poniższym przykładzie zostanie zastąpiony formatem jaki jest u źródła tzn. w tabeli A lub B

    1
  • #9 21 Sty 2015 00:49
    sanda20wr
    Poziom 5  

    Dziękuję :). Już pierwsza rada, tzn. zamiana .Range("Q3:U10000").Clear na .Range("Q3:U10000") = "" rozwiązała mój problem. Tabela C jest generowana do druku, więc w niej nigdy nie będę nic zaznaczała, wręcz dobrze, że nie kopiuje mi formatowania z A czy B, gdzie właśnie coś sobie oznaczam kolorami, pogrubieniami itp. Ważne było dla mnie ustawienie jakiegoś formatowania i formatu walutowego i to udało się osiągnąć. Ale przykład z kopiowaniem również formatowania może mi się przydać na przyszłość, dzięki!

    Mam jeszcze jedno zadanie z Excela, ale na razie spróbuję powalczyć z nim sama. Zwłaszcza, że Twoja pomoc mi dużo rozjaśniła i wiele kwestii wydaje mi się już prostszych ;).

    0
  Szukaj w 5mln produktów