Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel - Tworzenie makra - sortowanie i przenoszenie między komórkami

coobah 06 Sep 2012 23:16 7665 48
  • #1
    coobah
    Level 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]
  • #2
    MarcinZablocki
    Level 10  
    Jezeli umiesz wykonać to narzędziami w Excelu to po prostu nagraj makro.
  • #3
    coobah
    Level 17  
    No mogę to zrobić na zasadzie "kopiuj wklej wytnij"
    Czy to wystarczy?
  • #4
    MarcinZablocki
    Level 10  
    Jeśli to ma być na zasadzie wybierania konkretnych wartości, to nie za bardzo. Znasz funkcje jeżeli ?
  • #5
    coobah
    Level 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...
  • #6
    marek003
    Level 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.
  • #7
    coobah
    Level 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.
  • #8
    marek003
    Level 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.
  • #9
    coobah
    Level 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ść...
  • #10
    adamas_nt
    Moderator of Programming
    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ć.
  • #11
    coobah
    Level 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..
  • Helpful post
    #12
    adamas_nt
    Moderator of Programming
    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...
  • #13
    coobah
    Level 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:

    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...
  • #14
    adamas_nt
    Moderator of Programming
    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.
  • #15
    coobah
    Level 17  
    adamas_nt, niestety to o czym piszesz to dla mnie czarna magia... :/

    HELP PLEASE :)
  • Helpful post
    #16
    adamas_nt
    Moderator of Programming
    coobah wrote:
    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.
  • #17
    adamas_nt
    Moderator of Programming
    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.
  • #18
    coobah
    Level 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ć
  • #19
    adamas_nt
    Moderator of Programming
    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?
  • #20
    coobah
    Level 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... ;(
  • #21
    adamas_nt
    Moderator of Programming
    Czyli wracamy do punktu wyjścia. Sortowanie wg kolumn, jak radzi kolega marekk003, i ręczne dopracowanie tabelki?
  • #22
    coobah
    Level 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.
  • #23
    adamas_nt
    Moderator of Programming
    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... ?
  • #24
    coobah
    Level 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ę :)
  • Helpful post
    #25
    adamas_nt
    Moderator of Programming
    O, to fajnie. Poprawka jest baaardzo skomplikowana. Uwaga! W linii 21 jest:
    test.Add lista(i, 2), CStr(lista(i, 2))
    Usuń i podstaw
    Code: vbscript
    Log in, to see the code
  • #26
    coobah
    Level 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" :)
  • Helpful post
    #27
    marek003
    Level 40  
    Ja tylko zasugeruje że najlepiej by było wszystkie kolumny połaczyć i wtedy usuwać duplikat.
    Czyli jak dobrze rozumuje:
    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))
  • #28
    coobah
    Level 17  
    marku, albo ja jestem ślepy, albo nie widzę różnicy po zastosowaniu Twojego wpisu :/
  • #29
    marek003
    Level 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.
  • #30
    coobah
    Level 17  
    marek003 wrote:
    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 wrote:
    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 ;)