Automatyzacja z AI (cz. 1) | Tworzenie skryptów VBA z pomocą ChatGPT

Czy ChatGPT zastąpi księgowych? Nie, ale może im ułatwić życie, i to w obszarach, które dotychczas wymagały naprawdę dobrych relacji z działem IT. Zobacz, jak można wykorzystać AI, by tworzyć makra w Excelu i zaoszczędzić cenny czas.

Technologia rozwija się w niesamowitym tempie, a wraz z nią rośnie ilość danych w naszych organizacjach. Co jeszcze znacząco zwiększyło się w ostatnich latach? Liczba nowych obowiązków wynikających ze zmian w przepisach. Efekt? Stosy dodatkowej, często nudnej oraz żmudnej roboty i góry danych do przetworzenia. Pokażę Wam na przykładach, jak możemy wykonywać te rutynowe i żmudne procesy efektywniej– odpowiednio je automatyzując. Tak, byśmy mogli poświęcić więcej czasu na ciekawsze zadania, które przynoszą konkretną wartość i satysfakcję. Tutaj z pomocą przychodzi generatywna sztuczna inteligencja, dzięki której używając wyłącznie języka naturalnego (a więc bez konieczności programowania) możemy między innymi tworzyć skuteczne makra lub znaleźć inspirację do usprawnień w innych procesach.

Zastosowanie AI w księgowości

Przyjrzyjmy się temu, jak można wykorzystać możliwości ChatGPT, w obszarze księgowości oraz podatków. Podzielmy cykl pracy z danymi w tych obszarach na cztery sekcje:

1. Gromadzenie danych

Dzięki ChatGPT możemy szybciej tworzyć intuicyjne i czytelne szablony do zbierania wysokiej jakości danych. Dane możemy przykładowo pozyskiwać poprzez formularze, kwestionariusze, czy czytelne i łatwe do wypełnienia lub zmapowania tabele.

2. Oczyszczanie danych

W tym kroku skrypty wygenerowane przez AI mogą pomóc w usunięciu duplikatów, uzupełnianiu brakujących informacji, standaryzacji formatów czy usuwaniu znaków specjalnych, nieakceptowanych przez nasze systemy na dalszych etapach.

3. Przetwarzanie danych

Po zebraniu i oczyszczeniu danych skrypty generowane przez AI mogą pomóc nam łączyć dane, tworzyć raporty finansowe, czy dostosować pliki do struktury wymaganej przez nasz system finansowo-księgowy.

4. Weryfikacja

Rosnące skomplikowanie przepisów powoduje, że coraz więcej transakcji wymaga bardziej rozbudowanych analiz. Skrypty generowane przez AI mogą pomóc księgowym, poprzez automatyczne sprawdzanie przekroczenia progów, czy spełnienia określonych warunków. Z pomocą skryptów możemy otrzymywać listę transakcji wymagających dalszej pogłębionej analizy.

Przykład praktyczny – wygodne łączenie danych

Pokażmy na prostym przykładzie, jak za pomocą ChatGPT możemy stworzyć skrypt w języku Visual Basic for Applications (VBA), który połączy dane z wielu plików. Zadanie jest następujące: połączmy dane z kilkudziesięciu plików i tabel w jeden plik. Mamy 24 pliki, 48 tabel, tysiące wierszy. Spróbujmy wspólnie z ChatGPT stworzyć skrypt w języku Visual Basic for Applications, który połączy te dane za pomocą jednego kliknięcia.

1. Określenie potrzeb i założeń

Rozpocznijmy od analizy procesu, który chcemy zautomatyzować i określmy nasze cele. Opiszmy to jak najdokładniej.

  • Połączmy wiele plików zapisanych w formacie xlsx zawierających po 2 zakładki z danymi w jeden zbiorczy plik do dalszej analizy.
  • Struktura plików wejściowych jest stała– zawierają one 2 zakładki z 10-kolumnowymi tabelami. Nagłówki tabel znajdują się w pierwszym wierszu.
  • Skorzystajmy z narzędzi zawartych już w pakiecie Microsoft 365.
  • Pliki do połączenia znajdują się w lokalizacji [C:\Przykłady\1\Input].
  • Ilość i nazwy plików są zmienne.
  • Nazwy zakładek w plikach są stałe: [VAT naliczony] oraz [VAT należny].
  • Łączenie danych będzie wykonywane okresowo na zmiennej ilości plików.

Aby zwiększyć szansę na otrzymanie już w pierwszej odpowiedzi w 100% działającego skryptu, warto pamiętać o kilku istotnych rzeczach. Przede wszystkim precyzyjnie określamy założenia, strukturę danych wejściowych oraz oczekiwany format wyjściowy.

2. Tworzenie promptu

Na podstawie zebranych informacji tworzymy prompt, czyli zapytanie do ChatGPT. Doprecyzujmy w nim, że podczas łączenia tabel chcemy, aby nazwy nagłówków nie były duplikowane oraz by program pytał użytkownika, gdzie chce zapisać wygenerowany plik. Zapamiętajmy, że ogólne i niejednoznaczne określenia mogą prowadzić do generowania mniej precyzyjnych odpowiedzi oraz zmniejszać szansę na otrzymanie satysfakcjonującego rezultatu. Oto treść promptu wraz z odpowiedzią modelu:

TREŚĆ PROMPTU

Chcemy połączyć wiele plików [xlsx] w jeden zbiorczy plik. Wykorzystajmy VBA z pakietu Microsoft 365 . Oto założenia i szczegóły:

1. Pliki umieszczone są w folderze [C:\Przykłady\1\Input].
2. Liczba plików jest zmienna.
3. W każdym z plików są dwie zakładki o nazwach [VAT naliczony] oraz [VAT należny].
4. Liczba kolumn w obu zakładkach jest stała [10 kolumn].
5. Nazwy kolumn znajdują się w wierszu numer 1 w plikach wejściowych. W pliku wyjściowym skopiuj nazwy kolumn z pierwszego pliku wejściowego i umieść nazwy kolumn tylko w pierwszym wierszu w obu zakładkach w pliku wyjściowym.
6. W pliku wyjściowym chcemy mieć również dwie oddzielne zakładki [VAT naliczony] oraz [VAT należny]. Ma być w niej umieszczona w każdym z wierszy nazwa pliku, z którego dane zostały pobrane.
7. W jedenastej kolumnie w pliku wyjściowym dodaj kolumnę o nazwie [Okres VAT].
8. Plik roboczy do łączenia danych będzie używany co miesiąc z nową paczką plików.
9. Po skończeniu tworzenia pliku wyjściowego pytaj użytkownika, gdzie zapisać dany plik.

ODPOWIEDŹ MODELU


Aby połączyć wiele plików XLSX w jeden zbiorczy plik przy użyciu VBA w pakiecie Microsoft 365, musimy stworzyć makro, które będzie spełniać podane założenia. Poniżej znajduje się szczegółowy kod VBA, który realizuje ten cel:

1. Otwórz Excel i przejdź do edytora VBA (Alt + F11).
2. Przejdź do ThisWorkbook (kliknij dwukrotnie na "ThisWorkbook" w "VBAProject").
3. Wklej poniższy kod do ThisWorkbook

Sub PolaczPliki()
    Dim FolderPath As String
    Dim outputWorkbook As Workbook
    Dim inputWorkbook As Workbook
    Dim outputSheet1 As Worksheet
    Dim outputSheet2 As Worksheet
    Dim inputSheet1 As Worksheet
    Dim inputSheet2 As Worksheet
    Dim FileName As String
    Dim LastRow As Long
    Dim lastRowOut1 As Long
    Dim lastRowOut2 As Long
    Dim okresVAT As String
    Dim SavePath As String
    Dim i As Integer
   
    ' Ścieżka do folderu z plikami wejściowymi
    FolderPath = "C:\Przykłady\1\Input\"
   
    ' Utworzenie nowego skoroszytu wynikowego
    Set outputWorkbook = Workbooks.Add
    Set outputSheet1 = outputWorkbook.Sheets(1)
    outputSheet1.Name = "VAT naliczony"
    Set outputSheet2 = outputWorkbook.Sheets.Add(After:=outputWorkbook.Sheets(1))
    outputSheet2.Name = "VAT należny"
   
    ' Pobranie listy plików w folderze
    FileName = Dir(FolderPath & "*.xlsx")
   
    ' Inicjalizacja flagi kolumn nagłówków
    Dim headerSet As Boolean
    headerSet = False
   
    ' Przetwarzanie każdego pliku
    Do While FileName <> ""
        Set inputWorkbook = Workbooks.Open(FolderPath & FileName)
       
        ' Pobranie zakładek z pliku wejściowego
        Set inputSheet1 = inputWorkbook.Sheets("VAT naliczony")
        Set inputSheet2 = inputWorkbook.Sheets("VAT należny")
       
        ' Ustawienie nagłówków w pliku wyjściowym (jeśli jeszcze nie ustawione)
        If Not headerSet Then
            For i = 1 To 10
                outputSheet1.Cells(1, i).Value = inputSheet1.Cells(1, i).Value
                outputSheet2.Cells(1, i).Value = inputSheet2.Cells(1, i).Value
            Next i
            outputSheet1.Cells(1, 11).Value = "Okres VAT"
            outputSheet2.Cells(1, 11).Value = "Okres VAT"
            headerSet = True
        End If
       
        ' Skopiowanie danych z zakładki "VAT naliczony"
        LastRow = inputSheet1.Cells(inputSheet1.Rows.Count, 1).End(xlUp).Row
        lastRowOut1 = outputSheet1.Cells(outputSheet1.Rows.Count, 1).End(xlUp).Row + 1
        inputSheet1.Range("A2:J" & LastRow).Copy Destination:=outputSheet1.Range("A" & lastRowOut1)
        outputSheet1.Range("K" & lastRowOut1 & ":K" & lastRowOut1 + LastRow - 2).Value = FileName
       
        ' Skopiowanie danych z zakładki "VAT należny"
        LastRow = inputSheet2.Cells(inputSheet2.Rows.Count, 1).End(xlUp).Row
        lastRowOut2 = outputSheet2.Cells(outputSheet2.Rows.Count, 1).End(xlUp).Row + 1
        inputSheet2.Range("A2:J" & LastRow).Copy Destination:=outputSheet2.Range("A" & lastRowOut2)
        outputSheet2.Range("K" & lastRowOut2 & ":K" & lastRowOut2 + LastRow - 2).Value = FileName
       
        inputWorkbook.Close SaveChanges:=False
        FileName = Dir
    Loop
   
    ' Pytanie użytkownika o miejsce zapisu pliku wynikowego
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Zapisz plik wynikowy"
        .FilterIndex = 1
        If .Show = -1 Then
            SavePath = .SelectedItems(1)
            outputWorkbook.SaveAs FileName:=SavePath
        End If
    End With
   
    outputWorkbook.Close SaveChanges:=True
   
    MsgBox "Plik został zapisany jako " & SavePath
  
End Sub


Wyjaśnienie:
Deklaracja zmiennych: Deklarujemy zmienne potrzebne do przechowywania ścieżek, nazw plików, skoroszytów i arkuszy.
Pobieranie ścieżki i nazwy pliku wyjściowego: Użytkownik jest pytany o lokalizację i nazwę pliku wyjściowego.
Tworzenie nowego pliku wyjściowego: Tworzony jest nowy skoroszyt z dwoma arkuszami "VAT naliczony" i "VAT należny".
Przetwarzanie plików w folderze: Pętla przechodzi przez wszystkie pliki XLSX w folderze, otwierając je i kopiując odpowiednie dane do pliku wyjściowego.
Kopiowanie nagłówków: Nagłówki kolumn są kopiowane tylko raz, z pierwszego pliku wejściowego.
Kopiowanie danych: Dane są kopiowane do odpowiednich arkuszy w pliku wyjściowym, a nazwa pliku źródłowego jest dodawana do jedenastej kolumny.
Zamknięcie plików i zapisanie pliku wyjściowego: Plik wyjściowy jest zapisywany w lokalizacji wybranej przez użytkownika.

Upewnij się, że masz odpowiednie uprawnienia do odczytu i zapisu plików w określonych lokalizacjach oraz że wszystkie pliki są zgodne z założeniami (tj. mają odpowiednie arkusze i nagłówki).

3. Weryfikacja

Przed wprowadzeniem pierwszego kodu do skoroszytu Excela, należy najpierw dodać do wstążki kartę Deweloper. Aby to zrobić, należy:

  1. Na karcie Plik przejść do pozycji Opcje oraz Dostosowywanie Wstążki.
  2. W obszarze Dostosowywanie Wstążki oraz Karty główne zaznaczyć pole wyboru Deweloper.

Po aktywacji zakładki dewelopera, aby otworzyć edytor VBA, wystarczy skorzystać ze skrótu klawiszowego Alt + F11. Kod wprowadzamy w głównym oknie edytora.

Po wprowadzeniu kodu możemy zamknąć edytor VBA. By uruchomić makro należy:

  1. Kliknąć pozycję Deweloper.
  2. Kliknąć pozycję Makra
  3. Wybrać odpowiednią nazwę makra i kliknąć przycisk uruchom.

Po uruchomieniu makra i wskazaniu lokalizacji do zapisania pliku otrzymałem następujący komunikat:

Spójrzmy jak wygląda nasz plik wyjściowy:

Makro zadziałało zgodnie z oczekiwaniami i nie wymagało żadnych zmian w kodzie, choć nie jest to oczywistością. Czasami wygenerowany przez ChatGPT kod może być wadliwy i nie zadziałać. Wówczas należy opisać błąd i poprosić model o poprawienie błędu. Zazwyczaj po maksymalnie kilku iteracjach, błąd zostaje zlokalizowany i naprawiony. Uzyskaliśmy plik wyjściowy z połączonymi danymi w dwóch zakładkach dotyczących VAT naliczonego oraz VAT należnego, z dodatkową kolumną [Okres VAT]. Szczegółowe opisanie naszych wymagań oraz założeń w promptcie, w tym informacji o ścieżkach, nazwach zakładek i strukturze plików pozwoliło uzyskać działające makro.

4. Dodawanie kolejnych funkcjonalności

Po połączeniu plików, możemy dodawać kolejne elementy automatyzujące proces. Na przykład ChatGPT może stworzyć skrypt generujący plik z listą transakcji spełniających zadane przez nas kryteria. Omówmy to na przykładzie transakcji objętych mechanizmem podzielonej płatności. Obowiązek zastosowania tego mechanizmu mają podatnicy VAT, którzy:

Mechanizm podzielonej płatności musi być, stosowany jeśli choć jedna z pozycji na fakturze, której całkowita wartość brutto przekracza 15 tys. zł, dotyczy towarów lub usług wrażliwych.

By otrzymać listę transakcji spełniających powyższe warunki, moglibyśmy zdefiniować w promptcie kiedy dana transakcja powinna się na niej znaleźć. Patrząc na strukturę pliku moglibyśmy określić, że chcemy otrzymać pozycje spełniające następujące warunki dla poszczególnych wierszy:

  • W kolumnie G jest wartość równa 1 (Transakcja jest oznaczona kodem GTU 02, który obejmuje towary wrażliwe).
  • Suma wartości pozycji w kolumnach od I do J jest większa od 15 tys. zł.

Analogiczne podejście możemy zastosować do tworzenia skryptów weryfikujących i wyszukujących pozycje spełniające inne określone przez nas warunki.

Podsumowanie

Jeśli dopiero zaczynasz przygodę z tworzeniem makr, warto zacząć od prostych przykładów i stopniowo przechodzić do bardziej złożonych zadań. Może chcesz, aby makro tworzyło nowy plik z wybranymi zakładkami i zawierało wartości zamiast formuł? Albo potrzebujesz makra, które kopiuje dane z jednego pliku do drugiego? A może chcesz automatycznie tworzyć plik PDF i zapisywać go w określonym miejscu? Potencjał generatywnej sztucznej inteligencji w księgowości jest ogromny. Jej niesamowitą zaletą jest to, że możemy otrzymać rozwiązania idealnie dopasowane do naszych potrzeb. I to wszystko prowadząc rozmowę w języku naturalnym, tak jakbyśmy o wykonanie zadania prosili bardziej doświadczonych kolegę czy koleżankę, a nie model AI. Coś, co jeszcze niedawno było raczej domeną filmów science-fiction, dziś jest na wyciągnięcie ręki.

Marcin Pezowicz

BPO Consultant. Z wykształcenia księgowy oraz automatyk i robotyk. Specjalizuje się w usprawnianiu procesów z obszaru księgowości i podatków.

Podziel się

Może Cię zainteresować