fbpx

Zapisz plik jako PDF w tym samym folderze (VBA)

22.05.2018 | Analizy sprzedaży, ECP3, Makra VBA

Czyli zapisywanie pliku do PDF przyciskiem

Chodzi o to, że mamy plik w Excelu, np. ofertę dla klienta, i chcemy ją zapisać na dysku jako plik PDF. Jest to bardzo prosta czynność, którą spokojnie możemy wykonać ręcznie kilkoma kliknięciami myszki. Natomiast, gdy takich ofert generujemy sporo – zaoszczędzenie nawet tych kilku kliknięć może się okazać zbawienne.

I my właśnie te kilka kliknięć zaoszczędzimy dzięki prostemu makru: po kliknięciu przycisku drukowania, Excel stworzy plik PDF, który zapisze w tym samym katalogu, co sam jest i nazwie go tak, jak nazwa klienta.

Formatka będzie prosta i tak na prawdę nie ma ona kompletnie żadnego znaczenia. I tak będziemy zapisywać do PDF arkusz, czyli ważniejsze będą tutaj Twoje ustawienia wydruku danego arkusza. Ja drukuję obszar wydruku, który mieści się na jednej stronie, jest logo, data wydruku i wyśrodkowanie w poziomie:

Formatka

Formatka

To, co jest istotne, to nazwanie komórki D3 jako Klient. Po tej nazwie bowiem będziemy przywoływali klienta w kodzie VBA.

A sam kod można w dużej mierze nagrać. Konkretnie zapisywanie pliku jako PDF. Po nagraniu otrzymamy taki fragment kodu:

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
 "C\Users\....\MojPDF.pdf", _
 Quality:=xlQualityStandard, _
 IncludeDocProperties:=True, _
 IgnorePrintAreas:=False, _
 OpenAfterPublish:=False

I ścieżka dostępu w nim zawarta będzie stała. My chcemy dynamiczną, w zależności od położenia naszego Excela na dysku. To będzie więc do zmiany.

Do zmiany będzie również nazwa samego PDF’a. Obecnie też jest stała (MojPDF.pdf), a my chcemy, by plik nazywał się tak, jak klient z komórki D3 (nazwana jako Klient).

Parametryzowanie kodu

Będziemy potrzebowali dwóch zmiennych: ścieżka i klient. Obie będą tekstowe i umieszczę je w procedurze MojPDF.

Sub MojPDF()
 Dim Sciezka As String, Klient As String
End Sub

Ścieżka to będzie ścieżka pliku Excela, w którym obecnie się znajdujemy, a klient to wartość komórki o nazwie Klient w aktywnym arkuszu (koniecznie musisz ją nazwać, ponieważ inaczej kod się wykrzaczy):

 Sciezka = ThisWorkbook.Path & "\"
 Klient = ActiveSheet.Range("Klient").Value 

Tak na prawdę pobranie tych danych to połowa sukcesu. Można jeszcze dorzucić sprawdzanie, czy user wpisał nazwę klienta. Jeśli tego nie zrobił, możemy  narzucić mu jakąś nazwę, np. ambitne: “Klient” ;). Oczywiście pomysłów na to zabezpieczenie może być wiele (np. wyskakująca tabliczka z informacją, że nie wpisał klienta i koniec makra). Ja ograniczę się tutaj do wersji najprostszej:

If Klient = "" Then Klient = "Klient"

Teraz wystarczy tylko odpowiednio połączyć zmienne z kodem nagranym przez rejestrator – zamiast sztywnej ścieżki dostępu podpinamy naszą i łączymy ją z nazwą klienta:

 
 ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
 Sciezka & Klient & ".pdf", _
 Quality:=xlQualityStandard, _
 IncludeDocProperties:=True, _
 IgnorePrintAreas:=False, _
 OpenAfterPublish:=True
End Sub

Całość wygląda tak:

Sub MojPDF()
 Dim Sciezka As String, Klient As String
 
 Sciezka = ThisWorkbook.Path & "\"
 Klient = ActiveSheet.Range("Klient").Value

 If Klient = "" Then Klient = "Klient"
 
 ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
 Sciezka & Klient & ".pdf", _
 Quality:=xlQualityStandard, _
 IncludeDocProperties:=True, _
 IgnorePrintAreas:=False, _
 OpenAfterPublish:=True
End Sub

Ostatnia instrukcja: OpenAfterPublish:=True oznacza, że PDF zostanie otwarty zaraz po utworzeniu. Jeśli tego nie chcesz – zmień to na OpenAfterPublish:=False.

Jeśli chcesz, aby plik PDF został zapisany dodatkowo z dzisiejszą datą – zajrzyj do tego wpisu.

Przypisywanie makra do przycisku

Teraz kwestia podpięcia makra do przycisku. Ja lubię przyciski obrazkowe, dlatego na mojej formatce widzicie obrazek, natomiast można oczywiście podpiąć do standardowego formantu formularza (opisywałam to tutaj, tylko wybierałam suwak, a nie przycisk).

Aby przypisać makro do obrazka, czy przycisku:

1. umieść obrazek/przycisk w arkuszu

2. kliknij na niego prawym przyciskiem myszy i…

3. wybierz opcję Przypisz makro

Przypisywanie makra do przycisku cz.1.

Przypisywanie makra do przycisku cz.1.

4. następnie z listy w okienku Przypisywanie makra wybierz to makro, które chcesz uruchomić po kliknięciu na ten obrazek/przycisk.

Przypisywanie makra do przycisku cz.2.

Przypisywanie makra do przycisku cz.2.

5. Zapisz plik jako plik z obsługą makr (*xlsm) lub binarny (*xlsb).

I gotowe! Teraz, jak naciśniesz ten obrazek/przycisk, zostanie uruchomione nasze makro i aktywny arkusz zapisany jako PDF .

 

Powiązane produkty

    • Nagrywanie makr – dzięki tej lekcji dowiesz się jak w sprytny sposób nagrywać całkiem inteligentne makra

 

 Plik do pobrania (pamiętaj o włączeniu makr)

MalinowyExcel Zapisz PDF w tym samym katalogu co Excel dw.xlsm

 

I wersja wideo wpisu:

 

Warto zajrzeć:

 

 

 

Jeżeli chcesz lepiej poznać makra i VBA zapisz się na listę zainteresowanych kursem Excel w codziennej pracy cz. 3! Podczas oczekiwania na kurs będę Ci wysyłała informacje, ciekawostki i excelowe triki. Bezpłatnie! 

Pomogłam Ci? Postaw mi wirtualną kawę! →

Przeczytaj podobne wpisy

Kategorie

9 komentarzy

  1. Witam’ Czy da się wklejeniem do pdf tylko określone kolumny np “AB’C” pomimo że jest ich znacznie więcej.

    Reply
    • Hej, ja bym tutaj zastosowała obszar wydruku. PDF i VBA wydrukują to, co będzie w tym obszarze, czyli te wybrane kolumny 🙂

      Reply
      • Do zapisywania pdfa w lokalizacji Excela i o tej samej nazwie używam skrótu Alt+p,e,a

        Reply
        • Super!

          Reply
  2. Bardzo fajne, ale proszę o informację jak obejść problem wielu “wydruków” na raz. Wyobraźmy sobie, że mamy 100 klientów i dla każdego tworzymy ofertę – a potem automatycznie chcemy 100 ofert w PDF na dysku – samo makro podmieniające dane nie jest problemem, ale w zależności od przypadku już po kilku eksportach Excel zwraca błąd braku zasobów do dokończenia operacji i od tego momentu każdy kolejny PDF jest uszkodzony, a Excela trzeba brutalnie zrestartować.

    Reply
  3. dzień dobry,
    a czy powyższe makro możemy przerobić w taki sposób, żeby przycisk wywołujący makro był w pierwszym aktywnym arkuszu (nazwa: formularz szablon), a dane do drukowania w innym arkuszu o nazwie arkusz do druku?

    Reply
  4. Cześć.

    Czy byłabyś w stanie podpowiedzieć jak zrobić to co opisałaś powyżej, ale w sytuacji, gdy obszar drukowania do pdf mieści się w arkuszach (dla każdego klienta nazwa arkuszy jest taka sama), czyli Arkusz1, Arkusz 2, Arkusz 3.

    Reply
    • Hej,
      myślę, że trzeba byłoby drukować tablicę arkuszy w tym wypadku. Czyli efekt zaznaczenia (z Shiftem) tych trzech arkuszy :).

      Reply
  5. A jest sposób na to, żeby wygenerowany pdf był zabezpieczony przed edycją? Jakiś parametr przy Export?

    Reply

Submit a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *