Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA Excel - Zapisywanie arkuszy jako PDF

alphazone 08 Cze 2016 11:39 3597 25
  • #1 08 Cze 2016 11:39
    alphazone
    Poziom 9  

    Witam,

    Szczerze mówiąc zupełnie nie kumam VBA, a potrzebuje napisać makro, które bardzo ułatwi mi życie. Dla kogoś kto cokolwiek z tego rozumie to pewnie pestka, a ja będę wdzięczny za pomoc w tym zakresie.

    Potrzebuję makro które będzie się uruchamiać na żądanie (np skrót klawiszowy) w otwartym arkuszu excel, który ma kilkanaście arkuszy. Nazwa arkusza będzie odpowiadać nazwie folderu, w którym będzie zapisywany każdy arkusz (zakładamy, że zarówno foldery już istnieją). I teraz tak po uruchomieniu makra powinno zapisać wszystkie arkusze (bez pierwszego) jako plik pdf, o nazwie "cennik", w katalogu o nazwie odpowiadającej nazwie arkusza - ścieżka D:/ścieżka w której zapisany jest dokument XLS/"nazwa arkusza".

    pzdr
    Krzysiek

    1 25
  • #3 08 Cze 2016 18:34
    marcinj12
    Poziom 40  

    Jaka to wersja Excela?

    1
  • #4 08 Cze 2016 19:31
    alphazone
    Poziom 9  

    to jest Excel 2010

    0
  • #5 08 Cze 2016 21:21
    marcinj12
    Poziom 40  

    Och, akurat w tych wersjach powinno być w miarę prosto. U mnie na 2007 działa takie coś, zakładając że 2010 ma taką samą składnię, też powinno:

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    Całość możesz umieścić w module, a przypisanie do skrótu klawiszowego sobie ustawisz przy rejestracji makra - na początku jest tam okienko.

    0
  • #6 09 Cze 2016 12:14
    alphazone
    Poziom 9  

    No więc wpisałem coś takiego ale pojawia mi sie komunikat Run time error 424 - Object required :(

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    0
  • #7 09 Cze 2016 12:41
    marcinj12
    Poziom 40  

    W której linijce?

    0
  • #8 09 Cze 2016 13:52
    alphazone
    Poziom 9  

    w drugiej:
    If ws.Name <> Arkusz2.Name Then

    0
  • #9 09 Cze 2016 18:12
    marcinj12
    Poziom 40  

    Arkusz1.Name to był przykład, bo u mnie akurat tak się arkusz nazywał.
    To ta nazwa przed nawiasem, z okienka z edytora VBA, po lewej stronie.
    U Ciebie pewnie inaczej się on nazywa.

    0
  • #10 10 Cze 2016 09:41
    alphazone
    Poziom 9  

    No tak tylko jak pod "nazwę" podstawię nazwę arkusza - mnie jest to cennik to mi wyrzuca "Compile error - Method or data member not found" i podkreśla właśnie nazwę arkusza:(

    1
  • #11 10 Cze 2016 12:11
    marcinj12
    Poziom 40  

    Wrzuć screena z edytora VBA albo jeszcze lepiej plik załącz.

    0
  • #12 10 Cze 2016 15:58
    alphazone
    Poziom 9  

    VBA Excel - Zapisywanie arkuszy jako PDF

    No więc załączam

    0
  • Pomocny post
    #13 10 Cze 2016 18:31
    marcinj12
    Poziom 40  

    No to na załączonym obrazku powinieneś mieć Arkusz3.Name
    Nie wiem, skąd wykombinowałeś to Arkusz3.cennik - tzn. domyślam się skąd, ale tak jest źle.

    0
  • #14 11 Cze 2016 22:54
    alphazone
    Poziom 9  

    no tak teraz jakby działa - wielkie dzięki. A jeszcze jedna sprawa - co zrobić, żeby do nazwy pliku dodać datę?

    Rozumiem, ze za tym fragmentem kodu "Next ws" muszę powtórzyć zapis dla kolejnych arkuszy (ze zmianą nazwy oczywiście;)

    0
  • Pomocny post
    #15 12 Cze 2016 00:47
    marcinj12
    Poziom 40  

    alphazone napisał:
    co zrobić, żeby do nazwy pliku dodać datę?
    Zmień
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    na
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    alphazone napisał:
    Rozumiem, ze za tym fragmentem kodu "Next ws" muszę powtórzyć zapis dla kolejnych arkuszy (ze zmianą nazwy oczywiście;)
    Nie. Makro działa tak, jak chciałeś w pierwszym poście - zapisuje do PDFa wszystkie arkusze oprócz jednego, który wykluczasz w porównaniu ws.Name <> ...

    0
  • #16 13 Cze 2016 14:07
    alphazone
    Poziom 9  

    No tak - wszystko wynika z tego, że nie rozumiem w jaki sposób ten kod działa. Sądziłem, że określamy arkusz od którego zaczyna się zapisywanie, a nie że jest to wykluczenie - ehhhhh. Znasz jakiś przystępny podręcznik taki dla totalnie nie mającego zielonego pojęcia ludka opisujący składnię tego kodu i wyjasnienie najważniejszych poleceń?

    Przy okacji trochę mi sie koncepcja zmieniła - gdybym musiał wykluczyć więcej niż jeden arkusz - to dałoby się?

    0
  • Pomocny post
    #17 13 Cze 2016 14:56
    marcinj12
    Poziom 40  

    alphazone napisał:
    Przy okacji trochę mi sie koncepcja zmieniła - gdybym musiał wykluczyć więcej niż jeden arkusz - to dałoby się?
    Można wykluczać arkusze, można też uwzględnić tylko te z listy...

    Wykluczanie generalnie można zrobić tak:
    - wykluczasz Arkusz1, Arkusz2 i Arkusz3, drukujesz pozostałe
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    - drukujesz Arkusz4, Arkusz5 i Arkusz6, wykluczasz pozostałe:
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    Zamiast Arkusz1.Name etc. możesz wpisać w cudzysłowie wprost nazwę arkusza widoczną w Excelu, np. "Cennik_2016".
    Ja podałem sposób, który wymaga co prawda ustalenia nazwy arkusza w VBA, ale jest później odporny na zmianę nazwy arkusza.

    0
  • #18 15 Cze 2016 12:07
    alphazone
    Poziom 9  

    naprawdę super to działa - jeszcze raz wielkie dzięki, a mogę mieć jeszcze jedną prośbę? okazuje się, że poza pdf, przydałoby sie jeszcze generowanie plików xls. Czy można jakoś zmodyfikować poniższy kod:

    ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=katalog & "\cennik.pdf", Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    Aby wszystkie nie wykluczone arkusze zostały zapisane jako oddzielne pliki xls (tylko zamiast formuł byłyby wartości)?

    0
  • #19 15 Cze 2016 14:09
    marcinj12
    Poziom 40  

    Mają być w starszym formacie .xls czy w nowszym, używanym m.in. w 2010, .xlsx?
    Sam zapis jest względnie prosty, wystarczy żebyś spróbował nagrać makro recorderem proces zapisywania pliku w odpowiednim formacie - powinno wyjść coś podobnego do:

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    które wystarczy dokleić przed/po/zamiast linijki zapisującej do PDF, przy czym stałą ścieżkę zapisu możesz zastąpić dynamiczną nazwą, jak w powyższym przykładzie.

    Wymaganie, żeby zamiast formuł zostały zapisane wartości jest już bardziej złożone. Pytanie, czy możesz sobie pozwolić na zastąpienie formuł wartościami również w pliku źródłowym przed eksportem (łatwo), czy nie (trudniej).

    0
  • #20 15 Cze 2016 14:43
    alphazone
    Poziom 9  

    marcinj12 napisał:
    Wymaganie, żeby zamiast formuł zostały zapisane wartości jest już bardziej złożone. Pytanie, czy możesz sobie pozwolić na zastąpienie formuł wartościami również w pliku źródłowym przed eksportem (łatwo), czy nie (trudniej).


    No właśnie nie mogę dotykać pliku źródłowego - chyba, że do kodu zamieniającego formuły na wartości dopiszemy aby zamykał plik źródłowy bez zapisywania zmian. No chyba, że to to niesie ze sobą jakieś zagrożenie....

    0
  • #21 15 Cze 2016 20:47
    marcinj12
    Poziom 40  

    W sumie to można to w taki sposób rozwiązać:

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    0
  • #22 16 Cze 2016 09:36
    alphazone
    Poziom 9  

    Nie działa ale pewnie to dla tego, że nie dodałem, że w tych arkuszach są pozakładane filtry i pogrupowane kolumny i efekt jest taki, że przy próbie wklejenia zawartości wyrzuca błąd 1004, że metoda PasteSpecial z klasy Range nie powiodła się (dotyczy linijki: .Cells.PasteSpecial Paste:=xlPasteValues)

    0
  • #23 16 Cze 2016 13:24
    marcinj12
    Poziom 40  

    alphazone napisał:
    ie działa ale pewnie to dla tego, że nie dodałem, że w tych arkuszach są pozakładane filtry i pogrupowane kolumny
    Pewnie tak... Spróbuj przed ws.Copy dać
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    choć nie wiem, czy na grupowanie kolumn to pomoże.

    0
  • #24 17 Cze 2016 09:05
    alphazone
    Poziom 9  

    Człowieku Ty jesteś jakimś magikiem normalnie!!!! dzięki - działa perfekto, jeszcze tylko jednej drobnej jak sądzę poprawki potrzebuje. W ty, nowym pliku xls przydałoby się podmienić nazwę (obecnie kopiuje z pierwotnego xlsx) na np "Arkusz1".

    I tak sobie myślę, przy przenoszeniu do nowego pliku xlsx kopiuje całość - a mógłby kopiować tylko to co jest aktywne (bez tego co ukrywaję filtry)?

    Przy okazji czemu:
    Worksheets("Nazwa arkusza").Name = "nowa nazwa arkusza", działa, a
    Worksheets(Arkusz1.Name).Name = "nowa nazwa arkusza", nie działa?

    0
  • #25 19 Cze 2016 00:26
    marcinj12
    Poziom 40  

    alphazone napisał:
    W ty, nowym pliku xls przydałoby się podmienić nazwę (obecnie kopiuje z pierwotnego xlsx) na np "Arkusz1"
    alphazone napisał:
    a mógłby kopiować tylko to co jest aktywne (bez tego co ukrywaję filtry)

    Trzeba kopiować tylko widoczne komórki i wklejać je potem jako wartości i formaty. Wymaga to jednak zmiany sposobu tworzenia nowego arkusza.
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    alphazone napisał:
    Przy okazji czemu:
    Worksheets("Nazwa arkusza").Name = "nowa nazwa arkusza", działa, a
    Worksheets(Arkusz1.Name).Name = "nowa nazwa arkusza", nie działa?
    Bo do arkusza poprzez Worksheets można odwołać się podając jego nazwę (w cudzysłowie) bądź indeks (bez cudzysłowowa).
    Samo odwołanie się poprzez Worksheets(Arkusz1.Name).Name jest nie tyle niepoprawne składniowo, co pozbawione sensu - wszak można od razu się odwołać do Arkusz1.Name = ...

    0
  • #26 19 Cze 2016 13:41
    alphazone
    Poziom 9  

    Działa ale też nie do końca tak jak trzeba - nie przenosi szerokości komórek i formatowania warunkowego. Ale spox poradziłem sobie w inny sposób. Na bazie poprzedniej procedury nagrałem sobie makro, które usuwa zbędne wiersze i zmienia nazwę arkusz i pozamiatane.

    Jeszcze raz wielkie dzięki za pomoc.

    0