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:
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
4. następnie z listy w okienku Przypisywanie makra wybierz to makro, które chcesz uruchomić po kliknięciu na ten obrazek/przycisk.
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ć:
- Zapisz plik jako PDF z dzisiejszą datą w nazwie (VBA)
- Zapisz PDF z taką samą nazwą co plik Excela (VBA)
Witam’ Czy da się wklejeniem do pdf tylko określone kolumny np „AB’C” pomimo że jest ich znacznie więcej.
Hej, ja bym tutaj zastosowała obszar wydruku. PDF i VBA wydrukują to, co będzie w tym obszarze, czyli te wybrane kolumny 🙂
Do zapisywania pdfa w lokalizacji Excela i o tej samej nazwie używam skrótu Alt+p,e,a
Super!
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ć.
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?
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.
Hej,
myślę, że trzeba byłoby drukować tablicę arkuszy w tym wypadku. Czyli efekt zaznaczenia (z Shiftem) tych trzech arkuszy :).
A jest sposób na to, żeby wygenerowany pdf był zabezpieczony przed edycją? Jakiś parametr przy Export?