fbpx

Treść nagłówka lub stopki na wydruku pobierana z komórki

17.06.2019 | Makra VBA

Czyli dynamiczny nagłówek lub stopka

Dziś zadanie będzie proste – chcemy, aby tekst z komórki pojawił się w nagłówku lub w stopce na wydruku, np. niech to będzie nazwa klienta, dla którego drukujemy ofertę czy jakąś informację. Nie chce nam się zmieniać wartości bezpośrednio w nagłówku/stopce, tylko niech pobiera się ona z komórki (a ta przecież może być uzupełniana przez formułę, niekoniecznie przez nas). O tak:

Formatka

Użyjemy do tego zdarzenia skoroszytu, którego jeszcze na blogu nie pokazywałam…

Ponieważ Excel nie ma (niestety) takiej wbudowanej funkcjonalności, a chcemy, żeby cała podmianka treści działa się bez naszego udziału – użyjemy tutaj zdarzenia VBA. Konkretnie BeforePrintczyli przed wydrukowaniem. Jest to zdarzenie skoroszytu.

To makro możemy nawet nagrać, natomiast nagra się mnóstwo śmietnika (inne ustawienia strony), więc napiszę interesujący nas fragment.

A interesuje nas tylko wstawienie odpowiednich danych np. do lewego nagłówka. Czyli przed wydrukowaniem chcemy tak ustawić wartość lewej sekcji nagłówka, aby była ona równa wartości z żółtej komórki  (u mnie nazywa się ona Firma).

Tak wygląda formatka w arkuszu:

Formatka w arkuszu

Formatka w arkuszu

Na mojej formatce użytkownik wybiera firmę z listy rozwijanej w komórce D3 (nazwana jako Firma), na tej podstawie podmieniają się dane na formatce (sposób na to opisywałam w poprzednim wpisie). I to chcemy wydrukować tak, aby właśnie w lewym nagłówku pojawiła się nazwa firmy.

Kod jest bardzo prosty i należy umieścić go w module prywatnym skoroszytu (tutaj opisywałam dokładnie jak to zrobić).

Kod VBA

Całą pracę wykonuje ta linijka kodu:

   ActiveSheet.PageSetup.LeftHeader = Range("Firma").Value

Natomiast ja jeszcze bym chciała, aby takie działanie było tylko dla jednego wybranego arkusza o nazwie Dane. Dorzucę więc warunek, że jeśli aktywny arkusz to Dane – zmienię nagłówek na wartość z komórki Firma.

Wszystko do kupy wygląda tak (pamiętaj tylko, że nazwę zdarzenia Excel sam wpisuje po wybraniu tego zdarzenia z listy! Zobacz w tym wpisie):

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    If ActiveSheet.Name = "Dane" Then
        ActiveSheet.PageSetup.LeftHeader = Range("Firma").Value
    End If
End Sub

A jeśli chcesz wstawić tekst w inne miejsce, niekoniecznie do lewego nagłówka, to wpisz odpowiednie po PageSetup:

NagłówekLewyLeftHeader
ŚrodkowyCenterHeader
PrawyRightHeader
StopkaLewaLeftFooter
ŚrodkowaCenterFooter
PrawaRightFooter

Hehe, i to wszystko :). Jeśli oczywiście robisz ze swoich arkuszy PDF-y (zobacz, jak zrobić to za pomocą makra podpiętego do przycisku) i nadal chcesz, aby podmianka w nagłówku/stopce działa się automatycznie – użyj zdarzenia BeforeSave i wstaw ten sam kod w środek. Kombinować można na różne sposoby, do czego Cię zachęcam!

A tutaj plik do pobrania:

MalinowyExcel Parametryzowanie nagłówków i stopek na wydruku VBA dw.zip

 

I wszystko krok po kroku w wersji wideo na YB:

(film pojawi się wkrótce)

 

 

 

Zapisz się na bezpłatny mailing!

Zapisz się na bezpłatny mailing i otrzymaj bezpłatny e-book „10 najprzydatniejszych trików w Excelu”!

Newsletter Malinowy Excel | Bezpłatny e-book
Przeczytaj podobne wpisy

Kategorie

24 komentarze

  1. Stasiu

    Słodziak z Ciebie Malinko !
    Dziękuję Ci za tę podpowiedź super i proste rozwiązanie.
    Pozdrawiam Cię Malinko 🙂

    Odpowiedz
    • Malina

      Stasiu, bardzo się cieszę, że Ci się przyda to rozwiązanie :). Im prostsze tym lepsze 🙂 ♥ ♥ ♥

      Odpowiedz
  2. Łukasz

    WOOOW Fantastyczne! był czas, że sporządzałem mnóstwo protokołów z pomiarów elektrycznych. W stopce była treść; „protokół z pomiaru XXXX nr XX str. x/x” jak ja to wtedy chciałem zautomatyzować.. zwłaszcza, że nowe protokoły powstawały z kopii innych i były tylko uzupełniane..

    Odpowiedz
    • Malina

      Cieszę się :). Mam nadzieję, że teraz też Ci się to przyda 🙂

      Odpowiedz
      • Łukasz

        ActiveSheet.PageSetup.CenterFooter = „Nazwa Firmy, dział xxxx Tel. (0xx) xx-xx-xxx w. xx ” & Chr(10) & „Protokół nr ” & Range(„nrprot”).Value & ” str&P/&N”

        :):):):) Gdybym wiedział to wcześniej… te setki jeśli nie tysiące ręcznie ustawianych stopek… te pomyłki… a komórka „nrprot” istnieje naturalnie w każdym dokumencie.. Od dziś jestem Twoim jeszcze większym fanem:*

        Odpowiedz
        • Malina

          Łukasz, bardzo się cieszę! Miło mi to słyszeć i… korzystaj i szerz dalej! 🙂

          Odpowiedz
  3. Danuta

    Jak wstawić w stopkę osadzony obiekt.
    Mam zestawienie gdzie u góry dałam tabelkę z danymi(jako osadzony obiekt) i to powtórzone było na każdej stronie niestety inwestor zażyczył sobie aby tabela była nie na górze lecz na dole strony. Jak to można rozwiązać?

    Odpowiedz
    • Malina

      Hej, nie próbowałam wstawiać osadzonych obiektów do stopki, ale na pewno da się obraz. Może na potrzeby tego wydruku wstawić obraz do bardzo dużej stopki (np. 8 cm?). Trochę kombinowane, ale skoro sobie zażyczył…? 🙂

      Odpowiedz
      • Danuta

        Niestety jest to osazony obiekt z innego exela (bo tabela ma wyglądać identyczne dla wszystkich plików).
        Jak wyświetlić nie wartość konkretnej komórki jak to podałaś w tym szkoleniu ale widok całego wiersza może wtedy bo to zadziałało.

        Odpowiedz
        • Malina

          Pytanie jaka jest tego skala, bo może pójść po linii najmniejszego oporu, zapisać to jako obraz i wstawić obraz?

          Odpowiedz
          • Danuta

            Tak chyba się nie uda.
            Trzeba by było za każdym razem obiekt zapisać jako obraz a potem wstawić w stopkę.

            Mnie najbardziej by pasowało aby makro działał jak
            „U góry powtarzaj wiesze”
            z tym aby było to na dole w stopce.

          • Malina

            Ok, rozumiem. Niestety właśnie tytuły wydruku są od góry i od lewej ;(

  4. Olga

    Świetny tutorial! A czy jest możliwe wstawić do nagłówka więcej niż 3kolumny tekstu i wstawić kolor tła?

    Odpowiedz
    • Malina

      Cieszę się :). Jeśli chodzi o kolor to myślę, że można tam wstawić obraz (prostokąt o wybranym kolorze), a więcej kolumnę tekstu – trzeba byłoby kombinować 🙂

      Odpowiedz
  5. Kasia

    Bardzo ciekawe i proste rozwiązanie! Dziękuję!
    Mam pytanie tylko czy można pobierać dane nie z jednej a kilku komórek? A dokładnie, żeby pobrać całą tabelę i to z innego arkusza i wstawić w nagłówek.
    Udało mi się pobrać dane z jednej komórki z innego arkusza, ale już z większej ilości komórek nie. Będę wdzięczna za podpowiedź. Pozdrawiam

    Odpowiedz
    • Malina

      Hej, cieszę się, że Ci się podoba.
      Z tym niestety jest problem – można byłoby kombinować ze zrobieniem z tabeli obrazu i wtedy ją wstawić do stopki. A jeśli mają to być wartości – to może połączyć je w jedną komórkę (np. POŁĄCZ.TEKSTY) i wtedy wstawić do stopki?

      Odpowiedz
  6. Krzysiek

    Super sprawa, ale prosiłbym jeszcze o podanie jak dostosować wielkość i format czcionki przed wydrukiem ? Nagłówki mam ręcznie wprowadzone w pewnym stylu a to co w stopce drukuje się z automatu jest w innym styl. Chciałbym ustawić Trebuchet MS w wielkości 20
    Z góry dziękuję.

    Odpowiedz
    • Malina

      Ja bym sugerowała ustawić to ręcznie. Czyli ustawić się w część nagłówka/stopki i tam nadać formatowanie (normalnie z Narzędzi głównych) :).

      Odpowiedz
      • AK

        Mam ten sam problem, po zapisaniu zmiany wielkości i formatu czcionki, wraca do poprzedniego wyglądu. Coś robię nie tak?

        Odpowiedz
        • Malina

          Hej, a próbowałaś ustawić te parametry ręcznie?

          Odpowiedz
  7. Sebastian

    Cześć, jak zmodyfikować vba aby stopka była dodana do każdego arkusza (drukuj cały skoroszyt)? Nie mogę sobie poradzić z tym.
    Dzięki

    Odpowiedz
    • Malina

      Hej, to trzeba ustawić dla każdego arkusza oddzielnie. Najlepiej jednorazowo ręcznie, chyba że chcesz pobierać wartości z komórek, jak w tym artykule. Trzeba byłoby się przelecieć pętlą przez każdy arkusz i to ustawić przed wydrukiem…

      Odpowiedz
  8. Marek

    Witam 🙂
    Trafiłem na Twój artykuł bo potrzebuję coś takiego zrobić akurat w swoim arkuszu.
    I tu mam mały problem.
    Robiąc wszystko tak jak to masz opisane w tekście i przedstawione w filmiku, makro nie działa.
    Zastanawia mnie skąd u Ciebie w kodzie znalazło się na początku „Option Explicit”?
    Od razu napisze, że to są moje początki z VBA stąd moje pytanie 😉
    U mnie zaznaczając „Ten_skoroszyt” tego wyrażenia nie ma w okienku gdzie się kod wpisuje.
    W pliku z tym makrem, który udostępniasz jest to wyrażenie i ten plik działa.
    Próbowałem ręcznie skopiować to do swojego arkusza ale nie pomogło.
    Masz jakiś pomysł czemu to makro w moim arkuszu nie działa?
    Pozdrawiam 🙂

    Odpowiedz
    • Malina

      Hej :). Jeśli chodzi o opcję Option Explicit, to moim zdaniem to nie jest problem. Ta opcja wymusza deklarowanie zmiennych w kodzie, a zatem, jeśli u Ciebie nie ma tej opcji, a korzystasz z makra, opisanego w artykule, to nie przeszkadza :). Wręcz u Ciebie jest więcej możliwości, ze względu na brak tego wpisu. Czyli problem leży gdzieś indziej… Zobacz, czy np. odwołania do zakresów są prawidłowe. Może taka przyczyna?

      Odpowiedz

Wyślij komentarz

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

Pin It on Pinterest