Pomysł na ten artykuł podsunął mi jeden z czytelników mojego blogu – Szafran (już po raz drugi korzystam z pomysłu Szafrana – pierwszy wpis znajdziecie tutaj). Dzięki!
Załóżmy, że analizujemy sprzedaż produktów w konkretnych dniach. Docelowo chcemy stworzyć wykres obrazujący sprzedaż. Dane są w postaci: data, wynik sprzedaży (Szafran akurat miał inne dane, ale schemat był dokładnie taki sam). W weekendy nasza firma nie pracuje, ale dane dostajemy w takiej postaci:
Jak widać, wypisane są wszystkie daty z określonego zakresu, niezależnie od tego, czy danego dnia coś sprzedano. Jest to kiepskie rozwiązanie, zwłaszcza gdy chcemy zrobić np. wykres tej sprzedaży. Wyglądałby on tak:
Mistrzostwo świata to to nie jest, przyznajcie sami. Widywałam lepsze wykresy… Koniecznie trzeba usunąć puste wiersze. Można to zrobić ręcznie, co wystarczyłoby pewnie w przypadku małej liczby danych. Gdy jednak mamy do czynienia z większą tabelą, aby ułatwić sobie pracę, koniecznie trzeba napisać makro. W tym artykule opiszę właśnie takie makro – usunie ono puste wiersze z zakresu.
Mamy arkusz, w którym jest tabela z danymi. U mnie są one w zakresie A1:C15. Dla makra nie będzie to jednak miało znaczenia. Najważniejsze jest, aby przed uruchomieniem makra zaznaczyć jedną z komórek tego zakresu. Na tej podstawie bowiem wybierzemy zakres, z którego automat usunie wiersze.
Wstawianie modułu
Przejdźmy zatem do pisania makra. Tak, tak – pisania. Nic tutaj nie będziemy nagrywać. Najpierw otwórzmy edytor Visual Basic (VBE). Można to zrobić, wybierając ze wstążki Deweloper/ Visual Basic (jeśli nie masz na wstążce karty Deweloper, koniecznie ją dodaj – tutaj opisałam, jak to zrobić).
Pojawi się okno VBE, a w nim okienko VBAProject:
Wylistowane są w nim wszystkie używane skoroszyty (niekoniecznie widoczne!). Na pewno na waszych komputerach lista będzie inna, ale nie ma to znaczenia. Najważniejsze, aby na tej liście był plik, w którym tworzymy makro. U mnie jest to UsuńPuste.xlsx (na razie jeszcze rozszerzenie to xlsx).
Teraz wstawimy moduł. Moduł to miejsce, gdzie przechowywany jest kod VBA, czyli nasze makro. Aby go dodać, kliknij prawym przyciskiem myszy np. na pozycji Arkusz1 (Arkusz1) (zaznaczone na obrazku). Następnie z menu kontekstowego wybierz Instert/ Module. Po prawej stronie pojawi się okno tego modułu, które jest na razie puste. W tym właśnie oknie będziemy pisać nasze makro. Dla porządku można jeszcze nazwać moduł. Nie jest to konieczne, bo w tym skoroszycie będzie tylko jeden moduł.
Kod makra
W oknie modułu wpiszmy następujący kod:
Sub Usun_puste_wiersze() Dim Zakres As Range, Kolumna As Range, Komorka As Range Dim Licznik As Long, LiczbaKomorek As Long, Usunietych As Long 'UWAGA! Zaznacz dowolną komórkę w zakresie, który ma zostać oczyszczony Set Zakres = ActiveCell.CurrentRegion Set Kolumna = Zakres.Columns(3) LiczbaKomorek = Zakres.Rows.Count Usunietych = 0 For Licznik = 1 To LiczbaKomorek Set Komorka = Kolumna.Cells(Licznik - Usunietych, 1) If Komorka.Value = 0 Then Rows(Licznik - Usunietych).Delete Usunietych = Usunietych + 1 End If Next Licznik Set Zakres = Nothing Set Kolumna = Nothing Set Komorka = Nothing End Sub
Zauważmy, że to makro jest procedurą, zatem jego nazwę poprzedzamy słówkiem sub. Na początku kodu znajduje się deklaracja zmiennych: obiektowych (Zakres, Kolumna, Komorka) i liczbowych (Licznik, LiczbaKomorek, Usunietych).
Zakres to po prostu nasze dane. Jest ustalany na podstawie zaznaczonej komórki, dlatego – tak jak pisałam na początku – przed uruchomieniem makra należy zaznaczyć dowolną komórkę zakresu.
Kolumna to trzecia kolumna naszego zakresu. To właśnie w niej będziemy szukać pustych komórek.
LiczbaKomorek to zmienna mówiąca o liczbie wierszy w Zakresie i w Kolumnie (jest identyczna).
Następnie zaczyna się pętla For. Zadziała tyle razy, ile jest wierszy w Zakresie. Po kolei sprawdzana jest każda komórka w Kolumnie. Jeśli jej wartość jest równa zero (0), czyli jeśli jest pusta, wiersz jest usuwany, a zmienna Usunietych zwiększa się o 1. Zmienna ta jest zmienną roboczą. Jej wartość bowiem odejmujemy od zmiennej Licznik. Ta z kolei zmienna mówi o numerze wiersza komórki, którą sprawdzamy, a następnie usuwamy.
Na samym końcu czyścimy zmienne obiektowe. I wszystko! Krótkie proste makro, a ile pracy zaoszczędzonej? Oczywiście, jak to zwykle w programowaniu bywa, przedstawione rozwiązanie nie jest jedynym możliwym. Znam jeszcze co najmniej 2, które również zadziałają. A może wy macie jakieś pomysły? Jeśli tak – napiszcie w komentarzach. Jestem ciekawa, co wymyśliliście.
Zapisanie pliku
Pamiętaj, że działania makra nie można cofnąć, polecam zatem zawsze zapisać plik przed uruchomieniem makra.
Na razie nasz plik ma rozszerzenie .xlsx. W plikach z takim rozszerzeniem nie można przechowywać makr. Musimy więc zapisać plik jako Skoroszyt programu Excel z obsługa makr (*.xlsm). Można to zrobić, korzystając z opcji Zapisz jako lub po prostu zapisać plik za pomocą skrótu klawiszowego Ctrl + s. Excel wykryje, że w skoroszycie znajdują się makra i wyświetli komunikat: W skoroszytach bez obsługi makr nie można zapisywać następujących funkcji: Projekt VBA.
Aby zapisać plik tak jak należy, czyli .xlsm, trzeba wybrać Nie. Jest to trochę mylące, bo domyślnym przyciskiem jest Tak i myszka większości użytkowników od razu tam wędruje.
Następnie z pola Zapisz jako typ wystarczy wybrać typ pliku Skoroszyt programu Excel z obsługa makr (*.xlsm). Jeśli twój Windows jest ustawiony tak, by nie wyświetlać rozszerzeń znanych typów plików, zobaczysz wtedy następujący typ na liście: Skoroszyt programu Excel z obsługa makr. W obu przypadkach uzyskamy pożądany efekt.
Uruchamianie makra
Ok, plik zapisany, makro napisane. Teraz trzeba je uruchomić. Z poziomu kodu najprostszym sposobem uruchomienia makra jest ustawienie kursora w dowolnym miejscu kodu i użycie klawisza F5. Mimo że widok nie przełączy się na arkusz Excela, to makro zostanie wykonane.
Innym sposobem jest naciśnięcie zielonej strzałki w prawo. Znajduje się ona na pasku narzędzi Standard:
Z poziomu arkusza makro można uruchomić z menu Deweloper/ Kod/ Makra, przez wybranie konkretnego makra z okna Makro. Skrót klawiszowy wywołujący to okno to Alt + F8.
A sposób bardziej user-friendly opisuję w kolejnym artykule: Uruchamianie makra za pomocą przycisku w arkuszu.
Wynik działania makra
Ok. Niezależnie od tego, z której metody uruchamiania makra skorzystamy, jego działanie będzie identyczne. Da w wyniku taki efekt:
Jak widać, wiersze z pustymi komórkami zostały usunięte i o to chodziło.
Wracając do wykresu, który chcieliśmy utworzyć z tych danych, to teraz wygląda on tak (trochę go ztuningowałam:)):
Pokusiłam się jeszcze o stworzenie wykresu danych narastająco
Voila! Wszystko!
Wow. Całkiem długi artykuł wyszedł. Mam nadzieję, że wam się przyda! A może nie tylko wam? Jeśli znacie kogoś, kto może skorzystać z tego makra, wyślijcie mu, proszę, link do tego artykułu: http://malinowyexcel.pl/usuwanie-pustych-wierszy-w-zakresie-za-pomoca-makra-vba. Niech też sobie uprości życie!
Redakcja językowa: Aleksandra Wasiak