Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

EXCEL VBA - sortowanie scalonych komórek

nizios 09 Sep 2013 14:17 6330 10
  • #1
    nizios
    Level 9  
    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.
  • #2
    adamas_nt
    Moderator of Programming
    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
  • #3
    nizios
    Level 9  
    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
  • #4
    User removed account
    User removed account  
  • #5
    nizios
    Level 9  
    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ć" ?
  • #6
    adamas_nt
    Moderator of Programming
    Mniej efektywnie, za to prościej ;)
    Code: vb
    Log in, to see the code
  • #7
    nizios
    Level 9  
    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 ;)
  • Helpful post
    #8
    adamas_nt
    Moderator of Programming
    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.
    Code: vb
    Log in, to see the code

    Update: Dołożyłem czyszczenie kolumny pomocniczej, skleroza :(
  • #9
    User removed account
    User removed account  
  • #10
    adamas_nt
    Moderator of Programming
    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
    Code: vb
    Log in, to see the code
  • #11
    nizios
    Level 9  
    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ś :)