Podczas korzystania z Power Query czasami pojawia się potrzeba pobrania tego samego typu danych (wymagającego tych samych przekształceń) z różnych źródeł. Tymi źródłami mogą być np. pliki zlokalizowane w różnych folderach, mogą to też być dane z różnych stron internetowych. Z punktu widzenia Power Query wymaga to stworzenia niestandardowej funkcji.

W tym artykule omówimy pobieranie danych z plików .pdf oraz ze stron internetowych z wykorzystaniem takiej funkcji. Przy okazji omówimy przykładowe przekształcenia danych w ramach tworzonych funkcji/zapytań.
Pobieranie danych z wielu plików PDF
Pierwszy omawiany przykład będzie dotyczył pobierania danych z plików .pdf. Mamy przygotowaną tabelę, zaciągniętą do Power Query, w której mamy listę przykładowych ścieżek dostępu do plików, które pokazuje Rysunek 1.
Dla uproszczenia przykładu ścieżki prowadzą do tego samego folderu, ale równie dobrze mogłyby one prowadzić do folderów znajdujących się w całkiem innych lokalizacjach czy dyskach. Część z tych ścieżek specjalnie prowadzi do nieistniejących plików, w związku z czym w późniejszym etapie przekształceń będziemy musieli usunąć błędy z tym związane.
W pierwszej kolejności pobierzemy dane z jednego pliku. Strukturę danych w przykładowym pliku .pdf pokazuje Rysunek 2.
Dane w plikach .pdf powstały na podstawie danych ze strony: https://coinmarketcap.com/historical.
Żeby pobrać dane z pliku .pdf do Power Query, należy na karcie „Dane” rozwinąć polecenie „Pobierz dane”, następnie przejść do opcji „Z pliku” i wybrać pozycję „Z pliku PDF”, co pokazuje Rysunek 3.
Otworzy to okno „Importowanie danych”, w którym musimy odnaleźć plik .pdf, z którego chcemy pobrać dane. Po jego zaznaczeniu klikamy w przycisk „Importuj”, jak pokazuje to Rysunek 4.
Po kliknięciu przycisku „Importuj” otworzy się okno „Nawigator”, w którym wybieramy informacje (tabele albo strony), które chcemy pobrać z pliku .pdf, jak pokazuje Rysunek 5.
Standardowo możemy pobrać informację z jednej strony lub tabeli. Ważne, że pojedyncza tabela może zająć maksymalnie jedną stronę. Klikając na ikonę foldery/nazwę pliku w oknie „Nawigator” (Rysunek 5), pobierzemy wszystkie dane z pliku .pdf, które później będziemy mogli odfiltrować.
W oknie „Nawigator” możemy też zaznaczyć checkbox „Wybierz wiele elementów”, który pozwoli zaznaczać, które informacje chcemy pobierać, ale wtedy każda tabela i strona zostanie zaimportowana jako osobne zapytanie.
W tym przykładzie chcemy pobrać dane tylko z pierwszej tabeli („Table001”). Jak pokazuje okno „Nawigator”, znajduje się ona na pierwszej stronie pliku .pdf.
Przekształcanie danych
Po zaznaczeniu wybranego elementu klikamy w przycisk „Przekształć dane”. Zaimportuje to dane do edytora. Powinniśmy w nim zobaczyć domyślnie cztery kroki:
- „Źródło”, który wskazuje lokalizację pliku.
- „Nawigacja”, który wybiera dane ze wskazanej przez nas tabeli.
- „Nagłówki o podwyższonym poziomie”, który wykorzystuje pierwszy wiersz jako nagłówki (nazwy) kolumn.
- „Zmieniono typ”, który przypisuje wszystkim kolumnom konkretny typ danych.
Ostatni krok („Zmieniono typ”) wpływa na dalsze przekształcenia, więc jeśli dodał się automatycznie, lepiej go usunąć.
Pierwszym przekształceniem jest poprawienie danych w trzech ostatnich kolumnach (% 1h, % 24h, % 7d). Możemy zauważyć, że edytor od początku wszystkim kolumnom przypisał tekstowy typ danych. W niektórych komórkach występuje znak mniejszości (co pokazuje Rysunek 6), na początku nam to odpowiada.
Docelowo jednak musimy usunąć znak mniejszości z trzech ostatnich kolumn. Dlatego zaznaczamy trzy ostatnie kolumny, np.: przytrzymując klawisz Ctrl i klikamy je po kolei, a następnie na karcie „Przekształć” klikamy w polecenie „Zamienianie wartości”, jak pokazuje Rysunek 7.
Otworzy to okno „Zamienianie wartości”, gdzie w pole „Wartość do znalezienia” wstawiamy znak mniejszości, a pole „Zamień na” pozostawiamy puste, jak pokazuje to Rysunek 8. Wprowadzone przez nas zmiany zatwierdzamy przyciskiem OK.
Kolejnym przekształceniem, jakie chcemy wykonać, jest usunięcie zbędnych kolumn. Są to w tym przykładzie kolumny: „Podaż w obiegu” oraz „Wolumen dzienny”. Żeby je usunąć, wystarczy je zaznaczyć i nacisnąć klawisz Delete.
Teraz możemy wykryć typ danych dla trzech ostatnich kolumn i pierwszej kolumny (L.p.). Wystarczy je zaznaczyć, trzymając klawisz Ctrl, a następnie kliknąć w polecenie „Wykryj typ danych” znajdujące się na karcie „Przekształć”.
Nie wykrywamy automatycznie typów danych dla kolumn „Kapitalizacja rynkowa” i „Cena”, ponieważ liczby w nich przechowywane (Rysunek 5) nie są zgodne z polskimi ustawieniami regionalnymi (z polskim zapisem liczb) i Power Query przypisałby im tekstowy typ danych. Dlatego przekształcenia musimy dokonać ręcznie. Potrzebujemy kliknąć w ikonę typu danych w nagłówku danej kolumny, a następnie w podręcznym menu wybrać ostatnią opcję „Używając ustawień regionalnych”, jak pokazuje to Rysunek 9.
Otworzy to okno „Zmienianie typu za pomocą ustawień regionalnych”, gdzie jako „Typ danych” potrzebujemy wybrać walutę, a jako „Ustawienia regionalne” Angielski (Stany Zjednoczone), jak pokazuje to Rysunek 10.
Korzystając z interfejsu użytkownika, możemy w ten sposób dopasować typ danych tylko dla jednej kolumny w kroku, ale możemy też zmodyfikować odpowiednio kod dla dodanego kroku w pasku formuły. Czyli w kodzie:
= Table.TransformColumnTypes(#"Zmieniono typ", {{"Kapitalizacja rynkowa", Currency.Type}}, "en-US")
dodajemy jeszcze informacje dla drugiej kolumny Cena:
= Table.TransformColumnTypes(#"Zmieniono typ", {{"Kapitalizacja rynkowa", Currency.Type}, {"Cena", Currency.Type}}, "en-US")
Na koniec dokonamy najtrudniejszego przekształcenia, czyli poprawimy dane w kolumnie „Nazwa”. Możemy zauważyć (Rysunek 5), że w kolumnie „Nazwa” przed każdą nazwą kryptowaluty znajduje się jej symbol. Żeby poprawić kolumnę „Nazwa”, nie możemy po prostu użyć polecenia „Zamienianie wartości” z karty Przekształć (Rysunek 7), ponieważ użyta w nim funkcja nie pozwala dopasować wartości dla poszczególnych wierszy. Dla całej kolumny musimy użyć tej samej wartości.
Dlatego w tym przykładzie na karcie „Dodaj kolumnę” rozwiniemy polecenie „Wyodrębnij” i skorzystamy z opcji „Tekst za ogranicznikiem”, jak pokazuje to Rysunek 11.
Otworzy to okno „Tekst za ogranicznikiem”, w którym wystarczy w pole „Ogranicznik” wpisać przykładową wartość tekstową, np. BTC, jak pokazuje to Rysunek 12.
Następnie w pasku formuły możemy zamienić wpisany na stałe tekst BTC na odwołanie do kolumny „Symbol”. Od razu też możemy zmienić domyślną nazwę nowej kolumny z „Tekst za ogranicznikiem” na np.: „Oczyszczona Nazwa”. Oznacza to, ze w pasku formuły zamiast formuły:
= Table.AddColumn(#"Zmieniono typ z ustawieniami regionalnymi", „Tekst za ogranicznikiem", each Text.AfterDelimiter([Nazwa], "BTC"), type text)
Powinniśmy wpisać
= Table.AddColumn(#"Zmieniono typ z ustawieniami regionalnymi", „Oczyszczona Nazwa", each Text.AfterDelimiter([Nazwa], [Symbol]), type text)
Należy teraz skasować kolumnę „Nazwa”, a kolumnę „Oczyszczona Nazwa” przeciągnąć za „L.p.” Wystarczy złapać nagłówek kolumny lewym przyciskiem myszy i przeciągnąć ją w odpowiednie miejsce.
Parametryzacja zapytania
Oczyściliśmy dane i dokonaliśmy potrzebnych przekształceń. Kolejnym etapem będzie sparametryzowanie zapytania, żeby można je było w łatwy sposób przekształcić na funkcję.
Żeby to było możliwe, w pierwszej kolejności na karcie Widok musi być zaznaczony checkbox „Zawsze zezwalaj” w grupie „Parametry”.
Jeśli ten checkbox jest zaznaczony, możemy kliknąć w koło zębate obok nazwy kroku „Źródło”. W tym przykładzie otworzy to okno importu danych z pliku .pdf, gdzie możemy rozwinąć listę obok pola „Ścieżka pliku” i wybrać tutaj opcję „Nowy parametr”, jak pokazuje Rysunek 13.
Otworzy to okno „Zarządzaj parametrami”, gdzie możemy ustawić właściwości parametru. Potrzebujemy zmienić nazwę z domyślnej, np.: ŚcieżkaDoPDFa. Na liście rozwijanej „Typ” wybieramy pozycję „Tekst”. Opcji na liście „Sugerowane wartości” nie zmieniamy, a w pole „Wartość bieżąca” wpisujemy aktualną ścieżkę dostępu do pliku, jak pokazuje to Rysunek 14.
Po uzupełnieniu odpowiednio wszystkich właściwości nowego parametru zatwierdzamy jego dodanie przyciskiem OK. Wrócimy do okna importowania pliku .pdf, ale teraz zamiast dokładnego odwołania do ścieżki pliku będzie się w nim znajdowała nazwa nowo utworzonego parametru. Dodatkowo z lewej strony w sekcji zapytań będzie można zobaczyć nowo utworzone zapytanie/parametr. Wszystko to pokazane jest na Rysunku 15.
Od teraz ścieżkę dostępu do pliku .pdf będziemy zmieniać w parametrze ŚcieżkaDoPDFa. Wystarczy zaznaczyć go na liście zapytań i odpowiednio zmienić ścieżkę dostępu.
Tworzenie funkcji
Teraz, gdy używamy parametru w zapytaniu, możemy je łatwo zamienić na funkcję, którą będziemy wykorzystać w innych zapytaniach. Zanim to zrobimy, zmieńmy domyślną nazwę stworzonego zapytania (bazującą na nazwie tabeli, z której pobieraliśmy dane z pliku .pdf) na bardziej przyjazną, np.: PathToPDF.
Po zmianie nazwy zapytania możemy w nią kliknąć na liście zapytań prawym przyciskiem myszy i w podręcznym menu wybrać opcję „Utwórz funkcję”, jak pokazane jest to na Rysunku 16.
Otworzy to okno „Utwórz funkcję”, gdzie w pole „Nazwa funkcji” wpisujemy nazwę funkcji. Powinna ona mieć inną nazwę niż wcześniej utworzony parametr i zapytania. Niech będzie to PojedynczyPDF, jak pokazuje to Rysunek 17.
Po zatwierdzeniu utworzeniu nowej funkcji wszystkie zapytania z nią związane, czyli parametr ŚcieżkaDoPDFa i zapytanie PathToPDF zostaną zgrupowane wraz z funkcją do jednego folderu, jak pokazuje to Rysunek 18.
Wykorzystanie funkcji
Teraz możemy wykorzystać stworzoną przez nas funkcję w zapytaniu „Paths”. Wystarczy do niego przejść, a następnie na karcie „Dodaj Kolumnę” kliknąć w polecenie „Wywołaj funkcję niestandardową”, jak pokazuje to Rysunek 19.
Otworzy to okno „Wywołaj funkcję niestandardową”, w który musimy wybrać funkcję, której chcemy użyć (pole „Zapytanie funkcji”). Na podstawie wybranej nazwy funkcji powinno domyślnie wypełnić się pole „Nazwa nowej kolumny”. Pozostaje jeszcze upewnić się, że parametr ŚcieżkaDoPDFa, czyli argument funkcji, prawidłowo odwołuje się do kolumny „Ścieżka do pliku”, jak pokazuje to Rysunek 20.
Zatwierdzenie wywołania funkcji przyciskiem OK wygeneruje nam dane jak na Rysunku 21.
Dla wierszy, gdzie wskazany plik nie istnieje funkcja, w kolumnie „PojedynczyPDF”, zwraca błąd (Error), a dla prawidłowych ścieżek zwraca tabele. Zanim rozwiniemy tabele, musimy usunąć wiersze z błędami. Wystarczy, że zaznaczymy kolumnę „PojedynczyPDF”, a następnie na karcie „Narzędzia główne” rozwiniemy polecenie „Usuń wiersze” i wybierzemy opcję „Usuń błędy”, jak pokazuje to Rysunek 22.
Po usunięciu wierszy z błędami możemy kliknąć w ikonę dwóch strzałek w nagłówku kolumny „PojedynczyPDF” i wybrać, które kolumny z wyniku chcemy rozwinąć. My zakładamy, że chcemy wszystkie kolumny, ale bez prefiksów, dlatego odznaczamy checkbox „Użyj oryginalnej nazwy kolumny jako prefiksu”, jak pokazuje to Rysunek 23. Przy rozwijaniu większych tabel może być potrzeba kliknięcia w link „Załaduj więcej danych”, żeby edytor na pewno uwzględnił wszystkie kolumny wewnętrznej tabeli. W tym przykładzie nie ma takiej potrzeby.
Rozwinięcie kolumny jest ostatnim potrzebnym nam krokiem, dlatego możemy rozwinąć polecenie „Zamknij i załaduj” na karcie „Narzędzia główne” i wybrania opcji „Zamknij i załaduj do”. Otworzy to okno „Importowanie danych”, gdzie powinniśmy wybrać „Utwórz tylko połączenie” (Rysunek 24), ponieważ aktualna operacja importowania dotyczy tylko zapytania „PathToPDF”. Funkcja i parametr zawsze wczytują się tylko jako połączenie, a zapytanie tPaths już wcześniej było tak wczytane.
Nam zależy na tym, żeby do Excela zaimportować wynik zapytania „tPaths”, gdzie połączyliśmy informacje z kilku plików. Żeby zmienić miejsce importowania zapytania, trzeba na nie kliknąć prawym przyciskiem myszy w oknie „Zapytania i połączenia” i w podręcznym menu wybrać opcję „Załaduj do”, jak pokazuje to Rysunek 25.
Jeśli okno „Zapytania i połączenia” nie otworzyło się automatycznie po załadowaniu danych do Excela, należy na karcie „Dane” kliknąć w polecenie „Zapytania i połączenia”.
Pobieranie danych ze stron www
W kolejnym przykładzie będziemy pobierać dane z internetu, dokładnie ze stron archiwalnych Narodowego Banku Polskiego na temat kursów walut. Przykładową stroną archiwalną będzie tutaj:
https://nbp.pl/archiwum-kursow/tabela-nr-084-a-nbp-2025-z-dnia-2025-05-02/
Docelowo będziemy chcieli pobrać kursy walut z różnych dni (NBP nie notuje/przechowuje kursów walut z weekendów oraz świąt). Dodatkowo nie interesują nas wszystkie waluty, a te, które zostały przez nas wypisane w tabeli „tWaluty”, którą później będziemy musieli przekształcić na listę. Listę walut oraz daty wraz z wygenerowanymi dla nich adresami archiwalnych stron (tabelę „tAdresyStron”) pokazuje Rysunek 26.
Pracujemy z plikiem „Internet.xlsx”. Na potrzeby tego przykładu tabela „tWaluty” została wczytana do edytora Power Query tylko jako połączenie. Natomiast tabela „tAdresyStron” została wczytana od edytora, a potem ponownie zaimportowana do Excela na nowym arkuszu. Potrzebne to będzie to uzyskania prawidłowych wyników.
Przekształcenia w tym przykładzie zaczynamy od zaimportowania danych z pojedynczej strony www, czyli na karcie „Dane” klikamy w polecenie „Z sieci Web”, jak pokazuje to Rysunek 27.
Kliknięcie w to polecenie otworzy to okno „Z sieci Web”, gdzie musimy w pole „URL” wkleić podany przez nas wcześniej adres strony www, jak pokazuje to Rysunek 28.
Przy pobieraniu danych z sieci może się pojawić dodatkowe okno uwierzytelnienia. W tym przykładzie wystarczy nam uwierzytelnienie anonimowe, ponieważ nie ma potrzeby do logowania się do strony NBP.
Potwierdzenie adresu www wykonujemy, klikając w przycisk „OK”. Otworzy to okno nawigatora, gdzie będziemy mogli wybrać, skąd dokładnie chcemy pobrać dane ze wskazanej strony. Przeważnie są to różne tabele, ale od pewnego czasu jest dostępna również możliwość pobrania całego kodu HTML albo wyświetlanego tekstu. Jednak te dwie opcje wymagają dużo więcej oczyszczania danych. W tym przykładzie wystarczy, że pobierzemy dane z Tabeli 1. Są tam wszystkie informacje, jakich potrzebujemy. Wystarczy zaznaczyć tę tabelę, a następnie kliknąć w przycisk „Przekształć dane”, jak pokazuje to Rysunek 29.
Zaimportuje to dane do edytora Power Query. Po zaimportowaniu danych możemy zmienić nazwę zapytania na „PojedynczyDzień”. Następnie potrzebujemy rozdzielić dane w kolumnie „Kod waluty”. Chcemy, żeby liczba i faktyczny kod waluty trafiły do osobnych kolumn. Żeby to zrobić, wystarczy, że podzielimy dane po spacji. Do tego potrzebujemy zaznaczyć kolumnę „Kod waluty”, a następnie na karcie „Przekształć” rozwinąć polecenie „Podziel kolumny” i wybranie opcji „Według ogranicznika”, jak pokazuje to Rysunek 30.
Otworzy to okno „Podziel kolumnę po ograniczniku”, gdzie automatycznie powinna zostać wybrana spacja jako ogranicznik. Ponieważ w kolumnie „Kod waluty” występuje zawsze tylko pojedyncza spacja, nie musimy zmieniać również żadnych innych opcji, czyli okno „Podziel kolumnę po ograniczniku” powinno wyglądać tak, jak pokazuje to Rysunek 31.
Jeśli po zatwierdzeniu podziału po spacji Power Query doda dodatkowy krok wykrywający typy danych, należy go usunąć, ponieważ pracuje on na domyślnych nazwach nowych kolumn, a my chcemy zmienić te nazwy. Wystarczy, że w pasku formuły zmienimy domyślne nazwy z numerami na „Ilość waluty” i „Kod waluty”, czyli kod M:
= Table.SplitColumn(#"Changed Type", „Kod waluty”, „Splitter.SplitTextByDelimiter(QuoteStyle.Csv), {„Kod waluty.1", „Kod waluty.2"})
Zamieniamy na:
= Table.SplitColumn(#"Changed Type", „Kod waluty",” Splitter.SplitTextByDelimiter(QuoteStyle.Csv), {„Ilość waluty", „Kod waluty"})
Jeśli wcześniej dodał się automatycznie krok zmiany typu danych, to również po zmianie nazw nowych kolumn w kodzie M ten krok powinien dodać się automatycznie.
Teraz dodajemy filtrowanie po kolumnie „Kod waluty”. Wystarczy, że rozwiniemy opcje filtrowania z nagłówka analogicznie jak w Excelu i wybierzemy tylko pojedynczy kod, np.: AUD. Krok będziemy dopracowywać w pasku formuły, więc wybranie konkretnego kodu nie jest tu istotne. Zanim jednak zmienimy kod M, powinniśmy zamienić zapytanie „tWaluty” na listę. Wystarczy, że rozwiniemy listę zapytań z lewej strony, klikniemy na wybrane zapytanie, a następnie na karcie „Przekształć” klikniemy w polecenie „Konwertuj na listę”, jak pokazuje to Rysunek 32.
Możemy wrócić do zapytania „PojedynczyDzień” i zmienić kod w pasku formuły dla ostatniego kroku. Zamiast sprawdzać, czy wartość w kolumnie „Kod waluty” równa się kodowi AUD będziemy sprawdzać, czy kod z aktualnego wiersza kolumny „Kod waluty” znajduje się na liście „tWaluty”. Oznacza to, że kod:
= Table.SelectRows(#"Zmieniono typ1", each ([Kod waluty] = "AUD"))
Zamieniamy na:
= Table.SelectRows(#"Zmieniono typ1", each List.Contains(tWaluty, [Kod waluty]))
Po tej zmianie powinien pojawić się komunikat „Wymagane są informacje dotyczące prywatności danych”. Klikamy w przycisk „Kontynuuj”, wyświetlający się obok niego. W oknie, które się wyświetli zaznaczmy checkbox „Ignoruj kontrole”, jak pokazuje to Rysunek 33, i zapisujemy zmiany przyciskiem Zapisz.
Po zapisaniu ustawień poziomów prywatności powinien pokazać się poprawny wynik filtrowania, czyli w naszym przykładzie trzy waluty (Rysunek 26).
Parametryzacja zapytania i tworzenie funkcji
Teraz możemy przejść do parametryzacji zapytania analogicznie jak w poprzednim przykładzie, czyli w pierwszej kolejności klikamy w koło zębate obok kroku „Źródło”. Otworzy to okno „Z sieci Web”, gdzie kopiujemy adres strony z pola „Adres URL”, a następnie na liście rozwijanej obok wybieramy „Nowy parametr”, jak pokazuje to Rysunek 34.
Okno „Zarządzaj parametrami”, które się otworzy, wypełniamy zgodnie z Rysunkiem 35.
Zatwierdzamy nowy parametr, klikając przycisk „OK” najpierw w oknie „Zarządzaj parametrami”, a następnie w oknie „Z sieci Web”.
Teraz analogicznie jak w poprzednim przykładzie (Rysunek 16) zamieniamy zapytanie „PojedynczyDzień” na funkcję. Nowej funkcji nadajemy nazwę „WybraneKursy” (analogicznie jak Rysunek 17). Uzyskamy w ten sposób podobną strukturę jak w poprzednim przykładzie. Pokazuje ją Rysunek 36.
Wywołanie funkcji i przekształcenia końcowe
Możemy teraz przejść do zapytania „KursyWedługDaty” i kliknąć w polecenie „Wywołaj funkcję niestandardową” na karcie „Dodaj kolumnę” (Rysunek 19). Okno „Wywołaj funkcję niestandardową” wypełniamy zgodnie z Rysunkiem 37.
Na koniec wykonujemy czynności podobnie jak w poprzednim przykładzie, czyli:
- Usuwamy na wszelki wypadek błędy (Rysunek 22).
- Usuwamy kolumnę „Adres strony”.
- Rozwijamy kolumnę z wynikami funkcji (Rysunek 23).
- Na karcie „Narzędzia główne” rozwijamy polecenie „Zamknij i załaduj” i wybieramy opcję „Zamknij i załaduj do”.
- W oknie „Importowanie danych” wybieramy opcję „Utwórz tylko połączenie” (Rysunek 24). Opcja ta dotyczy tylko utworzonego przez nas zapytania „PojedynczyDzień”. Ponieważ zapytanie „KursyWedługDaty” zostało wcześniej zaimportowane do Excela, teraz powinno się automatycznie odświeżyć (należy pamiętać, że pobieranie danych ze stron internetowych może zająć więcej czasu).
Na zakończenie, jako test, możemy zmienić kody walut w tabeli „tWaluty”, a następnie odświeżyć zapytanie „KursyWedługDaty” i upewnić się, że teraz wczytało inne kursy walut.
Możesz zobaczyć ten artykuł, jak i wiele innych w naszym portalu Controlling 24. Wystarczy, że klikniesz tutaj.
