Ten artykuł to kontynuacja tematu z poprzedniego artykułu, jednak rozwiązanie, które zaprezentuję będzie wykorzystywało Power Query.
Przypomnę założenia:
Załóżmy, że mamy taki zestaw danych:
Chciałabym zmienić kolejność kolumn tego zakresu na taką:
Dodatkowo chcę móc łatwo powtórzyć takie sortowanie kolumn w przyszłości, ponieważ dane generowane są każdorazowo z systemu. A żeby jeszcze utrudnić sprawę – za każdym razem mogą zostać wygenerowane inne kolumny, na szczęście zawsze spośród kolumn wyżej wymienionych. Czyli np. raz możemy mieć wszystkie kolumny, a innym razem – wszystkie poza kolumną Klient.
1. Ładowanie danych do Power Query
Aby zacząć z Power Query, najpierw musimy załadować do niego dane. Ponieważ oba zestawienia mam w Excelu – najprościej będzie skorzystać z konektora dostępnego bezpośrednio z menu Dane -> Z tabeli/Zakresu.
W wyniku tego powstaną mi dwa zapytania:
- tbDane
- tbKolejnosc
Mogę przystępować do edycji zapytania tbDane.
2. Logika rozwiązania w Power Query
Cały problem w tym zadaniu polega na tym, że nie zawsze będziemy mieli do czynienia ze wszystkimi kolumnami z listy nagłówków (tbKolejnosc). Nie wchodzi więc w grę ręczna zamiana miejscami kolumn z interfejsu, ponieważ na sztywno wpisuje nazwy kolumn do formuły (hardcoduje je).
Ale zdecydowanie użyjemy funkcji, jaką ta metoda generuje, czyli Table.ReorderColumns. Jednak listę przechowującą kolejność kolumn podamy tej funkcji dynamicznie.
Kroki mojego rozwiązania będą następujące:
- Nadanie numeracji nagłówków w zapytaniu tbKolejnosc
- Pobranie nagłówków tabeli tbDane do obiektu lista
- Konwersja tej listy na obiekt tabela
- Scalenie (Join) powyższej tabeli i tabeli tbKolejnosc
- Zamiana kolejności funkcją Table.ReorderColumns
Do dzieła!
3. Dynamiczna zmiana kolejności kolumn w Power Query
Aby pobrać nagłówki do obiektu lista w Power Query, wstawię nowy krok w zapytaniu tbDane. Kliknę w tym celu fx obok paska formuły i użyję funkcji:
= Table.ColumnNames( Źródło)
Teraz z menu Narzędzia do obsługi List/Przekształć wybiorę Do tabeli, dzięki czemu otrzymam to samo, co miałam w liście, tylko w obiekcie tabela.
Teraz mogę dokonać scalania zapytań: tbDane i tbKolejność. W tym celu z menu Narzędzia główne wybiorę Scal zapytania:
Istotne jest, aby wybrać tutaj sprzężenie lewe zewnętrzne.
Efekt mam taki:
Teraz rozwinę kolumnę tbKolejnosc i oto wynik:
Teraz wystarczy posortować po kolumnie Indeks, a następnie ją usunąć. Zamiast ręcznego usuwania kolumny można skorzystać z zapisu:
= Table.Sort(#"Rozwinięty element tbKolejnosc",{{"Indeks", Order.Ascending}})[Column1]
Otrzymaną listę użyjemy za chwilę do ustalenia kolejności kolumn. Aby sobie to ułatwić, proponuję zmienić nazwę obecnego kroku na krótszą, np. Kolejnosc.
Teraz wystarczy dodać nowy krok (fx) i wpisać następującą formułę:
= Table.ReorderColumns(Źródło, Kolejnosc)
I voila! Po nadaniu typów danych otrzymujemy następujący efekt:
Wystarczy załadować do Excela i gotowe!
Film na Youtubie, gdzie pokazuję powyższe rozwiązanie:
0 komentarzy