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 - Pętla pobierająca dane z komórek i wyrzucająca dane do komórek

Qqba 17 Gru 2015 20:49 2007 24
  • #1 17 Gru 2015 20:49
    Qqba
    Poziom 7  

    Cześć.
    Mam na zadanie stworzenie drzewa decyzyjnego wraz z rozpisaniem reguł.
    Czy można utworzyć makro z pętlą, która będzie pobierała dane z 3 zbiorów, w określonej kolejności (najpierw z pierwszego itd.), a później połączone w jeden ciąg zwracała wynik do kolejnych komórek?
    Jak sądzę potrzebne byłoby drugie makro, które na podstawie otrzymanego ciągu zwracało działania. To znaczy, jeżeli a1b1c1d1e1f1g1h1i1j1k1, to w kolejnej kolumnie pojawiałoby się na przykład x1x3x5 odpowiadające kolejno b1, e1, h1 zapisanymi w poprzedniej komórce.

    0 24
  • #2 18 Gru 2015 12:18
    kinggustav
    Poziom 20  

    Niestety nic a nic nie rozumiem z tego co napisałeś. Co nazywasz zbiorem danych? Jeżeli te kolorowe prostokąty, to jest ich 2 a nie 3 chyba.
    Pobieranie danych z komórek i wpisywanie do innych komórek to nie problem, ważne jak to ma działać, czyli z których komórek pobrać, co z tym zrobić, gdzie zapisać, jak długo to robić.

    0
  • #3 20 Gru 2015 23:09
    Qqba
    Poziom 7  

    Zbiory są 3 - niebieski, zielony i pomarańczowy.
    Chodzi mi o połączenie każdego elementu z niebieskiego zbioru z każdym z zielonego i pomarańczowego. Tak żeby każda zwrócona wartość zawierała elementy z każdego zbioru.
    Jak długo? Do połączenia każdego z każdym.
    Celem jest stworzenie takiej tabeli.
    Excel VBA - Pętla pobierająca dane z komórek i wyrzucająca dane do komórek

    0
  • #4 21 Gru 2015 08:08
    adamas_nt
    Moderator Programowanie

    Jak ktoś tu kiedyś żartobliwie napisał: "Byłbyś świetny w konspiracji. Każdy Twój post jest perfekcyjnie zaszyfrowany. Prosimy o klucz."
    Przyznam, że też jakoś nie mogę załapać ;)

    0
  • #5 23 Gru 2015 22:24
    Qqba
    Poziom 7  

    Chciałbym stworzyć makro, które pobierze jedną "daną" z kolumny C, jedną z E i jedną z G i np w kolumnie I poda mi "połączoną wartość". Pierwszy przykład a1b1c1d1e1f1g1h1i1j1k1. Kolejny to np a1b1c1d1e1f1g1h1i1j1k2. I tak dalej. Aż do połączenia wszystkich możliwych trójek.

    Jest taka zasada, że jeżeli komunikat jest niezrozumiały, to jest to wina nadawcy, a nie odbiorcy. Więc przepraszam. I mam nadzieję, że teraz mniej więcej wiadomo o co chodzi. Dalszą część mojej prośby poruszymy, kiedy ustalimy tę kwestię :)

    0
  • Pomocny post
    #6 29 Gru 2015 10:55
    Maciej Gonet
    Poziom 31  

    Nie wiem czy dobrze zrozumiałem, bo nie bardzo widzę korelację pomiędzy pierwszym plikiem i jego danymi, a obrazkiem zamieszczonym później. Jeśli to ma być tylko proste połączenie danych, to takie makro:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    0
  • #7 29 Gru 2015 13:32
    Qqba
    Poziom 7  

    Dzięki za makro. Zajmę się tym dzisiaj wieczorem i dam znać jak z efektami.
    Co do związku pomiędzy "danymi" z pierwszego pliku, a wklejonym obrazkiem, to makro, które chcę stworzyć jest pierwszym krokiem. Ale nie będę mieszał wszystkiego od razu, bo jak ktoś zauważył - mam problemy z przekazywaniem myśli poprzez tekst :P

    0
  • #8 01 Sty 2016 20:46
    Qqba
    Poziom 7  

    Maciej Gonet napisał:
    Nie wiem czy dobrze zrozumiałem, bo nie bardzo widzę korelację pomiędzy pierwszym plikiem i jego danymi, a obrazkiem zamieszczonym później. Jeśli to ma być tylko proste połączenie danych, to takie makro:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dokładnie o to mi chodziło!
    Dziękuję bardzo.
    Teraz pytanie - czy na podstawie tego co generuje makro stworzone przez Macieja można zrobić tabelkę. Jeżeli reguła pierwsza (R1) wygląda a1b1c1d1e1f1g1h1i1j1k1, to w tabeli wygląda to w podany sposób
    Excel VBA - Pętla pobierająca dane z komórek i wyrzucająca dane do komórek

    Jeżeli a1b1... to w tabeli przy A1 oraz B1 jest T (Tak), jeżeli a2b1... to w tabeli A1 jest N (Nie), przy B1 jest T i tak dalej. To jest pierwsza część tabeli.
    W w drugiej chodzi o spełnienie warunków - jeżeli w pierwszej tabeli przy E1 jest T, to w x2 też jest T.

    0
  • #9 07 Sty 2016 21:02
    Qqba
    Poziom 7  

    W załączniku jest plik z czterema arkuszami. Chciałbym uzupełnić tabelę w arkuszu 4. Jeżeli w regule jest a1b1..., to w kolumnach odpowiadających a1 i b1 powinna być litera T albo słowo TAK.
    Analogicznie z kolumnami x1, x2 itd. Tylko teraz punktem odniesienia nie jest jedna kolumna z całą regułą (chociaż pewnie mógłby być), a tabela wypełniona już wyrazami "Tak". Ale mając już wypełnioną tabelkę, można to załatwić za pomocą funkcji "If"

    0
  • #11 11 Sty 2016 21:10
    Qqba
    Poziom 7  

    Formuła sprawdza się w moim przypadku dla punktów, gdzie można wybrać jedną z dwóch możliwości.
    Jednak jeżeli mam jedną z trzech, to nie potrafię tej formuły zmodyfikować w taki sposób aby otrzymać satysfakcjonujący mnie wynik.

    If C1="TAK" and C3="" Then C2=""

    If C1="NIE" and C3="TAK" Then C2="NIE"

    If C1="NIE" and C3="" Then C2="TAK"

    Jeżeli wynikiem miałoby być tylko TAK/NIE, to jakoś bym to ogarnął. Ale są przypadki, że komórka musi zostać pusta. Czy da się te 3 warunki wcisnąć w jeden wiersz, tak, żeby to działało?

    Punktem wyjścia są trzy przypadki. Komórkę C2 chcę wypełniać na podstawie C1 i C3.

    C1 C2 C3
    TAK puste w tym przypadku C2 też powinno być puste
    NIE TAK tutaj w C2 powinno być "NIE"
    NIE puste w miejscu C2 musi być "TAK".

    0
  • Pomocny post
    #12 11 Sty 2016 21:31
    adamas_nt
    Moderator Programowanie

    Dołóż drugie wyszukiwanie:

    Code:
    =JEŻELI(CZY.BŁĄD(SZUKAJ.TEKST(H$1;$C3));JEŻELI(CZY.BŁĄD(SZUKAJ.TEKST(J3;C3));"NIE";"TAK");"")

    0
  • #14 13 Sty 2016 23:53
    Qqba
    Poziom 7  

    Im dalej w las, tym ciemniej. Mam kolejny problem. Muszę uzupełnić kolumnę tak jakby sumą wszystkich działań X.
    W pliku jest wypełniony przykład.

    0
  • #15 14 Sty 2016 08:44
    adamas_nt
    Moderator Programowanie

    Jeśli bez VBA, to poskładanie ciągu zagnieżdżonym JEŻELI, z warunkowym wstawianiem separatora (to odwrócone U) jeśli TAK'ów jest >1. Dłuuuuga będzie.

    Jak dla mnie, prościej byłoby napisać własną funkcję (UFD) z pętlą.

    0
  • #16 14 Sty 2016 17:59
    Qqba
    Poziom 7  

    Próbowałem właśnie z funkcją jeżeli, ale w moim przypadku musiałbym ją zagnieżdżać kilkanaście razy. Więc odpuściłem.
    Później próbowałem dostosować makro podane przez Macieja, ale też nic z tego nie wyszło.
    Nie potrafię napisać makra od początku. Z dostosowaniem do konkretnego przypadku już sobie poradzę.

    0
  • Pomocny post
    #17 14 Sty 2016 20:54
    adamas_nt
    Moderator Programowanie

    Jednak chyba wygodniej będzie (jeśli chodzi o VBA) wykorzystać procedurę zdarzeniową. Przykład w załączniku.

    0
  • #18 14 Sty 2016 23:38
    Qqba
    Poziom 7  

    Nie ma w tym pliku zapisanego makra. Tabele jest wypełniona, ale klikam w makra i nie mam tam żadnego nowego.

    0
  • Pomocny post
    #19 15 Sty 2016 07:57
    adamas_nt
    Moderator Programowanie

    Jest w kodzie arkusza (nie w module).
    Procedur zdarzeniowych oraz 'Private' nie widać w menu 'Makra'.

    0
  • #20 15 Sty 2016 22:55
    Qqba
    Poziom 7  

    Dziękuję bardzo za pomoc. Muszę doczytać o działaniu tych procedur.

    0
  • #21 17 Sty 2016 23:13
    Qqba
    Poziom 7  

    Albo jestem wyjątkowo niedomyślny, albo coś robię nie tak.
    "Worksheet_Change(ByVal Target As Excel.Range) - Procedura wywołana po zmianie zawartości dowolnej komórki arkusza."
    Co chcę zrobić? Mam arkusz, w którym mam dane - analogiczne do tych przykładowych. Chcę uruchomić procedurę z pliku Zeszyt1-2.
    Mam plik z danymi, otwieram moduł VBA, wklejam do kodu arkusza kod napisany przez adamas_nt i nic. W jaki sposób ponownie uruchomić tę procedurę?

    0
  • #22 18 Sty 2016 08:21
    adamas_nt
    Moderator Programowanie

    1. Procedura musi być w kodzie arkusza, w którym znajduje się tabela
    2. Sprawdź, czy ograniczenie:
    If Not Intersect(Target, Range("a3:i" & Rows.Count)) Is Nothing Then
    zgadza się z adresem tabelki. Jeśli nie, zmień.

    0
  • #23 18 Sty 2016 15:25
    Qqba
    Poziom 7  

    Zakres nie jest problemem. Wystarczy zacząć od A3, a resztę robi sam. Z tym, że nie zawsze działa mi ta procedura. Jeżeli włączę plik i zmieniam miejsce "tak-ów" to w ostatniej kolumnie zmienia mi się suma X-ów.
    Ale już jeżeli chcę zmienić wartość komórki z nazwą X, to przestaje to działać.
    Czy można zrobić szablon, w którym będzie można modyfikować ilość kolumn (X-ów) oraz po prostu wkleić dane z innego arkusza?
    Jeżeli uzupełniam tabelę ręcznie, to jeżeli akurat mi to działa, to wszystko jest ok. Jeżeli chcę wkleić jakiś zakres komórek, to suma nie zmienia się automatycznie.

    0
  • #24 18 Sty 2016 21:50
    adamas_nt
    Moderator Programowanie

    Oj. Zapomniałem, że składanie stringa realizowane jest w funkcji. Jeśli zmieniasz zakres dla Target.Range, zmień również Nr kolumn w funkcji.
    Kolejne poprawki trzeba wprowadzić w adresach komórek docelowych. Będzie zawsze o 1 w prawo niż w Target.Range. Np dla tabeli A:I, wynikowa to "J", czy idx 10 (

    W przykładowym pliku jest 'For i = 1 To 9' dla kolumn A:I

    Kopiowanie i wklejanie jest zdarzeniem "przy zmianie", więc powinno działać.

    Z "szablonem" będzie więcej kłopotów niż z ręcznym modyfikowaniem. Zmian musisz dokonać raptem w czterech miejscach. Najlepiej wstaw sobie komentarze "ku pamięci", bo za jakiś czas może wyparować z głowy. Np

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    0
  • #25 18 Sty 2016 23:10
    Qqba
    Poziom 7  

    Już wszystko działa. Wystarczyło pogrzebać trochę w kodzie. Dziękuję za pomoc.
    Robiłem to metodą prób i błędów i na moje potrzeby zaczęło się wszystko układać. Wchodzę teraz na forum i widzę, że dostałem gotowca. Dzięki wielkie. Mam nadzieję, że to już koniec moich zmagań z tym projektem :P

    0