Czyli wystarczy mała podmianka w kodzie
Prawie dwa lata temu napisałam artykuł, gdzie pokazywałam jak z pliku Excela wygenerować plik PDF i zapisać go pod taką nazwą, jak wartość wybranej komórki w arkuszu. Wszystko to za pomocą przycisku. Napisałam w tym celu makro, które szczegółowo omówiłam w tym artykule.
Niedawno zapytaliście mnie jednak, jak zrobić, aby wygenerowany plik nazywał się dokładnie tak samo, jak plik Excela, z którego powstał. Brzmi strasznie, ale w rzeczywistości jest prościutkie. Wymaga bowiem jednej małej modyfikacji w kodzie i ją właśnie opiszę w tym artykule.
Formatka wygląda identycznie, jak w poprzednim artykule:
Do dzieła!
Generowanie PDF z Excela – poprzedni kod
Dla przypomnienia wkleję tutaj kod, który będę teraz modyfikować. Oto on:
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
BTW: Powyższe makro jest przypisane do przycisku, co dokładnie opisałam we wspomnianym artykule.
Wystarczy nam jedna zmienna
Poprzednie makro pobierało nazwę klienta z komórki D3, która była nazwana jako Klient. Teraz jest nam to niepotrzebne. Zarówno ścieżkę dostępu do pliku i jego nazwę pobierzemy bowiem za pomocą innej właściwości. Usuńmy więc 3 linijki:
- deklarację zmiennej Klient,
- przypisanie do niej wartości,
- i if-a, sprawdzającego wartość zmiennej Klient.
Ma powstać coś takiego:
Sub MojPDF() Dim Sciezka As String Sciezka = ThisWorkbook.Path & "\" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ Sciezka & Klient & ".pdf", _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=True End Sub
Modyfikacja zmiennej i nowa właściwość obiektu ThisWorkbook
Teraz zmodyfikujemy zmienną Sciezka. Do tej pory pobierała ona tylko ścieżkę dostępu do pliku Excela. Teraz pobierze tę ścieżkę, ale też nazwę pliku. W tym celu skorzystamy z właściwości FullName obiektu ThisWorkbook. Tak:
Sciezka = ThisWorkbook.FullName
Zwraca ona niestety też rozszerzenie pliku, czyli np.:
C:\MalinowyExcel Zapisz PDF z taką samą nazwą co Excel.xlsb
Trzeba się tego pozbyć, bo w końcu chcemy PDF, a nie xlsb.
Usuń excelowe rozszerzenie pliku
A teraz pozbędziemy się rozszerzenia excelowego z naszej nazwy, czyli tego: .xlsb. Zrobimy to dopisując taki kod:
Sciezka = Left(Sciezka, Len(Sciezka) - 5)
W efekcie dostaniemy taką wartość zmiennej Nazwa:
C:\MalinowyExcel Zapisz PDF z taką samą nazwą co Excel
I to już prawie koniec.
Generowanie PDF z nazwą pliku Excela
Wykorzystamy teraz kod, który już wcześniej mieliśmy, tylko zamiast zmiennej Klient wstawimy zmienną Sciezka i usuniemy wystąpienie zmiennej Klient. Reszta jest OK.\
Całość wygląda tak.:
Sub MojPDF() Dim Sciezka As String, Nazwa As String Sciezka = ThisWorkbook.FullName Sciezka = Left(Sciezka, Len(Sciezka) - 5) ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ Sciezka & ".pdf", _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=True End Sub
A jeśli chcesz, aby plik PDF został zapisany dodatkowo z dzisiejszą datą – zajrzyj do tego wpisu.
Pamiętaj, aby zapisać gotowy plik z obsługą makr (*xlsm) lub binarny (*xlsb). Załączony do tego artykułu plik ma właśnie to drugie rozszerzenie.
Jeśli arkusz się brzydko drukuje – ustaw odpowiednie opcje drukowania. Polecam tutaj obszar wydruku i wpasowanie w strony.
A uruchamiając plik pamiętaj, aby włączyć makra.
Chcesz nauczyć się pisać makra w Excelu?
A jeśli chcesz nauczyć się pisać makra od zera – koniecznie zapisz się na listę zainteresowanych moim kursem wprowadzającym do pisania makr Excel w codziennej pracy cz. 3.! Zapis jest bezpłatny, podobnie jak cotygodniowe artykuły, które lądują prosto na Twojego maila :).
Tutaj znajdziesz plik do pobrania:
MalinowyExcel Zapisz PDF z taką samą nazwą co Excel.zip
I wersję wideo, gdzie pokazuję po kolei co zmienić w kodzie:
Powiązane produkty
- Nagrywanie makr – dzięki tej lekcji dowiesz się jak w sprytny sposób nagrywać całkiem inteligentne makra
Witam. Nie wiem czy to odpowiednie miejsce ale mam problem w tym temacie.
Generuję proste macro
Sub Makro1()
’
’ Makro1 Makro Zestaw do zapisu pdf
’
’
Sheets(„CZYNSZE”).Select
ActiveWindow.SelectedSheets.PrintOut From:=5, To:=5, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=14, To:=14, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=18, To:=18, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=19, To:=19, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=20, To:=20, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=21, To:=21, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=27, To:=27, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=31, To:=31, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=32, To:=32, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=33, To:=33, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=34, To:=34, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=35, To:=35, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
ActiveWindow.SelectedSheets.PrintOut From:=40, To:=40, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
End Sub
do arkusza które drukuje z 65 stron tylko te potrzebne i w przypadku drukarki jest wszystko ok.
Pozostałe strony w bliźniaczym macro drukuję jako druk „Microsoft Print to pdf” i przy każdej stronie mam zapytanie jaką nazwę nadać plikowi pdf.
Czy można w poszczególnych linijkach podać gotowe nazwy dla plików z gatunku: strona 1 to plik 001.pdf,
strona 2 to plik 002.pdf,
strona 5 to plik 005.pdf,
itd.
Z góry bardzo dziękuję i pozdrawiam
Dzień dobry,
może warto spróbować komendy:
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
Sciezka & Klient & „.pdf”, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
W powyższym artykule pokazuję też jak zmienić nazwę pliku (Klient) 🙂
Cześć,
A jak ułożyć kod, który blokował będzie możliwość zapisania pdf z tą samą nazwą? Aktualnie mi nadpisuje i poprzednia wersja zostaje usunięta… Teoretycznie wiem, a praktycznie nie wychodzi 🙁