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.

funkcjonalna tabela w excelu (VBA)

elwis_85 23 Paź 2010 08:41 2730 3
  • #1 23 Paź 2010 08:41
    elwis_85
    Poziom 9  

    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

    0 3
  • Pomocny post
    #2 23 Paź 2010 09:25
    marcinj12
    Poziom 40  

    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:

    Code:

    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

    0
  • #3 23 Paź 2010 16:40
    elwis_85
    Poziom 9  

    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 :)

    0
  • Pomocny post
    #4 25 Paź 2010 09:45
    walek33
    Poziom 28  

    Sortowanie zrealizujesz pisząc ogólną procedurkę:

    Code:
    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:
    Code:
    Sub Makro3()
    
       Sortowanie ("B2")
    End Sub

    0