logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak stworzyć makro w Excelu do sortowania danych z wielu zakładek?

elwis_85 23 Paź 2010 08:41 3315 3
REKLAMA
  • #1 8652551
    elwis_85
    Poziom 9  
    Posty: 38
    witam :)
    Próbuje napisać mały programik jednak cały czas mam jakieś błędy, a na niektóre rozwiązania brak mi pomysłów. To mój pierwszy program, dotychczasowe wypociny opieram na tym co wyczytałem w internecie.

    Chciałbym stworzyć makro w Excelu, miałby to być wykaz uwzględniający wszystkie informacje z pozostałych zakładek (które edytowane są ręcznie).

    Chciałbym aby nowa zakładka "wykaz" była w formie tabelki, gdzie po kliknięcie w określony nagłówek kolumny następowałoby sortowanie wszystkich wierszy względem wybranej kolumny (względem "nazwiska", "daty zlecenia", "daty realizacji" i "statusu zlecenia" patrz plik zamieszczony do postu.)

    - Działanie programu musiałoby się rozpoczynać od skopiowania wszystkich WYPISANYCH wierszy z zakładek (gdy kolejny wiersz będzie pusty przejście do następnej zakładki).

    tzn. domyślam sie ze musiałoby to być jakaś pętelka która działała by w opisany poniżej sposob:

    1. jeżeli w komórce pierwszego wiersza pierwszej zakładki (dajmy na to warunek ze liczba porządkowa jest większą od 0) jest cokolwiek wpisane, cały wiersz zostaje kopiowany do wykazu + do pierwszej kolumny wykazu kopiowana byłaby nazwa zakładki z której skopiowano wiersz

    2. jezeli kolejny wiersz jest pusty nastepuje przejście do kolejnej zakładki i kolejne kopiowanie wierszy i tak w kółko aż do skopiowania wszystkiego z wszystkich zakładek.

    przydałaby się jeszcze jakieś przyciski sortowania, i wyboru miesiąca "zlecenia zadania" jaki ma być wyświetlony w wykazie

    Oto moje dotychczasowe wypociny:

    Public a As Integer; zmienna - liczba porządkowa na zakładce "wykaz"
    Dim b As Integer; zmienna - liczba porządkowa na zakładkach z nazwiskami

    Do While Sheets("nazwisko1").Cells(b+1, 1) > 0

    Cells(b+1, 2).selct
    Selection.Copy
    Cells(a+1, 2).Select
    Selection.Paste

    itd kopiowanie komórek tego wiersza
    a = a + 1
    b = b + 1
    Loop

    (w tym momencie zmienna "b" powinna być zresetowana, zmienna "a" dalej naliczana)

    Do While Sheets("nazwisko2").Cells(b+1, 1) > 0

    Cells(b+1, 2).selct
    Selection.Copy
    Cells(a+1, 2).Select
    Selection.Paste

    itd kopiowanie komórek tego wiersza
    a = a + 1
    b = b + 1
    Loop


    itd dla kolejnej zakładki

    Do postu załączam przykładowy plik Excela który obrazuje mój problem, dziękuje wszystkim za czas poświęcony na przeczytanie postu, za wszelkie porady będę wdzięczny.

    Pozdrawiam
    Załączniki:
    • makro.xls (39 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 8652633
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Do samego kopiowania lepiej użyć funkcji for each, która odczyta dane z każdego arkusza i przekopiuje cały zakres. Przyjrzyj się temu rozwiązaniu:
    
    Private Sub CommandButton1_Click()
    Application.ScreenUpdating = False
    
    Set wswykaz = ThisWorkbook.Worksheets("Wykaz")
    wswykaz.Range("A2:F65536").ClearContents
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "wykaz" Then
            ost_wykaz = wswykaz.Range("B65536").End(xlUp).Row   'ostatni pusty wiersz w wykazie
            ost_ark = ws.Range("A65536").End(xlUp).Row   'ostatni pusty wiersz w arkuszu danych
            
            If ost_ark > 1 Then 'jeżeli są dane do przekopiowania
                ws.Range("B2:E" & ost_ark).Copy Destination:=wswykaz.Range("C" & ost_wykaz + 1)
                wswykaz.Range(wswykaz.Cells(ost_wykaz + 1, 2), wswykaz.Cells(ost_wykaz + ost_ark - 1, 2)) = ws.Name
            End If
        End If
    Next ws
    
    MsgBox "Pobieranie zakończone"
    Set wswykaz = Nothing
    Application.ScreenUpdating = True
    End Sub
    
  • REKLAMA
  • #3 8653995
    elwis_85
    Poziom 9  
    Posty: 38
    Dziękuję bardzo za kod, prześledziłem go gruntownie i wiele wnosi on do mojej póki co skromnej wiedzy. W swoim przykładowym pliku Excela dodałem formanty i starałem się przypisać im pewne funkcje, z sortowaniem wedlug kolumny "status zlecenia" poszło mi gładko nawet sortowanie naprzemienne działa :).

    1. Problem pojawia się przy segregowaniu danych względem "daty zlecenia", chciałbym aby po kliknięciu w ta formante nastąpiło segregowanie malejące a po kolejnym kliknięciu sortowanie rosnące i tak na przemian, jaką funkcją zrealizować takie naprzemienne sortowania??

    2. w zakładce "wykaz" chciałbym aby w kolumnie "LP" powstawała liczba porządkowa, czyli co pętelkę kopiowania wiersza +1, teoretycznie domyślam się że trzeba by było stworzyć zmienną integer, i umieścić ją w pętli, no ale praktycznie nie wychodzi mi to :/

    3. czy byłaby możliwość aby dane kopiowane do zakładki "wykaz" ograniczać miesiącem( styczeń bądź np luty lub wszystkie miesiące) daty zlecenia, przy pomocy formanty pole kombi?? czytałem coś o "CmboBoxOpertion" ale nie wiem z czym to się je. formante wstawiłem ale nie wiem jak ją zaprogramować.
    Dołączam przykładowy plik z dotychczasowymi osiągnięciami.
    Będę wdzięczny za wszelkie sugestie :)
    Załączniki:
    • makro.xls (70.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #4 8660332
    walek33
    Poziom 29  
    Posty: 1015
    Pomógł: 132
    Ocena: 81
    Sortowanie zrealizujesz pisząc ogólną procedurkę:
    Sub Sortowanie(Klucz As String)
        Selection.Sort Key1:=Range(Klucz), Order1:=xlAscending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    End Sub
    

    i wywołując ją w obsłudze przycisku z odpowiednim adresem. Dla Nazwisko będzie:
    Sub Makro3()
       Sortowanie ("B2")
    End Sub
    
REKLAMA