fbpx

Zapisz PDF z taką samą nazwą co plik Excela (VBA)

10.03.2020 | Analizy sprzedaży, ECP3, Makra VBA

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:

Formatka

Formatka

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

 

 

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

3 komentarze

  1. 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

    Odpowiedz
    • 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) 🙂

      Odpowiedz
  2. 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 🙁

    Odpowiedz

Wyślij komentarz

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