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 - Tworzenie makra - sortowanie i przenoszenie między komórkami

coobah 06 Wrz 2012 23:16 6828 48
  • #1 06 Wrz 2012 23:16
    coobah
    Poziom 17  

    Witam,

    potrzebuję pomocy...
    Czy ktoś z Was podpowie jak powinno wyglądać makro, które namiesza mi w pliku Excelowskim :) ??

    Mam 3 kolumny z danymi w osobnych wierszach. Zależy mi na tym, aby makro zgrupowało w jednym wierszu kolumny A te same wartości, w kolumnie B ustawiło wartości pod kątem godzin z kolumny D, zgrupowało tą samą wartość z kolumny B itp. :)

    Zresztą zerknijcie na plik z linku poniżej.

    Poniżej link do pliku wzorcowego:

    http://www1.zippyshare.com/v/91547618/file.html

    Będę bardzo wdzięczny za gotowe makro, bo nie ukrywam, że jest to dla mnie "magia"

    Plik ma być załącznikiem na forum.
    [jankolo]

    0 29
  • #2 06 Wrz 2012 23:34
    MarcinZablocki
    Poziom 9  

    Jezeli umiesz wykonać to narzędziami w Excelu to po prostu nagraj makro.

    0
  • #3 06 Wrz 2012 23:44
    coobah
    Poziom 17  

    No mogę to zrobić na zasadzie "kopiuj wklej wytnij"
    Czy to wystarczy?

    0
  • #4 06 Wrz 2012 23:53
    MarcinZablocki
    Poziom 9  

    Jeśli to ma być na zasadzie wybierania konkretnych wartości, to nie za bardzo. Znasz funkcje jeżeli ?

    0
  • #5 07 Wrz 2012 00:02
    coobah
    Poziom 17  

    Nie bardzo...
    Do tej pory klepałem to ręcznie, ale zrobiło się dużo więcej tych danych i szukam ułatwienia...

    0
  • #6 07 Wrz 2012 10:00
    marek003
    Poziom 40  

    Przecież tu wystarczy zwykłe sortowanie w trzech poziomach (za jednym razem).
    Wg kolumny A
    Wg kolumny C
    Wg kolumny D

    I jest wszytko "poustawiane" tak jak chcesz.

    Nie rozumiem w czym ma autor problem. Jakie klepanie?
    Sortowanie i już - ewentualnie później porobienie ramek.

    0
  • #7 13 Wrz 2012 09:01
    coobah
    Poziom 17  

    Marku, masz rację, ale potrzebuję "czegoś" co po tym przesortowaniu scali mi komórki i przeniesie wartości np. z trzech komórek do jednej.

    0
  • #8 13 Wrz 2012 22:33
    marek003
    Poziom 40  

    To mam dodatkowe pytanie.
    W arkuszu 2 masz jakiś rozkład.
    To na jego podstawie robisz tą główną tabelkę którą potem sortujesz?

    Jeżeli tak to co jest kryterium wyboru ("lacz" ?) - bo jak już się bawić makrami to od początku do końca.

    0
  • #9 13 Wrz 2012 22:48
    coobah
    Poziom 17  

    Marku, w arkuszu 1 górna tabela to wyciąg z systemu w którym pracuję.

    Arkusz 2 - to nas nie interesuje, bo to tylko radosna twórczość...

    0
  • #10 13 Wrz 2012 23:47
    adamas_nt
    Moderator Programowanie

    Przyjrzałem się plikowi i...

    Co się stało z godziną dla Gubin/Świebodzin? Skąd ta różnica?

    Możliwe rozwiązanie (w dużym skrócie). Tablica unikatów B22:B5 (tak, w odwrotnej kolejności) w pierwszej pętli.
    Dalej składanie stringu wg godziny z kolumny C (również od dołu, zgodnie z utworzoną tablicą). Jeśli ta sama składamy miasta rozdzielając znakiem nowej linii. Jeśli trafimy na różną, zapis i składamy nowy ciąg. Kolejność miast istotna? Na razie (teoretycznie) wychodzi odwrotnie, więc należałoby przepisać.

    0
  • #11 14 Wrz 2012 12:14
    coobah
    Poziom 17  

    Cholera, dla Gubiń/Świebodzin wkradł się "chochlik" :)
    Ale to tylko "literówka"

    Górna tabela jest wzorcem, a dół finałem (ale tylko pod względem wyglądu, bo wartości muszą pozostać identyczne jak w tabeli powyżej...)

    Kolejność miast jest bardzo istotna. Do każdego miasta jest przypisana godzina i względem niej chronologicznie miasta muszą być ustawione w komórce..

    0
  • Pomocny post
    #12 14 Wrz 2012 12:32
    adamas_nt
    Moderator Programowanie

    Taki szybki przykład (w załączniku). Kolekcje są gotowe dla wszystkich kolumn, wystarczy tylko poukładać i przepisać do "z góry upatrzonej", nowej tabelki.

    Sortowanie "na żywca" z rejestratora (E2007), więc jeśli się wysypie, to najpierw posortuj tabelkę wg instrukcji podanej przez marek003 i usuń linijkę (zaapostrofuj) w module1...

    0
  • #13 14 Wrz 2012 18:57
    coobah
    Poziom 17  

    adamas_nt, to co robi Twoje makro można uzyskać (chyba...) tym samym sortowaniem o jakim pisał marek003...
    Albo ja coś źle robię...
    Ale nadal nie grupuje mi np. nazw miast w jednej komórce, godzin w jednej komórce...

    Da się to jakoś ugryźć?

    znalazłem takie makro:

    Code:
    Sub scalaj()
    
      Dim w As String, i As Long

      With Selection
        w = .Item(1)
        For i = 2 To .Count
          If .Item(i) <> "" Then w = w & Chr(10) & .Item(i)
          .Item(i).ClearContents
        Next
        .Item(1) = w
        .Item(1).EntireRow.AutoFit
      End With
    End Sub


    tylko jak je przerobić, aby nie dublowało wpisów miast i godzin w tych samych komórkach?

    Aha!
    Jeśli to ułatwi pracę to tabela wynikowa nie musi pokrywać tej tabeli "pierwotnej",.
    Może być obok, w oddzielnym arkuszu...

    0
  • #14 14 Wrz 2012 20:32
    adamas_nt
    Moderator Programowanie

    Nie analizowałeś :)
    Masz 4 kolekcje (dla każdej kolumny osobno), jedna z nich wyświetlana jest w MsgBox. Trzeba to tylko dopracować i przypisać do komórek tabeli (od końca). Sortowanie jest konieczne, żeby dane "poukładały się" wg godzin. Zmyliło cię pewnie włączenie odświeżania dopiero przy końcu makra.

    Edit: Jeszcze jedno: W pierwszej kolejności godziny z kolumny D trzeba sprowadzić do stringa.
    Tablice unikatów najlepiej przepisać do tablicy dwuwymiarowej, będzie łatwiej wstawić do arkusza.

    0
  • #15 15 Wrz 2012 10:08
    coobah
    Poziom 17  

    adamas_nt, niestety to o czym piszesz to dla mnie czarna magia... :/

    HELP PLEASE :)

    0
  • Pomocny post
    #16 15 Wrz 2012 11:03
    adamas_nt
    Moderator Programowanie

    coobah napisał:
    to o czym piszesz to dla mnie czarna magia
    Jaka tam czarna. Sprawa jest dość prosta i spokojnie obędzie się bez różdżki, szklanej kuli, czy czapki Merlina :)

    Makro najpierw sortuje, następnie zmienia wartości na tekst w kolumnie D.
    Przycisk po prawej służy tylko testom.
    Pozostaje sformatowanie gotowej tabelki (można dopisać stosowną procedurę).

    Pewnie dało by się to jeszcze uprościć, ale... hmm. Najważniejsze, że działa ;)
    Przetestuj, dostosuj do własnych potrzeb.

    Edit: Znalazłem pierwszy błąd. Zbędną linię usunąłem, załącznik podmieniony.

    0
  • #17 16 Wrz 2012 09:26
    adamas_nt
    Moderator Programowanie

    Dzięki za "pomocnika", ale tak sobie ściągnąłem ten załącznik, żeby popatrzeć i...

    Jest błąd:
    w linii 15 powinno być: lista = .Range("A5:D" & OstW)
    w linii 41 powinno być: For i = 2 To Unikaty1.Count

    Załącznik w poprzednim poście podstawiłem poprawiony.

    0
  • #18 16 Wrz 2012 10:19
    coobah
    Poziom 17  

    adamas_nt,to co podesłałeś jest idealne :)
    Kwestia sformatowania tabelki to już pikuś, zrobi się to na piechotę :)

    Ale jeśli piszesz, że poprawiłeś jakieś "byki" to już zerkam na poprawiony załącznik :)

    Dodano po 7 [minuty]:

    hmmm...
    Tylko zauważyłem, że jeśli z Arkusz 2 skopiuję całą tabelę do Arkusz 1 i odpalę Twoje makro to gdzieś giną dane z wiersza 49 i 50 z Akrusz 2 - czyli "lacz" 117132
    Nie są one przenoszone do tabeli końcowej w Arkusz3.

    Aha, kwestia wyśrodkowania danych w tabeli końcowej... Da się to zrobić?

    Dodano po 29 [minuty]:

    hmmm... kolejny "babol" jaki odkryłem ;) :
    - jeśli nazwa miasta powtarza się w kilku miejscach to w tabeli końcowej zostaje tylko w jednym miejscu, pozostałe "giną"

    Chyba stąd się wziął problem o którym pisałem w poprzedniej edycji tego posta (odnośnie wiersza 49 i 50)

    w załączeniu plik z większą bazą danych na których próbowałem to makro zastosować

    0
  • #19 16 Wrz 2012 11:24
    adamas_nt
    Moderator Programowanie

    Trzeba przyjąć jakieś założenia, lub działać na zaznaczonym obszarze (jak w kodzie, który wkleiłeś).

    Zmieniłem zakres dla tablic. Przypisywana jest 4-kolumnowa, lewy-górny narożnik to A1, pierwszy wiersz jest nagłówkiem (nie jest brany pod uwagę przy sortowaniu). Porównaj sobie procedury w obu plikach, a "złapiesz" o co chodzi.

    Najlepiej byłoby, gdyby w/w zasady pozostały stałe.

    Dodano pochwili:
    Ad. "kolejny babol". Wydedukowałem, że chodzi o unikaty... Więc jednak nie?

    0
  • #20 16 Wrz 2012 12:33
    coobah
    Poziom 17  

    hmmm.. no właśnie w tym może być problem, bo nazwy miast dość często się powtarzają w tych tabelach i jeśli do tabeli końcowej nie będą przenoszone tak jak są przypisane do numerów "lacz" z kolumny A to wtedy cała robota nie ma sensu :(

    Właśnie przez to ciężko jest działać na konkretnym obszarze, bo wypadałoby najpierw przeanalizować całą tabelę pod kątem powtarzających się miast... ;(

    0
  • #21 16 Wrz 2012 12:36
    adamas_nt
    Moderator Programowanie

    Czyli wracamy do punktu wyjścia. Sortowanie wg kolumn, jak radzi kolega marekk003, i ręczne dopracowanie tabelki?

    0
  • #22 16 Wrz 2012 12:43
    coobah
    Poziom 17  

    no niestety na to by wychodziło...

    adamas_nt, to co zrobiłeś jest super.
    Tylko brakuje mi przenoszenia WSZYSTKICH MIAST przypisanych do konkretnych nr. "lacz" z kolumny A.

    0
  • #23 16 Wrz 2012 13:59
    adamas_nt
    Moderator Programowanie

    Wszystko jest do zrobienia, trzeba tylko wytłumaczyć.
    Pokaż jak powinno wyglądać pierwsze 30 wierszy z Arkusz2 (do | 117255 | LP Stryków | włącznie)

    Dodano po chwili:

    Po niewielkiej przeróbce otrzymałem taki wynik (załącznik). I... ?

    0
  • #24 16 Wrz 2012 14:20
    coobah
    Poziom 17  

    O teraz jest nieźle, bo jak sprawdziłem "tak na szybko" to np. "Olsztyn" jest w dwóch różnych numerach "lacz", podobnie Warszawa KEN, DC Teresin FF...
    Jest super z tego co widzę :)

    0
  • Pomocny post
    #25 16 Wrz 2012 21:42
    adamas_nt
    Moderator Programowanie

    O, to fajnie. Poprawka jest baaardzo skomplikowana. Uwaga! W linii 21 jest:
    test.Add lista(i, 2), CStr(lista(i, 2))
    Usuń i podstaw

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #26 17 Wrz 2012 08:31
    coobah
    Poziom 17  

    Oki, usunąłem, podstawiłem to co wpisałeś, ale coś mi nie pasuje....

    Warszawa KEN występuje przy dwóch numerach "lacz": 117048 i 117023
    Po odpaleniu makra Warszawa KEN z "lacz" 117023 podpina się pod "lacz" 117076, a jego pierwotny numer "lacz" (117023) znika z tabeli całkowicie.
    Być może problem jest w tym, że wartość z kolumny C jest identyczna dla tych dwóch numerów "lacz", co?


    *numery "lacz" to tzw. numery łączeń. Natomiast miasta przypisane do konkretnego numeru "lacz" nie mogą przeskakiwać między nimi, nawet gdy wartość z kolumny C jest identyczna dla różnych numerów "lacz" :)

    0
  • Pomocny post
    #27 17 Wrz 2012 08:59
    marek003
    Poziom 40  

    Ja tylko zasugeruje że najlepiej by było wszystkie kolumny połaczyć i wtedy usuwać duplikat.
    Czyli jak dobrze rozumuje:

    Code:
    test.Add lista(i, 1) & lista(i, 2) & lista(i, 3) & lista(i, 4), CStr(lista(i, 1)) & CStr(lista(i, 2)) & CStr(lista(i, 3)) & CStr(lista(i, 4))

    0
  • #28 17 Wrz 2012 09:07
    coobah
    Poziom 17  

    marku, albo ja jestem ślepy, albo nie widzę różnicy po zastosowaniu Twojego wpisu :/

    0
  • #29 17 Wrz 2012 09:56
    marek003
    Poziom 40  

    Masz racje bo "moja" poprawka dotyczy możliwości wystąpienia specyficznych danych gdy numer lacz i miasto sa takie same a inne czasy. (nie wiem czy takie coś wogóle może mieć miejsce ale dla pewności takie zabezpieczenie).

    Błąd dotczyący błędnego złączenia jest gdzie indziej. Myśle że kolega adamas zaraz to wyłapie niemniej ja spróbuje spróbuje przeanalizować kod.

    0
  • #30 17 Wrz 2012 09:59
    coobah
    Poziom 17  

    marek003 napisał:
    Masz racje bo "moja" poprawka dotyczy możliwości wystąpienia specyficznych danych gdy numer lacz i miasto sa takie same a inne czasy. (nie wiem czy takie coś wogóle może mieć miejsce ale dla pewności takie zabezpieczenie).


    a takie kwiatki to wyłapuje inna nasza aplikacja ;)

    marek003 napisał:
    Błąd dotczyący błędnego złączenia jest gdzie indziej. Myśle że kolega adamas zaraz to wyłapie niemniej ja spróbuje spróbuje przeanalizować kod.


    mam taką cichą nadzieję, że będzie wyłapany ;)

    0