Tym razem będziemy nagrywać makro, którego zadaniem będzie transponowanie danych, które zostały zaimportowane w małych blokach w jednej kolumnie. Na raz chcemy transponować pojedynczy blok danych.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-01

Musimy pamiętać, żeby nasze makro było na tyle uniwersalne, żeby uwzględniało różną długość bloków danych (ilość wierszy danych w jednym bloku). Najważniejsze jednak w tym przykładzie jest zastanowienie się nad tym, gdzie nasze makro powinno się zaczynać, a gdzie kończyć, żebyśmy je mogli wykonywać cyklicznie. Czyli zaraz po skończeniu makra chcemy je uruchomić ponownie, by transponować kolejny blok.

Zwróć tu uwagę, że w niektórych makrach musisz założyć, że kod sam powinien przejść do konkretnej komórki, ale w tych najprostszych – pisanych dla siebie, możesz założyć, że użytkownik (TY ;)) zaznaczy poprawnie pierwszą komórkę. W naszej sytuacji powinien po być pierwszy numer ID, a żeby nasze makro można było uruchamiać wielokrotnie po sobie, powinniśmy skończyć na kolejnym numerze ID.

Przy tym makrze praktycznie cały czas możemy mieć włączone odwołania względne w makrach, bo gdy będziemy korzystać ze skrótów klawiszowych nie będzie to miało znaczenia, ponieważ w większości sytuacji, skrót klawiszowy uruchamia konkretny mechanizm – zapisuje się jako konkretna „funkcja” w VBA.

Zacznijmy w końcu nagrywać nasze makro. Nazwijmy je sobie Transponowanie i przypiszmy do niego skrót klawiszowy Ctrl + Shift + T, żebyśmy mogli je szybko uruchamiać.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-02

Teraz możemy przejść przez kolejne kroki naszego makra. Ponieważ rozpoczynamy od numeru ID, to żeby zaznaczyć cały blok danych wystarczy, że skorzystamy ze skrótu klawiszowego Ctrl + Shift + strzałka w dół.

Teraz wystarczy go skopiować (Ctrl + C) i przejść do komórki nad numerem ID. Ponieważ zaczynaliśmy od numeru ID, to jego komórka jest aktywną, więc możemy albo nacisnąć strzałkę w górę, albo od razu kliknąć na komórkę powyżej prawym przyciskiem myszy (przypominam, że mają być włączone odwołania względne).

Jeśli klikniemy prawym przyciskiem myszy, to od Excela 2010, z podręcznego menu możemy wybrać opcję transponowania.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-03

W Excelu 2007 najbezpieczniejszą drogą jest zaznaczenie komórki nad numerem ID, a potem rozwinięcie polecenia Wklej na karcie Narzędzia dane i wybranie z listy opcji Transpozycji.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-04

Po wklejeniu przetransponowanych danych, będziemy musieli usunąć wklejony blok danych.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-05

Ponieważ będzie teraz aktywna komórka nad ID, to wystarczy strzałka w dół lub kliknięcie na komórkę poniżej myszką (edytor VBA zarejestruje te operacje tak samo). Następnie znów skrót Ctrl + Shift + strzałka w dół, by zaznaczyć cały blok danych. Teraz będziemy chcieli go usunąć. Możesz albo skorzystać ze skrótu klawiszowego Ctrl + - (Ctrl i minus), albo kliknąć prawym przyciskiem myszy na zaznaczenie i z podręcznego menu wybrać polecenie usuń.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-06

Pojawi się okno usuwanie, gdzie chcemy się upewnić, że jest zaznaczona opcja: Przesuń komórki do góry.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-07

Po usunięciu danych będzie aktywna komórka o jeden wiersz wyżej niż chcieliśmy, dlatego musimy jeszcze nacisnąć strzałkę w dół i możemy zatrzymać rejestrowanie naszego makra.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-08

Teraz chcemy sprawdzić, czy zarejestrowane przez nas makro działa, czyli naciskamy skrót klawiszowy, który do niego przypisaliśmy Ctrl + Shift + T.

Dane powinny się odpowiednio transponować. Przytrzymaj teraz tą kombinację klawiszy, aż pokaże się komunikat o błędzie run-time error ‘1004’.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-09

Komunikat ten daje nam możliwość zakończenia makra (przycisk End), albo przejścia do linijki kodu, która spowodowała błąd (przycisk Debug).

Przejdźmy sobie do debugowania kodu. Linijka podświetlona na żółto, to ta wywołująca błąd.

wstep-do-makr-09-nagrywanie-makra-z-transponowaniem-danych-i-run-time-error-10

Po słowie PasteSpecial można się zorientować, że wklejamy tutaj dane, ale dlaczego nasze makro, które działało poprawnie, aż do tego momentu, teraz powoduje błąd?

Problemu nie rozwiążemy patrząc na kod VBA, bo tutaj się nic nie zmienia, ale jeśli spojrzysz na arkusz Excela, to zobaczyć, że do kopiowania został zaznaczony bardzo duży zakres pustych komórek. Tak zadziałała skrót klawiszowy Ctrl + Shift + strzałka w dół, kiedy zaczynasz od pustej komórki i nie ma żadnych danych pod spodem.

Czyli kod VBA chce teraz transponować ponad milion wierszy. To jest nie możliwe, bo kolumn jest znacznie mniej. Dlatego też pojawia się błąd przy uruchomieniu kodu, bo dopiero pewna kombinacja danych, czy też ich braku, powoduje zaistnienie takiej sytuacji, a w większości sytuacji ten kod zadziała poprawnie.

Ponieważ zaczynamy dopiero naukę makr, nie będziemy tutaj próbować obsługiwać tego błędu, po prostu zakończmy makro, bo przecież transponowaliśmy już wszystkie bloki danych, czyli wykonaliśmy naszą pracę 🙂
Zapamiętaj sobie w tym momencie jedno:

Najważniejsze, żeby Twój kod działał! Nie musi być idealny!

Czasem nawet może powodować błąd jeśli TY go obsługujesz, bo szkoda tracić czasu na jego dopieszczanie. Bo jak to w życiu – kolejne zadania czekają za rogiem.

W tym przykładzie moglibyśmy dopisać pętlę i obsługę błędu, żeby makro somo się wykonywało do końca danych poprawnie, ale nie jest nam to potrzebne na tym etapie znajomości makr.

To co zrobiliśmy działa i z tego powinniśmy się cieszyć :D. Dopiero z czasem, jeśli będzie to Ci potrzebne, nauczysz się dodawać odpowiednie kawałki kodu, a w następnym odcinku zobaczysz dokładny opis kodu.

Chcesz ze mną poznać możliwości VBA? Zobacz kiedy planowana jest następna edycja 30dniowego kursu online:
http://excelw30dni.pl/kategoria-produktu/szkolenia-vba/

Pozdrawiam
Adam Kopeć
Miłośnik Excela