Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Excel VBA] - Kopiowanie różnych zakresów danych, porządkowanie listy...

macre 26 Sty 2015 08:35 1035 14
  • #1 26 Sty 2015 08:35
    macre
    Poziom 4  

    Witam

    Chciałbym Was bardzo prosić o pomoc w napisaniu algorytm/sposobu, który wydaję się w miarę logiczny i prosty do wykonania…Szukałem rozwiązania jednak nie mogę znaleźć nic podobnego. Poza tym moją wiedza z zakresu VBA jest chyba zbyt skromna.

    Dane, którymi muszę się zając to kilkaset wierszy wpisów w tabeli. Dane źródłowe wyglądają jak w załączonym pliku w arkuszu „dane”, oczywiście te są przykładowymi i z wyrzuconymi niepotrzebnymi kolumnami na te próby. Uprzedzam, nie da się tego posortować – nazwy tutaj są przykładowe, rzeczywiste są zupełnie inne i niemożliwe do posegregowania w prosty sposób.

    Finalnie algorytm ma posegregować „Przepisy” w taki sposób, by pod przepisem, dajmy na to A był przepis – jeśli istnieje w kolumnie pierwszej– przepis na jego półprodukt A1 itd. Zaznaczam, że A1 może nazywać się zupełnie inaczej – jest to dowolny ciąg znaków, nie możemy wykorzystać kolejnych cyfr za A, tutaj dla łatwości zrozumienia wprowadziłem A1 i kolejne.

    Algorytm miałby służyć porządkowaniu rozproszonych danych w tabeli. Kroki jakie mi się wydaję, że powinny zostać wykonane:
    1) Wejdź do kolumny pierwszej i dla każdej/kolejnej pozycji w kolumnie wykonaj:
    2) Skopiuj zakres dla wszystkich kolumn (w tym wypadku licząc od pierwszej do trzeciej) i wierszy od wyszukanej wartości/kolejnej do następnej pozycji niepustej w wierszach w kolumnie pierwsze i wklej ten zakres do nowego arkusza ( powiedzmy „efekt”). Przykładowo dla pierwszej pozycji B2 z danych źródłowych będzie to zakres od komórki gdzie jest B2, czyli A2, w kolumnie pierwszej do komórki w kolumnie trzeciej gdzie jest S8, czyli C7.
    3) W skopiowanym zakresie wyszukaj i skopiuj „Indeks surowca”/zawartość komórki odpowiadającemu „Składnik 1” - czyli tak naprawdę skopiuj pozycję w wierszu tym samym co Składnik 1, ale kolumnie następnej. Przykładowo, dla przepisu na A będzie to A1 (dajmy na to zmienna „a”).
    4) Wyszukaj zmienną "a" w kolumnie pierwszej z danymi
    5) Jeśli "a" NIE występuję zakończ pętle – wstaw wyraźny znacznik końca pętli dla tej pozycji, np. szary pasek, zakończenia „sekcji”. Przejdź do następnej uzupełnionej komórki w kolumnie pierwszej z danymi i wykonuj kroki od 1-5/6. Jeśli nie ma następnej pozycji zakończ algorytm - lub inaczej wykonuj algorytm dla ilości wpisów w kolumnie 1 w arkuszu dane MINUS 1. Minus ponieważ mamy nagłówek i będzie on też zliczany jeśli użylibyśmy jakiejś funkcji count zliczającej ilość wpisów w A:A, kolumnie pierwszej .
    6) Jeśli "a" JEST w kolumnie pierwszej przejdź do tej pozycji i wykonaj kroki od 1 do 5/6, aż do końca zakresu danych w kolumnie pierwszej.

    Takich uporządkowanych „sekcji” będzie tyle ile jest pozycji w kolumnie pierwszej. Przykładowo, po przejściu tego algorytmu dla produktu np. B otrzymamy:
    - 1 „sekcja” = B ze swoim składem -> B1 ze swoim składem ->B2 ze swoim składem, ALE też:
    - 2 „sekcja” = B1 ze swoim składem ->B2 ze swoim składem
    - 3 „sekcja = B2 ze swoim składem, bo też znajduję się w kolumnie pierwszej.
    Przedstawione to zostało w arkuszu "Efekt dla B".

    Finalnie chciałbym tego uniknąć, tzn. chciałbym mieć tylko pozycję "główne"- A, B, C...Może jakbym miał jakaś listę tych głównych byłoby łatwiej...?

    Jeśli w danych byłby tylko przepis na B, efekt powinien wyglądać mniej więcej jak w arkuszu „Efekt dla B FINALNY” w załączonym pliku.

    Z góry bardzo dziękuje za pomoc - makro/kod.

    0 14
  • #2 26 Sty 2015 09:12
    kinggustav
    Poziom 18  

    Chyba sie starzeję, bo nic a nic z twojego opisu nie rozumiem. Co właściwie chcesz uzyskać? Może spróbuj to pokazać na przykładzie zrobionym choćby i ręcznie.

    0
  • #3 26 Sty 2015 09:15
    macre
    Poziom 4  

    Zdawałem sobie sprawę, że może nie jest to do końca jasne dlatego załączyłem plik w pierwszym poście, w którym umieściłem przykładowe rozwiązanie dla jednego przepisu. W tym wypadku B.

    0
  • #4 26 Sty 2015 10:23
    kinggustav
    Poziom 18  

    Jak rozumiem można pracować wyłącznie na indeksach. Czyli taki algorytm proponuję:
    1. Znajdź pierwszy produkt (poznajemy po tym że ma nazwę w kolumnie A).
    2. Przepisuj wiersze aż indeks będzie pusty (masz puste wiersze, reguła?), można i po Excelowemu (oznacz, kopiuj, wklej), ale lepiej mieć wszystko pod kontrolą. Zapamiętaj w tablicy każdy kopiowany indeks.
    3. Dla każdego indeksu: znajdź produkt o takim indeksie i jeżeli jest skopiuj go (jak p. 2)
    Punkt 3 puściłbym rekurencyjnie, żeby sie nie zastanawiać co ma być rozwinięte a co nie. Czy duble produktów dopuszczasz, czy trzeba sie ich pozbyć? Np Produkt A ma składnik B i C a B też ma C? Przepisze się A, B, C, C.
    Nie mam czasu na pisanie kodu teraz, może ci to wystarczy.

    0
  • #5 26 Sty 2015 10:32
    macre
    Poziom 4  

    Mniej więcej...Mamy szukać indeksów wiec powinniśmy działać na nich. Z premedytacją umieściłem właśnie te efekty, to było to łatwiejsze do zrozumienia...

    W zasadzie algorytm ma działać tak jak napisałem w pierwszym poście. Mój problem polega na tym, że nie wiem jak to zapisać vba. Logicznie wydaję mi się, że mam to dobrze rozpisane.

    Będę bardzo wdzięczny za każdą pomoc.

    0
  • #6 26 Sty 2015 12:49
    PRL
    Poziom 33  

    Nie jestem pewny, czy dobrze zrozumiałem ale chyba chodzi o to:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #7 26 Sty 2015 13:16
    macre
    Poziom 4  

    Niestety nie do końca. Wynik jest w zasadzie tym samym co jest w Arkuszu Dane a co gorsze jeszcze przesunięte. Np. dla pierwszego wiersza, gdzie jest A w kolumnie drugiej mamy "Składnik 4"

    Tutaj chodzi o efekt taki jak w "Efekt dla B FINALNY". Czyli pod każdym produktem z kolumny pierwszej musi być przepis na jego Składnik 1 (na indeks surowca) o ile ten składnik 1 występuję w kolumnie pierwszej = ma przepis. Jeśli nie, przechodzi do kolejnej pozycji w kolumnie pierwszej.

    [Excel VBA] - Kopiowanie różnych zakresów danych, porządkowanie listy... [/img]

    0
  • #9 26 Sty 2015 13:35
    macre
    Poziom 4  

    Tak:) Jeśli po B1 wstawi przepis na B2 to będzie idealnie...itd.:)

    0
  • #10 26 Sty 2015 13:38
    PRL
    Poziom 33  

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Takie troche nagrywane makro, a więc za dużo linijek, ale już mi się nie chce go poprawiać.;)

    A może ma być tak?

    [Excel VBA] - Kopiowanie różnych zakresów danych, porządkowanie listy...

    0
  • #11 26 Sty 2015 13:49
    macre
    Poziom 4  

    Suuuuper:)
    Wielkie dzięki, działa z tymi danymi:)

    Mam jeszcze pytanie.
    Ponieważ dane, które załączyłem nie są danymi rzeczywistymi trzeba by było przerobić podany przez Ciebie kod.

    W moim pliku rzeczywistym, którego niestety nie mogę załączyć, mam dane wypełnione w kolumnach od A do N.
    Kolumna A, C, D, E, F, I, J, K, L, M, N - dane nieistotne, ale konieczne do kopiowania, tj. muszą kopiować się dla odpowiednich wierszy ich wartości do Wynik.
    Kolumna B - to ta sama kolumna co w załączonym pliku "przepis na"
    Kolumna G - to ta sama kolumna co "Składniki"
    Kolumna H - to ta sama kolumna co Indeks surowca.

    Jeśli to możliwe, to bardzo proszę o przerobienie w ten sposób.

    0
  • #12 26 Sty 2015 13:56
    PRL
    Poziom 33  

    Cytat:
    Ponieważ dane, które załączyłem nie są danymi rzeczywistymi trzeba by było przerobić podany przez Ciebie kod.


    Skoro trzeba by było, to przerabiaj.
    Dane rzeczywiste nie mają tutaj nic do rzeczy.
    To Ty zaniedbałeś (z lenistwa), żeby w przykladzie umieścić dane NIERZECZYWISTE w kolumnach A, C, D, E, F, I, J, K, L, M, N itd...

    Tym się baw:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dla ułatwienia podam, że nie korzystaj z kodu powyżej, ale skoro tych kolumna jest więcej, to wykorzystaj metodę 'Copy'.

    Jak są 2, 3 komórki, to można tak, jak napisałem w kodzie. Przy ilości od A do XX używa sięzakresu.

    Na dzisiaj już kończę.

    0
  • #13 26 Sty 2015 14:24
    macre
    Poziom 4  

    Niestety, nie działa to prawidłowo. Moja radość była przedwczesna:(

    Nawet jeśli skopiowałem dane rzeczywiste do takich samych 3 kolumn jak w załączonym przykładowym pliku, nie uzyskuję pożądanych efektów.
    Wydaję mi się, że problem leży w tym, że zastosowałeś tutaj sortowanie...Nie może tak jednak to wyglądać, bo nazwy te nie są w kolejności alfabetycznej, ani też rosnącej.

    Nie jestem pewien, ale jak dobrze zrozumiałem Twój algorytm przepisuję po prostu komórki z Dane do Wynik, a następnie to sortuję w określony sposób. Tutaj jednak chyba, trzeba "wejść" do każdego przepisu oddzielnie, skopiować do nowego arkusza. Następnie sprawdzić czy w przepisie dla tej skopiowanego właśnie zakresu dla Składnik 1 występuję też przepis, wkleić go pod spodem jeśli tak, znów sprawdzić czy dla tego nowego zakresu i Składnika 1 występuje przepis itd...jeśli nie występuję, przechodzimy po prostu do kolejnej pozycji z kolumny pierwszej. Mam nadzieje, że to zrozumiałe?

    0
  • #14 26 Sty 2015 15:02
    PRL
    Poziom 33  

    Cytat:
    Nawet jeśli skopiowałem dane rzeczywiste do takich samych 3 kolumn jak w załączonym przykładowym pliku, nie uzyskuję pożądanych efektów.


    Jesteś w stanie precyzyjnie w dwóch zdaniach określić, jakie mają być pożądane efekty?

    0
  • #15 26 Sty 2015 16:57
    macre
    Poziom 4  

    Pożądany efekt ma być taki jak w arkuszu "Efekt dla B FINALNY" w pierwszym załączonym pliku tyle, że dla wszystkich przepisów głównych - tj. w tym wypadku A, B, C, D...od nich mają się zaczynać "sekcje".

    Dla większego zrozumienia umieściłem załącznik w którym opisuję, krok po kroku co powinno być zrobione jeszcze raz, tego od tej chwili się trzymajmy.

    Arkusz Dane - dane źródłowe z poszczególnymi krokami dla dwóch pierwszych przepisów głównych oraz z wytłumaczeniem jak to powinno wyglądać wg. mnie krok po kroku.
    Arkusz EFEKT (ręcznie sklejony) - dla zobrazowania ręcznie skleiłem to co chcę uzyskać.
    Arkusz Lista przepisów głównych - lista indeksów, po których będziemy przeszukiwać dane. Ręcznie sklejona.



    Twój algorytm działa dla tych przykładowych danych, ale jeśli dane te były nazwane dowolny ciągiem znaków wysypałby się, bo u Ciebie jest rozwiązanie oparte jest na sortowaniu.

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo