Czyli trochę o tekstach i datach w VBA
Jakiś czas temu, w tym wpisie, opisywałam makro, które zapisywało plik Excela jako PDF w tym samym katalogu, co ten plik Excela. Samo zapisywanie jako PDF sztuką nie było – można to sobie nawet nagrać 😉 – jednak już określenie miejsca zapisu pliku stanowiło większe wyzwanie.
Dziś z kolei rozbuduję to makro tak, aby jeszcze zapisywało ów PDF z nazwą zawierającą dzisiejszą datę. Albo tylko miesiąc, jak kto woli – metoda będzie taka sama.
Poprzednie rozwiązanie (dokładnie opisałam je tutaj, łącznie z tworzeniem nowego modułu), które zapisywało plik w tym samym folderze, pod nazwą zawierającą nazwę klienta, wyglądało 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
Teraz tylko trochę je zmodyfikujemy. Modyfikacja będzie polegała na dodaniu zmiennej NazwaPliku, która będzie przechowywała ciąg tekstowy oznaczający nazwę pliku oczywiście. Użyję tej zmiennej po to, aby kod był bardziej czytelny. Linijka z deklaracjami zmiennych wygląda więc teraz tak:
Dim Sciezka As String, Klient As String, NazwaPliku As String
Następnie trzeba określić wartość nowej zmiennej, czyli ustalić, jak ma się nazywać plik. To, że nazywa się jak klient jest OK, więc zostawiam. Dodam natomiast dzisiejszą datę. Posłuży mi do tego funkcja Date. Jest to visualbasicowy odpowiednik excelowej funkcji DZIŚ.
Dodatkowo, żeby data została odpowiednio sformatowana (chcę, aby wyświetlony był najpierw rok, potem miesiąc a na końcu dzień, bez żadnych separatorów) – wrzucę ją do funkcji Format. I znów – jest to visualbasicowy odpowiednim excelowego TEKSTu. Ten fragment kodu wygląda tak:
NazwaPliku = Sciezka & Klient & Format(Date, "yyyymmdd") & ".pdf"
Drugim argumentem funkcji Format jest format naszej daty. Jeśli chcesz ją wyświetlić w jakiś inny sposób – tutaj jest miejsce na modyfikację. MOżesz np. wyświetlić tylko miesiąc i wtedy wpiszesz: „mm” itd.
Na koniec to już tylko podstawienie naszej nazwy do fragmentu generującego PDF. Całość kodu wygląda tak:
Sub MojPDF() Dim Sciezka As String, Klient As String, NazwaPliku As String Sciezka = ThisWorkbook.Path & "\" Klient = ActiveSheet.Range("Klient").Value If Klient = "" Then Klient = "Klient" NazwaPliku = Sciezka & Klient & Format(Date, "yyyymmdd") & ".pdf" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ NazwaPliku, _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=True End Sub
Pamiętaj koniecznie, aby plik z tym makrem zapisać jako plik z obsługa makr, czyli xlsm lub xlsb.
I to tyle! Mam nadzieję, że przyda Ci się zaprezentowana rozwiązanie. Jeśli znasz kogoś, komu też może się przydać – mam do Ciebie gorącą prośbę: udostępnij proszę mu/jej ten wpis mailem, na Facebooku czy w Messengerze. Razem będziemy szerzyć excelową wiedzę i pokażemy, że nie taki Excel straszny ;).
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 :).
I plik xlsm do pobrania (pamiętaj o włączeniu makr!):
MalinowyExcel VBA Zapisz plik jako PDF z dzisiejszą datą w nazwie dw.zip
I jeszcze wersja wideo:
Enjoy!
W sytuacji gdy chcemy dla jednego klienta zrobić klika ofert, niestety pojawia się problem gdyż plik utworzony dzisiejszego dnia zawsze zastępuje poprzedni. Musimy zmieniać nazwy plików ręcznie. Czy jest możliwość dodawania numeru do pliku w przypadku gdy plik o takiej nazwie już istnieje w folderze?
Hmmmm, może łatwiej będzie po prostu zamiast tylko dzisiejszej daty dołożyć też godzinę. Wtedy zamiast Date trzeba byłoby użyć Now, a format zastosować np. taki: yyyymmdd_hhmmss.
Może tak?
Dobry pomysł ale rozwiązałem to w innny sposób. Rozszerzyłem nazwę do 3 komórek.
Teraz mam inny problem. W jaki sposób ustawić zapis pdf tylko określonych kolumn. Chciałbym ukryć kilka kolumn, które są w środku dokumentu dlatego ustawienie obszaru wydruku nie jest możliwe.
Hej, może w takim razie niech makro jeszcze dodatkowo ukrywa te kolumny, których nie chcemy drukowąć? Wydaje mi się to najprostszym rozwiązaniem 🙂
Rozwiązałem to w inny sposób.
Ukrywanie kolumn ma sens przy prostym układzie, w którym mamy tylko kilka kolumn. W przypadku gdy chcemy by część danych była widoczna, nie możemy ukryć całej kolumny. Jedynym wyjściem jest zastosowania paru trików z formatowaniem warunkowym aktywnym tylko na wydruku i w moim przypadku również po zapisaniu pliku z ofertą.
Pozdrawiam
Jesiol, super, fajnie, że znalazłeś rozwiązanie!