Elektroda.pl
Elektroda.pl
X
SterControl
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

EXCEL VBA - sortowanie scalonych komórek

nizios 09 Wrz 2013 14:17 4653 10
  • #1 09 Wrz 2013 14:17
    nizios
    Poziom 6  

    Witam serdecznie,

    mam w pliku excela tabelę ze scalonymi komórkami, pech że muszę ją posortować, a że jest dość duża (2300 wierszy) to nie wchodzi w grę rozłączanie scalonych komórek. Na forum znalazłem już podobne pytania i odpowiedzi do nich, jednak w stosunku do nich u mnie występuje jeszcze jeden problem: ilość scalanych wierszy nie jest stała i waha się od 2 do 25.
    Normalnie sam bym coś kombinował (czyt. uczył się VBA) ale nie mam na to czasu, muszę to mieć zrobione na jutro. Po lekturze poprzednich wątków na podobne tematy wiem, że są tu osoby posiadające dużą wiedzę w zakresie tworzenia makr, więc bardzo proszę o pomoc w utworzeniu makra, które pozwoli mi posortować wspomnianą tabelę wg wartości w kolumnie D.

    0 10
  • SterControl
  • #2 09 Wrz 2013 20:23
    adamas_nt
    Moderator Programowanie

    W kolumnie D masz tekst. W związku z tym, przy porównywaniu ciągu, kolejność (w skrócie) będzie następująca:
    rosnąco- a1, a14, a19, a2, a3, itd. OK?

    Najprościej byłoby:
    -zapisać wszystkie wartości do tablicy
    -posortować tablicę
    w pętli /pozycje z tablicy/
    -wyszukać wartość w arkuszu
    -sprawdzić ile zajmuje wierszy
    -skopiować poza tabelkę (pierwszy, wolny wiersz)
    koniec pętli
    -po zakończeniu zapisywania, usunąć wiersze źródłowe
    -cieszyć się nowym ułożeniem danych

    0
  • SterControl
  • #3 10 Wrz 2013 07:44
    nizios
    Poziom 6  

    Tak w kolumnie D jest tekst, konkretnie adresy zamieszkania, trochę może niefortunnie wpisałem wartości w tę kolumnę. Ale chodzi o sortowanie rosnące (malejące też może być). Ogólnie rzecz biorąc muszę mieć zgrupowane w blokach osoby mieszkające w tych samych miejscowościach/ulicach. Można to też zrobić bez sortowania, na przykład wybierając z arkusza wszystkie osoby, które mieszkają pod adresem zaczynającym się "xxxxxx" i przenosząc je do nowego arkusza.

    "Najprościej byłoby:
    -zapisać wszystkie wartości do tablicy
    -posortować tablicę
    w pętli /pozycje z tablicy/
    -wyszukać wartość w arkuszu
    -sprawdzić ile zajmuje wierszy
    -skopiować poza tabelkę (pierwszy, wolny wiersz)
    koniec pętli
    -po zakończeniu zapisywania, usunąć wiersze źródłowe
    -cieszyć się nowym ułożeniem danych
    "

    Jak to zrobić w praktyce? Obawiam się, że sam nie dam rady

    0
  • #4 10 Wrz 2013 09:29
    23844
    Użytkownik usunął konto  
  • #5 12 Wrz 2013 11:45
    nizios
    Poziom 6  

    dziękuję bardzo, algorytm działa ale sortuje tylko kolumnę D, a nie całą tabelę po wartościach w kolumnie D, da się go jakoś "zmodernizować" ?

    0
  • #6 12 Wrz 2013 12:10
    adamas_nt
    Moderator Programowanie

    Mniej efektywnie, za to prościej ;)

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #7 12 Wrz 2013 12:30
    nizios
    Poziom 6  

    Kurcze no teraz jest prawie idealnie ;) , ale mam bardzo dużo powielonych wierszy, tzn. wygląda na to, że w przypadku gdy kilka osób mieszka pod tym samym adresem (lub nie mają podanego adresu) to w arkuszu pojawia się tylko pierwsza osoba o danych adresie i wiersz z jej wystąpieniem jest powielany tyle razy ile osób o tym samym adresie wystąpi w arkuszu. Mam nadzieję, że napisałem to zrozumiale ;)

    0
  • Pomocny post
    #8 12 Wrz 2013 13:14
    adamas_nt
    Moderator Programowanie

    No to trzeba było od razu... Najprościej (znooowuuu) zbić string z dwóch (lub więcej - aż do uzyskania unikatów) kolumn. W przykładzie (dostosuj do swoich danych) D, wykrzyknik i C zapisywane w kolumnie K.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Update: Dołożyłem czyszczenie kolumny pomocniczej, skleroza :(

    0
  • #9 12 Wrz 2013 16:41
    23844
    Użytkownik usunął konto  
  • #10 12 Wrz 2013 19:06
    adamas_nt
    Moderator Programowanie

    Dobre! Rzeczywiście pokazuje jakie to nieefektywne :D
    Przy mojej sklerozie jest to jedyny algorytm jaki znam na pamięć :) Ale wygląda na to, że znowu coś wypada wykuć.

    Jednak z drugiej strony łatwy do podszlifowania. Zmiana zajmuje tylko chwilkę. Np

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #11 13 Wrz 2013 13:54
    nizios
    Poziom 6  

    Dziękuję Wam wszystkim za chęci i podsuwane pomysły, a Panu adamas_nt za działające makro! Na pewno przyda się jeszcze kiedyś :)

    0