8377


Wydruk zakresu arkusza z poziomu VBA

0x01 graphic
Po zarejestrowaniu makra ustawiającego zakres i opcje wydruku możemy analizować możliwe do zdefiniowania właściwości wydruku. Niestety w przypadku makra rejestrowanego drukujemy arkusz aktualnie używany i z góry zdefiniowany zakres tabeli. Samodzielne aplikacje powinny mieć dodatkowe funkcje:
- wydruk z innego arkusza niż aktualnie używany,
- wydruk zmiennego zakresu wierszy (w zależności od tego ile wierszy w tabeli jest zajętych).
w bieżącym przykładzie chciałbym przedstawić sposoby w jaki realizuję wydruku dla następujących przypadków:
- wydruk tabeli bieżącego arkusza o znanym i określonym zakresie,
- wydruk tabeli z innego arkusza niż bieżący o określanym w trakcie działania programu zakresie,
- wydruk tabeli z podaniem ilości stron i kopii,
Na zakończenie tego artykułu podam z jakimi przypadkami komunikatów o błędach najczęściej się spotykam (dla prób wydruku) oraz jaką przyjąłem zasadę realizacji wydruków z aplikacji.
Przykład dołączony do artykułu należy traktować jako czysto poglądowy (jest to czteroarkuszowy plik z tabelami doboru średnic rur stalowych w instalacjach ogrzewania wodnego - przykład pochodzi z mojej pracy zawodowej). Jest on do ściągnięcia w postaci archiwum samorozpakowującego na stronie pliki niniejszej witryny.

Niektóre opcje wydruku - makro rejestrowane Kliknij, żeby (roz)winąć listing

Sub Ustawienia_druku()
Range("B1:K203").Select ActiveSheet.PageSetup.PrintArea = "$B$1:$K$203"
ActiveSheet.PageSetup.PrintArea = "$B$1:$K$203"
ActiveSheet.PageSetup.CenterFooterPicture.Filename = _
"C:\Documents and Settings\Grzegorz Koralewski\Moje dokumenty\Moje obrazy\Okno_msgbox_2.png"
With ActiveSheet.PageSetup
.PrintTitleRows = "$1:$3"
.PrintTitleColumns = ""
End With
ActiveSheet.PageSetup.PrintArea = "$B$1:$K$203"
With ActiveSheet.PageSetup
.LeftHeader = "Nagłówek lewy"
.CenterHeader = "Nagłówek środek"
.RightHeader = "Nagłówek prawy"
.LeftFooter = "Stopka lewa"
.CenterFooter = "Stopka środek &P&N&D&T&Z&F&F&A&G"
.RightFooter = "Stopka prawa"
.LeftMargin = Application.InchesToPoints(0.78740157480315)
.RightMargin = Application.InchesToPoints(0.78740157480315)
.TopMargin = Application.InchesToPoints(0.984251968503937)
.BottomMargin = Application.InchesToPoints(0.984251968503937)
.HeaderMargin = Application.InchesToPoints(0.511811023622047)
.FooterMargin = Application.InchesToPoints(0.511811023622047)
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = 1200
.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
End With
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Uwagi
- nie są to wszystkie możliwe do ustawienia opcje
- nazwa pliku z początku listingu to definicja grafiki w stopce

Wydruk tabeli o stałym zakresie z bieżącego arkusza Kliknij, żeby (roz)winąć listing

Sub Wydruk_biezacy_arkusz_staly_zakres()

Dim Zakres_druku As Areas
Dim Obszar_druku As String

'POKAZANIE ARKUSZA /DLA NIEWIDOCZNEGO NIE MOŻNA USTAWIĆ WYDRUKU/
Arkusz1.Visible = xlSheetVisible

'USTAWIANIE OBSZARU WYDRUKU
'(SYMBOLE R i C to odpowiednio wiersze (rows) i kolumny (columns)

Obszar_druku = "='Stal_55_40'!R1C2:R203C11"

Worksheets("Stal_55_40").Names.Add Name:="Zakres_druku", RefersToR1C1:= _
Obszar_druku

'DRUKOWANIE
Worksheets("Stal_55_40").PageSetup.PrintArea = "Zakres_druku"

Worksheets("Stal_55_40").PrintOut Copies:=1, Collate:=True

'PONOWNE UKRYCIE ARKUSZA USTAWIONE JAKO KOMENTARZ
'LIKWIDACJA SYMBOLU ' SPOWODUJE ZAKRYCIE ARKUSZA PO ZAKOŃCZENIU WYDRUKU
'Arkusz1.Visible = xlSheetHidden

End Sub

Wydruk tabeli o zmiennej ilości wierszy z innego niż bieżący arkusza Kliknij, żeby (roz)winąć listing

Sub Wydruk_zmienne_wiersze_inny_arkusz()

Dim Kontrola As Range
Dim Proba As Areas
Dim ss As String
Dim s As Single
Dim Obszar_druku As String

'Zaznaczanie obszaru wydruku
'ustawienie komórki kontrolnej
Set Kontrola = Arkusz2.Range("B2")
ss = ""
s = 2

'Zmienna ss typu String to zawartość komórki Kontrola
'zmienna s typu single to liczba zwiększana z każdym wykonaniem
'pętli Do Loop Until
'jej wartość początkowa związana jest z początkiem wydruku
'z każdym wykonaniem pętli Kontrola jest komórką o jeden wiersz niżej

Do
ss = Kontrola.Value
If ss <> "" Then Set Kontrola = Kontrola.Offset(1, 0)
If ss <> "" Then s = s + 1
Loop Until ss = ""

'Pętla wykonywana jest do czasu aż komórka Kontrola jest pusta tzn.
'pierwszy wolna komórka w kolumnie B

s = s - 1
Arkusz2.Visible = xlSheetVisible

'W zmiennej Obszar_druku stosuję połączenie uzyskanej wartości zmiennej s
'z wartościami zdefiniowanymi
Obszar_druku = "='Stal_70_50'!R1C2:R" & s & "C11"

Worksheets("Stal_70_50").Names.Add Name:="Zakres_druku", RefersToR1C1:= _
Obszar_druku
'DRUKOWANIE
Worksheets("Stal_70_50").PageSetup.PrintArea = "Zakres_druku"
Worksheets("Stal_70_50").PrintOut Copies:=1, Collate:=True

'na zakończenie można ustawić widoczność arkusza na hidden

Range("A1").Select
'Arkusz2.Visible = xlSheetHidden

End Sub

Wydruk tabeli z podaniem ilości kopii Kliknij, żeby (roz)winąć listing

Sub Wydruk_arkusza_z_podaniem_ilosci_kopii()

Dim Komunikat As Integer
Dim i As Integer
Dim Zakres_druku As Areas
Dim Obszar_druku As String

On Error GoTo Błąd:

i = InputBox("Podaj ilość kopii", "WCZYTYWANIE DANYCH", "2")

'Drukowanie
Arkusz1.Visible = xlSheetVisible

Obszar_druku = "='Stal_55_40'!R1C2:R203C11"
'
Worksheets("Stal_55_40").Names.Add Name:="Zakres_druku", RefersToR1C1:= _
Obszar_druku

Worksheets("Stal_55_40").PageSetup.PrintArea = "Zakres_druku"

'Podaną w funkcji InputBox zmienną używamy w ustawieniach wydruku

Worksheets("Stal_55_40").PrintOut Copies:=i, Collate:=True

'Arkusz1.Visible = xlSheetHidden

Exit Sub
Błąd: Komunikat = MsgBox("Wystąpił błąd. Spróbuj jeszcze raz podając ilość kopii")

End Sub

W programach, które piszę dla potrzeb mojej pracy zawodowej wykorzystywałem różne kombinacje w/w algorytmów np:
- wydruk tabeli o zmiennej ilości wierszy i kolumn (znany tylko początek tabeli),
- wydruk tabeli z podaną np. w oknie TextBox formularza ilością kopii,
- wydruk powtarzalnej korespondencji dla której program sam ustalał ilość stron wydruku (równą ilości użytych danych)
Komunikaty o błędach np. 'ustawienie właściwości printarea klasy pagesetup nie jest możliwe' związane były w moim przypadku ze złym doborem typów zmiennych lub z próbą wydruku dla arkusza ukrytego/nieaktywnego.
W trakcie pracy ustaliłem dwie możliwości przygotowania wydruku z aplikacji:
a) program ustawia wszystkie możliwe parametry (marginesy, orientację papieru, nagłówki, stopki itp.),
b) ustawiam wszystko w arkuszu i drukuję, a w VBA tylko określam zakres i ilość stron,
Zaletą pierwszej metody jest pewna miara niezależności, wadą (przynajmniej w moim przypadku) bardzo długi czas wydruku,
Zaletą drugiej metody jest szybkość wydruku, wadą - czasami Excel zapomina o wcześniejszych ustawieniach.
Przyjąłem metodą drugą, przy czym właściwość Visible arkuszy, z których następuje wydruk ustawiam na 'Hidden', a nie na 'VeryHidden'. Różnica jest taka, że arkusza Very-ukrytego nie widać w menu programu (dla Excela 2003 pasek Format/arkusz/odkryj), a arkusz tylko ukryty można tam ujawnić. Jak aplikacja zapomni ustawień np. orientacji papieru wchodzę do ustawień i w kilka sekund poprawiam. W sytuacji mojej firmy jest to wystarczające.
Mała uwaga - arkusze 'VeryHidden' można ujawnić komendami VBA z poziomu innego pliku.
Załączony w dziale 'pliki' arkusz zawiera trzy przyciski pod którymi wprowadzone są makra z listingów. Dla osób zainteresowanych tematem wydruków VBA polecam artykuły z działu 'Programy do kuchni':
- Czytelne wydruki z programu VBA?
- Wydruk z poziomu Visual Basica tabeli o zmiennym zakresie wierszy/kolumn
- Wydruk tabel z formułami - sumowaniem/kopiowaniem i usuwaniem wierszy z poziomu VBA
- Ustawienia wstępne wydruku, a szybkość działania programu VBA



Wyszukiwarka

Podobne podstrony:
8377
8377
8377
8377
8377
8377
LC7232 8377

więcej podobnych podstron