617 Aufrufe
Gefragt in Tabellenkalkulation von
Hi,

ich muss Palettenfahnen in Excel ausdrucken.
Das klappt mit folgendem Makro und ner Schaltfäche im Sheet ganz gut, aber die neue Anforderung ist, dass ohne Schaltfläche im normalen Druckdialog abzubilden.

Bisheriges Makro:

Sub DruckeUndZaehle()
Dim VarPrints As Variant, intI As Integer

'Inputbox mit Type 0 laesst nur Zahlen als Eingabe zu.
VarPrints = Application.InputBox("Anzahl der Ausdrucke", "Drucken", 0, Type:=1)

If VarPrints = False Then 'User selected cancel
Exit Sub
ElseIf CInt(VarPrints) > 0 Then

Dim iMerker As Integer

iMerker = Range("B14")

For intI = 1 To CInt(VarPrints)
'ActiveSheet.PrintOut
Range("B14") = Range("B14") + 1
Next intI

Range("B14") = iMerker

End If
End Sub


Ich hab hier im Forum schon folgendes dazu gefunden:

https://supportnet.de/threads/202956

Aber das dort erwähnte "ExecuteExcel14Makro" und dessen Quelltext finde ich nirgends.

Hat mir jemand ne Lösung zu obigem Problem über die "BeforePrint" Option, oder gibts keinen Weg, der an dieser Schaltfläche vorbeiführt?

Viele Grüße

7 Antworten

0 Punkte
Beantwortet von
0 Punkte
Beantwortet von
Hi Nighty,

kannst Du mir dazu noch etwas Hintergrundinfo geben?

Ich bin absoluter Makro-DAU und hab mir das obige schon aus allen möglichen Infos zusammengebastelt und per Trial and Error zum Laufen gebracht.

Excel14 war natürlich der klassische Typo. ;)

Wie könnte den die obige Funktion mit diesem Exel4Makro aussehen und was bewirkt der Aufruf "Get.Document(50)"? Der ist mir auch völlig unklar.

Bin leider total planlos.
0 Punkte
Beantwortet von
Hi Bernd :-)

Die Funktion gibt Dir an wieviele Seiten das Worksheet besitzt

Was hast du denn überhaupt vor ?

Gruss Nighty
0 Punkte
Beantwortet von
Hi Nighty,

ich hab ein Excel Sheet mit mehreren Blättern.
Jedes Platt ist eine Palettenfahne für den Vesand.

Manche Sendungen bestehen nun aus mehreren Paletten, d.h. ich muss jedes Blatt mit jeweils einem Feld, dass sich jeweils um 1 erhöht ausdrucken.

Mit obigem Makro (Drucke und Zähle) klappt das auch, nun will aber mein Chef, dass ich nicht in jede dieser Excel-Mappen die Schaltflächen mit diesem Makro einbinde.

Er will quasi das man ganz normal auf Drucken geht, dann ne Abfrage kommt, wieviele Palettenfahnen es sein sollen und dann jeweils so viele Ausdrucke (Mit der Nummer von 1 ausgehend je um eins erhöht) erstellt werden, wie im Dialog angegeben.

An sich sollte sich das ja mit der "BeforePrint" Funktion machen lassen, aber bei mir druckt er dann immer nur einmal aus, das raufzählen und dann nochmal ausdrucken bekomme ich damit nicht hin...

Verstehst mein Problem jetzt besser?

VG
Bernd
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Bernd,

ich hoffe, ich habe dich richtig verstanden:

Schreibe in ein allgemeines Modul deiner Arbeitsmappe die folgende Zeile:
Global bDruck As Boolean

Kopiere in das VBA-Projekt der Arbeitsmappe den folgenden Code:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim VarPrints As Variant
Dim intI As Integer
Dim iMerker As Integer

'Falls Variable für den Ausdruck falsch ist, dann ..
If bDruck = False Then

'aktuellen Druckauftrag abrechen
Cancel = True

'Inputbox mit Type 0 laesst nur Zahlen als Eingabe zu.
VarPrints = Application.InputBox("Anzahl der Ausdrucke", "Drucken", 0, Type:=1)
If VarPrints = False Then Exit Sub 'Abbruch
If CInt(VarPrints) > 0 Then bDruck = True 'Marker für den Ausdruck auf wahr setzen, falls Zahl größer Null eingegeben
End If

'Falls Marker für den Ausdruck wahr ist, dann
If bDruck = True Then
iMerker = Range("B14") 'Inhalt der Zelle B14 in Variable speichern
For intI = 1 To CInt(VarPrints) 'Schleife für den Ausdruck
ActiveSheet.PrintOut Copies:=1 'Seite ausdrucken
Range("B14") = Range("B14") + 1
If intI = CInt(VarPrints) Then 'Falls alle Ausdrucke durchlaufen sind
Range("B14") = iMerker 'ursprünglichen Inhalt wieder in B14 schreiben
bDruck = False 'Marker für Ausdruck wieder auf falsch setzen
End If
Next intI
End If

End Sub


Achtung: Das Makro gilt für alle Tabellen innerhalb der Arbeitsmappe.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

ich glaube Du hast mein Problem nicht ganz erkannt.

Es geht darum, dass bei diesen Palettenfahnen eine Zahl im Feld bei jedem Ausdruck um 2 erhöht werden muss.

Beispiel: Ich hab im Feld B14 die Zahl 1 stehen. Im Feld B15 steht dann "von" und im Feld B16 steht dann z.B. 6

Nun soll der Mitarbeiter quasi beim Drucken eine Aufforderung bekommen, wieviele Palettenfahnen er braucht.
Im obigen Beispiel besteht die sendung dann gesamt aus 6 Paletten, d.h. es soll gedruckt werden:

1 mal mit 1 von 6
1 mal mit 2 von 6
1 mal mit 3 von 6
1 mal mit 4 von 6
1 mal mit 5 von 6
1 mal mit 6 von 6

d.h. es soll 6 Ausdrucke geben und in jedem Ausdruck soll der Wert des Feldes B14 um 1 erhöht werden.
Am Ende des Ausdrucks soll dann der ursprüngliche Wert 1 wieder im Feld B14 stehen.

Jetzt verständlicher?

Bei deinem Beispiel sehe ich nirgends die Erhöhung des Wertes in B14 um 1 vor jedem Ausdruck.

VG
Bernd
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Bernd,

hast du das Makro ausprobiert?
ich glaube Du hast mein Problem nicht ganz erkannt.

Ich habe dein gepostetes Makro so umgeschrieben, dass es mit der Before-Print-Routine klappt. Und ich denke ich habe dein Problem sehr wohl verstanden.

Bei deinem Beispiel sehe ich nirgends die Erhöhung des Wertes in B14 um 1 vor jedem Ausdruck.

Dann schau genau hin:
Range("B14") = Range("B14") + 1


Am Ende des Ausdrucks soll dann der ursprüngliche Wert 1 wieder im Feld B14 stehen.

Auch das ist umgesetzt:
Range("B14") = iMerker 'ursprünglichen Inhalt wieder in B14 schreiben


Im Feld B15 steht dann "von" und im Feld B16 steht dann z.B. 6

Das hast du bisher nicht geschrieben. Hier das dazu angepasste Makro:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim VarPrints As Variant
Dim intI As Integer
Dim iMerker As Integer

'Falls Variable für den Ausdruck falsch ist, dann ..
If bDruck = False Then

'aktuellen Druckauftrag abrechen
Cancel = True

'Inputbox mit Type 0 laesst nur Zahlen als Eingabe zu.
VarPrints = Application.InputBox("Anzahl der Ausdrucke", "Drucken", 0, Type:=1)
If VarPrints = False Then Exit Sub 'Abbruch
If CInt(VarPrints) > 0 Then
bDruck = True 'Marker für den Ausdruck auf wahr setzen, falls Zahl größer Null eingegeben
ActiveSheet.Range("B16") = VarPrints 'Gesamtanzahl der Drucke in Zelle B16 schreiben
Else
Exit Sub
End If

End If

'Falls Marker für den Ausdruck wahr ist, dann
If bDruck = True Then
iMerker = Range("B14") 'Inhalt der Zelle B14 in Variable speichern
For intI = 1 To CInt(VarPrints) 'Schleife für den Ausdruck
ActiveSheet.PrintOut Copies:=1 'Seite ausdrucken
Range("B14") = Range("B14") + 1
If intI = CInt(VarPrints) Then 'Falls alle Ausdrucke durchlaufen sind
Range("B14") = iMerker 'ursprünglichen Inhalt wieder in B14 schreiben
Range("B16").ClearContents 'Inhalt von Zelle B16 wieder löschen
bDruck = False 'Marker für Ausdruck wieder auf falsch setzen
End If
Next intI
End If

End Sub


Zur Definition Global bDruck As Boolean siehe meine Antwort 4.

Gruß

M.O.
...