logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Excel VBA - Pętla pobierająca dane z komórek i wyrzucająca dane do komórek

Qqba 17 Gru 2015 20:49 4029 24
REKLAMA
  • #1 15249474
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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.
    Załączniki:
    • regu__y1.xls (31.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 15250763
    kinggustav
    Poziom 27  
    Posty: 797
    Pomógł: 93
    Ocena: 93
    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ć.
  • #3 15257840
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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
  • #4 15258165
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    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ć ;)
  • #5 15265839
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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ę :)
  • REKLAMA
  • Pomocny post
    #6 15278777
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    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
    Załączniki:
    • regu__y1.xls (40 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 15279261
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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
  • #8 15289242
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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.
  • #9 15311540
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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"
    Załączniki:
    • regu__y1.xls (1.61 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #10 15312767
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Trzeba było wypełnić odręcznie kawałek na wzór, bo dalej nie jestem pewien, czy o to chodzi. Proszę sprawdzić.
    Załączniki:
    • regu__y1 (2).xls (1.61 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #11 15324532
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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".
  • Pomocny post
    #12 15324651
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Dołóż drugie wyszukiwanie:
    =JEŻELI(CZY.BŁĄD(SZUKAJ.TEKST(H$1;$C3));JEŻELI(CZY.BŁĄD(SZUKAJ.TEKST(J3;C3));"NIE";"TAK");"")
  • #13 15324857
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    Dziękuję bardzo!
  • #14 15331801
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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.
    Załączniki:
    • Zeszyt1.xls (33 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #15 15332103
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    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ą.
  • #16 15334231
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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ę.
  • Pomocny post
    #17 15335028
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Jednak chyba wygodniej będzie (jeśli chodzi o VBA) wykorzystać procedurę zdarzeniową. Przykład w załączniku.
    Załączniki:
    • Zeszyt1-2.xls (40 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #18 15335692
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    Nie ma w tym pliku zapisanego makra. Tabele jest wypełniona, ale klikam w makra i nie mam tam żadnego nowego.
  • Pomocny post
    #19 15335974
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Jest w kodzie arkusza (nie w module).
    Procedur zdarzeniowych oraz 'Private' nie widać w menu 'Makra'.
  • #20 15338634
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    Dziękuję bardzo za pomoc. Muszę doczytać o działaniu tych procedur.
  • #21 15345100
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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ę?
  • #22 15345461
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    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ń.
  • #23 15346332
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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.
  • #24 15347845
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    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
  • #25 15348156
    Qqba
    Poziom 9  
    Posty: 15
    Ocena: 1
    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

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukiwał pomocy w stworzeniu makra VBA, które pobierałoby dane z trzech zbiorów komórek w Excelu i łączyło je w jeden ciąg, a następnie zwracało wynik do kolejnych komórek. Po kilku wymianach zdań, użytkownik otrzymał przykładowe makro, które realizowało jego zamysł, a także wskazówki dotyczące tworzenia tabeli na podstawie wygenerowanych danych. Dyskusja obejmowała również problemy z modyfikowaniem formuł oraz procedur zdarzeniowych w VBA, co doprowadziło do rozwiązania problemów z automatycznym aktualizowaniem danych w arkuszu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA