VBA >Drucken mehrere Blätter

Hallo zusammen,
ich habe recht wenig Ahnung von VBA.
Das einzige was mir ein wenig hilft ist sind einige uralt-Kenntnisse von Basic.

Ich habe hier meine Tabelle mit zZ. 150 Zeilen.
Diene müssen in ein Formular zu je 30Einträge. [Inventur > Tabellenblatt Blatt 2]
Das ist alles fertig,
per Drehfeld kann ich das Formular auf Blatt 1 bis zZ. Blatt 5 schalten.
Die Bereiche 1-30, 31-60, … 121 bis 150 werden entsprechend ausgewählt.

Ich habe mir ein VBA aufgezeichnet welches mir das Formular ausdruckt und mit meinen beschiedenen Kenntnissen so umgebaut, das alle Formulare auf ein mal gedruckt werden.

Hier das erstellte makro
In m2 steht die Seitenzahl
In l2 steht die aktuelle Seite die im Tabellenblatt angezeigt wird.

Sub drucken_alles()
anz = [m2]
akt = [l2]

For I = 1 To anz
[l2] = I
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Next
[l2] = akt
Range(„b1“).Select
End Sub

Mein Problem,
die Formulare müssen auch als PDF erstellt werden.
Mit meinem Makro erzeuge ich zZ. 5 Druckbefehle mit je einer Seite
Ich benötige aber 1 Druckbefehl mit 5 Seiten.
Ist das möglich?

Danke Holger

Hallo Holger,

so Recht verstanden habe ich weder den Code noch den sonstigen Text.

Mein Problem,
die Formulare müssen auch als PDF erstellt werden.
Mit meinem Makro erzeuge ich zZ. 5 Druckbefehle mit je einer
Seite
Ich benötige aber 1 Druckbefehl mit 5 Seiten.

Der Code erzeugt hinten ein neues Blatt. Wenn es so aussieht wie du es wünschst so entferne das Hochkomma vor dem Print-Befehl.
Brauchst du das Blatt nach dem Druck nihct mehr, so entferne die drei anderen Hochkommas.

Option Explicit
'
Sub PdfDruck()
Dim Zei As Long, Blaetter, B As Integer
Application.ScreenUpdating = False
Blaetter = Array("test", "t2", "t3") ' Blattnamen anpassen
Worksheets.Add after:=Worksheets(Worksheets.Count)
With ActiveSheet
 For B = 0 To UBound(Blaetter)
 Worksheets(Blaetter(B)).UsedRange.Copy Destination:=.Cells(Zei + 1, 1)
 Zei = .Cells(Rows.Count, 1).End(xlUp).Row
 .HPageBreaks.Add Before:=Cells(Zei + 1, 1)
 Next B
' .PrintOut
' Application.DisplayAlerts = False
' .Delete
' Application.DisplayAlerts = True
End With
Application.ScreenUpdating = True
End Sub

Gruß
Reinhard

Hallo Holger,

so Recht verstanden habe ich weder den Code noch den sonstigen
Text.

Ich habe den Code versucht einzubauen, weiß aber wirklich nicht wie ich es machen soll.
Ich versuche es noch einmal zu erklären:

Ich habe ein Tabellenblatt [Inventurliste]
Dort ein Vordruck unserer Verwaltung der ausgefüllt werden muss.
Die Daten dazu kommen per Formel vom andren Tabellenblatt
Auf diesem Vordruck sind 30 Zeilen.
Da ich zZ. etwa 150 Datensätze habe werden dadraus 5Blatt mit je 30 Zeilen.

Da ich dieses Formular aber nur ein mal auf dem Tabellenblatt habe wir das gewünschte Blatt in der Zelle [Inventurliste!L2] eingestellt.
Welches das letzte Blatt ist steht in [Inventurliste!K2]

Auch die *.PDF werden per „Drucker“ erzeugt.
Mein Problem für *.PDF:
Es sollte ein Druckauftrag mit x Blätter werden.
Bei meinem Macro sind es 5Druckaufräge mit je einem Blatt

Ich versuche mal zu erklären wie das Makro ablaufen müsste:

>Wert von Inventurliste!L2 merken und nach dem Drucken wieder einstellen
>Inventurliste!L2=1
>drucke Blatt 1
>Inventurliste!L2=2
>drucke Blatt 2
>Inventurliste!L2=3
>drucke Blatt 3
>>zum Schluss: gemerkter Wert von Inventurliste!L2 wieder einstellen

Wie gesagt, mehr macht auch mein aufgezeichnetes Makro nicht.
Nur das es nicht ein sondern mehrere Druckaufträge sind.

danke, Holger

Hallo Holger,

Ich habe den Code versucht einzubauen, weiß aber wirklich
nicht wie ich es machen soll.

du müßtest in der Codezeile:
Blaetter=Array(…)
nur die Namen der fünf zu druckenden Tabellenblätter eintragen anstelle der Blattnamen die jetzt drinstehen, in der gleichen Syntax.

Ich habe ein Tabellenblatt [Inventurliste]
Dort ein Vordruck unserer Verwaltung der ausgefüllt werden
muss.
Die Daten dazu kommen per Formel vom andren Tabellenblatt
Auf diesem Vordruck sind 30 Zeilen.
Da ich zZ. etwa 150 Datensätze habe werden dadraus 5Blatt mit
je 30 Zeilen.

Wie lauten die Blattnamen der fünf Blätter?
Was steht in L2 und K2, eine 1 und eine 5 ?

Ist denn untn in der Anzeige der Blattnamen das ganz links stehende Blatt dein Blatt1 was ausgedruckt werden soll, daneben stehen die anderen vier Blätter?

Warum da in L2 was geändert werden muß beim Drucken und danach wieder zurückgestellt werden ist mir völlig unklar.
Für ein Makro braucht man das doch nicht.

Und einem Makro ist es auch egal ob du ein Blatt mit 150 Zeilen hast oder 5 Blätter mit je 30 Zeilen.
Was an den Drucker geschickt wird legt das Makro fest. Also ob 5x1 Blatt oder 1x5 Blatt.

Wäre prontout nicht so hemmend wäre das Makro schneller fertig als man die Änderungen in L2 mitverfolgen könnte.

Gruß
Reinhard

Hallo Holger.

Habe ich das so richtig verstanden: Du möchtest nach dem Ausdrucken als PDF eine PDF-Datei mit fünf Seiten haben und nicht fünf PDF-Dateien mit je einer Seite.

Ist das so richtig?

VG
Carsten

Ja genau.
das Problem ist, glaube ich, das alle Seiten erst nacheinander erzeugt werden müssen.
Ich habe die Datei [etwas gestutzt] mal hoch geladen.
Hoffe das es dann besser verständlich ist
http://www.mayhemmichi.de/echo/Inventur-Lampenliste.xls

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Holger.

Dazu fällt mir keine simple Lösung ein. Leider kann man in VBA das Printer-Objekt nicht so ansprechen wie in VB6, sonst würde es gehen.

Ein sehr großer Umweg wäre allerdings denkbar:
Du fügst Deiner Datei ein Tabellenblatt hinzu, bei dem Du die Seite einrichtest mit den Rändern und so, aber keinen Druckbereich eingibst. Dabei mußt Du dann beachten, daß die Formatierung der Zellen in Zelle A1 beginnt und nicht in Zelle B2.

Weiterhin dürften dann die verbundenen Zellen im Tabellenblatt „Inventurliste“ nicht mehr verbunden sein, sonst gibts irgendwie (und ich weiß nicht warum) Probleme bein Kopieren bzw. Werte einfügen.

So, wenn Du das hast, kannst Du Programmcode schreiben der automatisch die Werte aller durchlaufenen Formular-Blätter in die entsprechenden untereinanderliegenden Bereiche der vorgefertigten Tabelle einfügt.

Dann kannst Du diese Tabelle drucken lassen.

Das vorgefertigte Tabellenblatt kann man unsichtbar machen; und vom Ablauf des Makros würde man gar nicht mal so viel mitbekommen, wenn man, wie Reinhard schon schrieb, „Application.ScreenUpdating = False“ benutzt.

Da man diesen Code in eine ForNext-Schleife bauen kann, wäre es durchaus möglich, die Formular-Seitenanzahl zu erhöhen.

VG
Carsten

Hallo Reinhard
erst mal danke für die Hilfe
Ich komme noch nicht so recht mit der Struktur hier im Forum zurecht.

Bei Carsten habe ich schon geantwortet das ich die Datei zum besseren Verständnis mal hoch geladen habe.
http://www.mayhemmichi.de/echo/Inventur-Lampenliste.xls

Er schrieb dazu, das es nicht so einfach zu realisierten ist.
Ist dann auch nicht ganz so schlimm.
Gruß Holger

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Holger,

Ich komme noch nicht so recht mit der Struktur hier im Forum
zurecht.

Das wird schon.
Oder auch nicht, es gibt Foren da gehe ich ungern hin wegen der darstellung der Beiträge dort. Klar komme ich damit zurecht, aber sie passt mir halt nicht:smile:

Er schrieb dazu, das es nicht so einfach zu realisierten ist.
Ist dann auch nicht ganz so schlimm.

Ja, verbundene zellen sind immer übel, kein Vbaler mag die.
Die machn ja schon in Excel Stress, versuch die mal zu sortieren…

Gehe mal in deine Beispielmappe auf Zeile 152, markiere sie bis runter zu 65536 und dann Rechtsklick und Zeilen löschen.

Da sind noch irgendwelche unsichtbare Einträge drin die meinen Code irritieren wenn er in Spalte A den untersten Eintrag sucht.

Meinen Code habe ich an deiner Beispielmappe getestet.

Daß L2 wieder zurückgeändert werden muß habe ich jetzt nicht gemacht, ich denke du kriegst das hin, wenn nicht frag halt nochmal.

Wichtig ist erstmal, daß das entstandene Blatt, wenn du es ausdruckst als PDF so ist wie du das wünschst.

Kleinigkeiten wie L2 oder die Spaltenbreite im neuen Blatt so daß es von der Breite her auf ein Blatt passt kann man immer noch basteln.

Gruß
Reinhard

Sub PdfDruck()
Dim Zei As Long, Blaetter, B As Integer, Anz As Long
Application.ScreenUpdating = False
Worksheets.Add after:=Worksheets(Worksheets.Count)
With ActiveSheet
 Zei = Worksheets("Leuchtmittel").Cells(Rows.Count, 1).End(xlUp).Row - 1
 Anz = Int(Zei / 30) - (Zei Mod 30 0) \* 1
 For B = 1 To Anz
 Worksheets("Inventurliste").Range("L2") = B
 Worksheets("Inventurliste").Range("B1:I48").Copy Destination:=.Cells((B - 1) \* 48 + 1, 1)
 Worksheets("Inventurliste").Range("B14:I43").Copy
 .Range("A" & (B - 1) \* 48 + 14 & ":H" & (B - 1) \* 48 + 43).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= \_
 False, Transpose:=False
 .Cells((B - 1) \* 48 + 5, 2) = Worksheets("Inventurliste").Range("L2")
 If B Anz Then .Range("A" & (B - 1) \* 48 + 1) = ""
 .HPageBreaks.Add Before:=Cells(B \* 48 + 1, 1)
 Next B
' .PrintOut
' Application.DisplayAlerts = False
' .Delete
' Application.DisplayAlerts = True
End With
Application.ScreenUpdating = True
End Sub

OT Printer-Object

Dazu fällt mir keine simple Lösung ein. Leider kann man in VBA
das Printer-Objekt nicht so ansprechen wie in VB6, sonst würde
es gehen.

Hallo Carsten,

Aus Interesse, was geanu meinst du, ich experimentiere ein bisschen mit VB herum, habe aber nur VB5.0

So, wenn Du das hast, kannst Du Programmcode schreiben der
automatisch die Werte aller durchlaufenen Formular-Blätter in
die entsprechenden untereinanderliegenden Bereiche der
vorgefertigten Tabelle einfügt.

Das geht leider so nicht weil die Formeln da nicht mitmachen. Abgesehen vom ersten Blatt haste dann nur noch „#Bezug

Gruß
Reinhard

Dann kannst Du diese Tabelle drucken lassen.

Das vorgefertigte Tabellenblatt kann man unsichtbar machen;
und vom Ablauf des Makros würde man gar nicht mal so viel
mitbekommen, wenn man, wie Reinhard schon schrieb,
„Application.ScreenUpdating = False“ benutzt.

Da man diesen Code in eine ForNext-Schleife bauen kann, wäre
es durchaus möglich, die Formular-Seitenanzahl zu erhöhen.

VG
Carsten

Hallo Holger!

Habe ich das so richtig verstanden: Du möchtest nach dem
Ausdrucken als PDF eine PDF-Datei mit fünf Seiten haben und
nicht fünf PDF-Dateien mit je einer Seite.

Ja genau.
das Problem ist, glaube ich, das alle Seiten erst nacheinander
erzeugt werden müssen.

Ich weiß nicht ob du andere Software installieren darfst, aber einige der PDF-Drucker können einzelne Druckaufträge sammeln und dann in ein einziges Enddokument speichern.
Der genaue Name des Programms fällt mir leider gerade nicht ein.

mfg
christoph

Betr,: VBA-Lösung

Ja das ist super, damit habe ich jetzt gar nicht gerechnet.
Super Lösung, das ist alles was ich brauche.
Herzlichen Dank dafür.
Natürlich auch an alle anderen.

Gruß Holger

Hallo Reinhard.

Aus Interesse, was geanu meinst du, ich experimentiere ein
bisschen mit VB herum, habe aber nur VB5.0

In VB kann man den Drucker nach Belieben steuern. Z.B. kann man mit der Anweisung „Printer.NewPage“ (oder so) eine neue Seite beginnen. Das wäre für Holger ja unbedingt notwendig.

Sollte aber auch in VB5 schon gehen.

Das geht leider so nicht weil die Formeln da nicht mitmachen.
Abgesehen vom ersten Blatt haste dann nur noch „#Bezug

#Bezug“ hast Du nur dann, wenn Du kopierst und einfügst. Ich sprach von kopieren und Inhalte einfügen > Werte. Das funktioniert nicht, wenn die kopierten Zellen verbunden sind, selbst wenn die „Ziel“-Zellen genauso verbunden sind wie die „Quell“-Zellen. Da schmeißt Excel immer 'ne Meldung raus und bricht dann den Vorgang ab.

VG
Carsten

einige der PDF-Drucker können einzelne
Druckaufträge sammeln und dann in ein einziges Enddokument
speichern.
Der genaue Name des Programms fällt mir leider gerade nicht
ein.

Bei FreePDF XP kann man MultiDoc anklicken. Vielleicht hilft das ja schon weiter. Kenne ich mich aber nicht weiter mit aus.

VG
Carsten

Hallo Carsten,

In VB kann man den Drucker nach Belieben steuern. Z.B. kann
man mit der Anweisung „Printer.NewPage“ (oder so) eine neue
Seite beginnen. Das wäre für Holger ja unbedingt notwendig.

aha, danke für die Information.

Das geht leider so nicht weil die Formeln da nicht mitmachen.
Abgesehen vom ersten Blatt haste dann nur noch „#Bezug

#Bezug“ hast Du nur dann, wenn Du kopierst und einfügst. Ich
sprach von kopieren und Inhalte einfügen > Werte. Das
funktioniert nicht, wenn die kopierten Zellen verbunden sind,
selbst wenn die „Ziel“-Zellen genauso verbunden sind wie die
„Quell“-Zellen. Da schmeißt Excel immer 'ne Meldung raus und
bricht dann den Vorgang ab.

Ja, beim Testen stieß ich auch auf diese Fehlermeldung.
In meinem Code der ja anscheinend bei Holger klappt kommt sie nicht.
Zur Not müßte ma halt per Code sich alle verbunden Zellen merken, kopieren, dnn wieder in der Kopie verbinden *denk*

Gruß
Reinhard