Supportnet / Forum / Tabellenkalkulation
VBA: PrintOut und dann warten bis er fertig ist
Frage
Hallo,
ich habe ein Problem mit meinem VBA Script. Leider läuft es immer schon weiter bevor Excel ausgedruckt hat. Für Word gibt es da anscheinend eine Option Background := false dann wird nichts unternommen bevor das Script nicht zu ende gelaufen ist. Leider gibts diese Funktion wohl nicht in Excel. Hat jemand trotzdem ne Idee wie man es löen könnte oder kennt eine Funktion?
Viele Grüße
Oli
Antwort 1 von Beverly
Hi Oli,
ich kenne deinen Code nicht, aber vielleicht hilft dir der Hinweis Application.Wait weiter
Bis späer,
Karin
ich kenne deinen Code nicht, aber vielleicht hilft dir der Hinweis Application.Wait weiter
Bis späer,
Karin
Antwort 2 von Oli00
Hi Karin,
Code ist sehr einfach. In etwa:
Do
´Combobox wird eins hochgezählt
´nach Shapes suchen und Shapes löschen
´neues Shape für Auswahl Kombobox kopieren
Sheets.Printout
Loop
Das Problem ist, dass das Drucken nicht schnell genug geht und er deswegen einen Fehler beim löschen des Shapes bringt und das Macro einen Error bringt.
Der Ansatz mit Wait ist gut. Damit ist es sicher lösbar, allerdings nicht zuverlässig bzw. nur mit großen Verzögerungen. Deswegen hab ich nach einer Funktion gesucht die einen True Wert liefert. Wundert mich echt, dass es sowas nicht gibt ...
Viele Grüße
Oli
Code ist sehr einfach. In etwa:
Do
´Combobox wird eins hochgezählt
´nach Shapes suchen und Shapes löschen
´neues Shape für Auswahl Kombobox kopieren
Sheets.Printout
Loop
Das Problem ist, dass das Drucken nicht schnell genug geht und er deswegen einen Fehler beim löschen des Shapes bringt und das Macro einen Error bringt.
Der Ansatz mit Wait ist gut. Damit ist es sicher lösbar, allerdings nicht zuverlässig bzw. nur mit großen Verzögerungen. Deswegen hab ich nach einer Funktion gesucht die einen True Wert liefert. Wundert mich echt, dass es sowas nicht gibt ...
Viele Grüße
Oli
Antwort 3 von coros
Hallo Oli,
mir ist nicht bekannt, dass man das Ende eines Druckauftrages so einfach in Excel mit Excelmitteln ermitteln kann. Über API wird das sicherlich gehen, ist aber sicher nicht ganz einfach. Aber setze doch mal hiner dem PrintOut-Befehl ein "DoEvents". Eventuell funktionierts dann besser. Ist aber ungetestet, da ich keine Lust habe, Deinen nicht ganz bekannten Code nach zu bauen.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
mir ist nicht bekannt, dass man das Ende eines Druckauftrages so einfach in Excel mit Excelmitteln ermitteln kann. Über API wird das sicherlich gehen, ist aber sicher nicht ganz einfach. Aber setze doch mal hiner dem PrintOut-Befehl ein "DoEvents". Eventuell funktionierts dann besser. Ist aber ungetestet, da ich keine Lust habe, Deinen nicht ganz bekannten Code nach zu bauen.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 4 von Oli00
Hi Oliver,
vielen Dank. Werde ich gleich mal auf der Arbeit ausprobieren. Hatte den Code leider nicht hier sonst hätte ich ihn mal geposted.
Viele Grüße
Oli
vielen Dank. Werde ich gleich mal auf der Arbeit ausprobieren. Hatte den Code leider nicht hier sonst hätte ich ihn mal geposted.
Viele Grüße
Oli
Antwort 5 von Oli00
Hi Oliver,
also das mit den DoEvents hat leider nich funktioniert.
Hier trotzdem noch mal der Code.
Sub Print_out()
Query_client
Dim Ablauf
wb = ActiveWorkbook.Name
Sheets(Array("Result_1", "Result_2", "Result_3")).Select
Sheets("Result_1").Activate
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
DoEvents
End Sub
Sub Query_client()
Sheets("Illustration1_source").Select
application.Goto Reference:="Ess_Illustration1"
x = EssMenuVRetrieve()
Sheets("Graphics_source").Select
application.Goto Reference:="Ess_Graphics"
x = EssMenuVRetrieve()
Sheets("Tables_source").Select
application.Goto Reference:="Ess_Tables"
x = EssMenuVRetrieve()
Sheets("Control").Select
End Sub
Public Static Sub ComboBox1_Change()
´ ------------------- Löschen der alten Bilder -----------------------
For Each Shape In Worksheets("Result_1").Shapes
If Shape.Type = msoPicture Then
Shape.Delete
End If
Next
Der Fehler tritt ganz am Ende, also beim löschen der alten Bilder auf. Nach dem Löschen der alten Bilder sollen dann wieder neue reinkopiert werden. Der Fehler heisst:
Laufzeitfehler ´1004´:
Anwendungs oder Objektdefinierter Fehler
Viele Grüße
Oli
also das mit den DoEvents hat leider nich funktioniert.
Hier trotzdem noch mal der Code.
Sub Print_out()
Query_client
Dim Ablauf
wb = ActiveWorkbook.Name
Sheets(Array("Result_1", "Result_2", "Result_3")).Select
Sheets("Result_1").Activate
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
DoEvents
End Sub
Sub Query_client()
Sheets("Illustration1_source").Select
application.Goto Reference:="Ess_Illustration1"
x = EssMenuVRetrieve()
Sheets("Graphics_source").Select
application.Goto Reference:="Ess_Graphics"
x = EssMenuVRetrieve()
Sheets("Tables_source").Select
application.Goto Reference:="Ess_Tables"
x = EssMenuVRetrieve()
Sheets("Control").Select
End Sub
Public Static Sub ComboBox1_Change()
´ ------------------- Löschen der alten Bilder -----------------------
For Each Shape In Worksheets("Result_1").Shapes
If Shape.Type = msoPicture Then
Shape.Delete
End If
Next
Der Fehler tritt ganz am Ende, also beim löschen der alten Bilder auf. Nach dem Löschen der alten Bilder sollen dann wieder neue reinkopiert werden. Der Fehler heisst:
Laufzeitfehler ´1004´:
Anwendungs oder Objektdefinierter Fehler
Viele Grüße
Oli
Antwort 6 von Oli00
Hi,
ich habe jetzt mal nach dem Audrucken ein:
Sheets("Control").Activate
Welches das Sheet mit der Combobox ist gesetzt. Damit klappt es jetzt. Ich glaub der Hase lag wohl im Endeffekt ganz woanders versteckt.
Vielen Dank trotzdem noch einmal für eure Hilfe!
Grüße
Oli
ich habe jetzt mal nach dem Audrucken ein:
Sheets("Control").Activate
Welches das Sheet mit der Combobox ist gesetzt. Damit klappt es jetzt. Ich glaub der Hase lag wohl im Endeffekt ganz woanders versteckt.
Vielen Dank trotzdem noch einmal für eure Hilfe!
Grüße
Oli
Antwort 7 von coros
Hallo Oli,
das mit dem DoEvents kann auch nichts bringen, denn das sind ja verschiedene Makros. Das sieht irgendwie alles ganz anders aus als in Deiner AW2 beschrieben. Warum?
Welche Zeile wird den angezeigt, bzw. markiert, wenn der Fehler auftritt?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
das mit dem DoEvents kann auch nichts bringen, denn das sind ja verschiedene Makros. Das sieht irgendwie alles ganz anders aus als in Deiner AW2 beschrieben. Warum?
Welche Zeile wird den angezeigt, bzw. markiert, wenn der Fehler auftritt?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 8 von Oli00
Hi,
markiert wurde Shape.Delete
Der Code hat anders ausgesehen, weil ich es nicht perfekt im Kopf hatte und versucht habe die Informationen zu geben, die für die Problemlösung dienlich gewesen wären.
Viele Grüße
Oli
markiert wurde Shape.Delete
Der Code hat anders ausgesehen, weil ich es nicht perfekt im Kopf hatte und versucht habe die Informationen zu geben, die für die Problemlösung dienlich gewesen wären.
Viele Grüße
Oli

