Hallo Zusammen,
leider benötige ich wieder Eure Unterstützung, da ich nicht weiterkomme.
Ich lasse mir einen Bericht über die ,,Berichtsansicht" anzeigen. Für das Drucken (oder das Schliessen des Berichtes ohne Druck) habe ich auf dem Bericht u.a. zwei Buttons eingefügt, die entweder (1) das Druckmenü öffnen oder (2) den geöffneten Bericht ohne Aufruf des Druckmenüs "direkt" drucken.
Es geht also um den ,,Schnelldruck" eines bereits geöffneten Berichtes stets mit dem Standardrucker durch Anklicken des Buttons (2).
(1) Code für Druckmenü:
Private Sub Schaltfläche_Druckmenü_Click()
'Ruft das Druckmenü auf
DoEvents
DoCmd.RunCommand acCmdPrint
End Sub
(2) Der Code für den Schnelldruck:
Private Sub Schaltfläche_Schnelldruck_Click()
'Druckt das Dokument sofort aus (Schnelldruck)
DoCmd.PrintOut
End Sub
Der Schnelldruck (2) funktioniert, solange der letzte Druckvorgang mit dem Standarddrucker ausgeführt wurde.
Habe ich aber z.B. zuletzt ein Dokument als ein pdf ,,ausgedruckt", funktioniert der Schnelldruck auf den Standarddrucker nicht mehr, sondern es öffnet sich beim Anklicken des Buttons (2) das Verzeichnis zum Speichern des pdf-Dokumentes.
In Windows ist der Standarddrucker festgelegt.
Gedruckt wird scheinbar immer mit dem zuletzt verwendeten "Drucker", s.h. auch dem "pdf-Drucker".
Meine bisherige Suche war ohne Erfolg:
Die Hinterlegung des Druckers im Berichtsentwurf über ,,Seite einrichten / Seite > Standarddrucker" führt nicht zum gewünschten Ergebnis.
Auch meine Ergänzung des Codes (2) um die Definition des Druckers klappt nicht:
Private Sub Schaltfläche_Schnelldruck_Click()
Set Application.Printer = Application.Printers("Druckername")
'Druckt das Dokument sofort aus (Schnelldruck)
DoCmd.PrintOut
End Sub
Es wird "DoCmd.PrintOut" als Fehler markiert.
Kann mir jemand helfen ? Ich habe bisher nichts gefunden, womit ich das Problem mit meinen begrenzten VBA-Bordmitteln lösen kann.
Danke für Eure Unterstützung.
Jochen
Hallo Jochen,
also ich würde das anderst lösen.
Zum einen könntest Du den Bericht in der Seitenansicht öffen.
Da kannst Du diesen dann über das Druckmenü geziehlt an einen Drucker senden (falls nötig).
Im Formular (von dem Du Deine Berichtsansicht öffnest) würde ich mir einen Button für den Schnelldruck erstellen.
Der dazu benötigte Befehl lautet:
DoCmd.OpenReport...
Bei diesem Befehl hast Du verschiedene Möglichkeiten.
Schnelldruck:
DoCmd.OpenReport "Dein Berichtname", acViewNormal
Seitenansicht:
DoCmd.OpenReport "Dein Berichtsname", acViewPreview, "", ""
Gruß
Hubert
Hallo Hubert,
danke für Deine Antwort.
Bei Deiner Lösung tritt m.E. auch das Problem auf, dass der Button für den Schnelldruck (dann auf dem Formular) auch nicht den gewünschten Drucker anspricht, sondern ggfs. das Verzeichnis öffnet, wohin es das pdf speichern möchte, wenn zuletzt ein pdf-Druck erfolgt ist.
Bei mir ist der Aufbau etwas anders. Ich habe ein Formular mit einem Kombinationsfeld, aus dem ich den jeweiligen Bericht (aus ca. 30) auswähle und über einen Button zunächst in der Berichtsansicht öffne. Manchmal möchte ich ihn mir nur ansehen, ohne ihn sofort zu drucken.
Der Bericht ist also bereits geöffnet. Das Druckmenü kann ich bereits durch den anderen Button (1) auf dem Bericht aufrufen.
Das funktioniert alles prima, alleine besteht das Problem, das ich einen bestimmten Drucker in dem VBA-Befehl für den Schnelldruck (2) hinterlegen möchte, ich es aber nicht schaffe, dass der Code den Drucker auswählt, den ich möchte.... ::)
Wie würdest Du denn den gewünschten Drucker bei Deiner Lösung in Deinem Button für den Schnelldruck ansprechen ?
Viele Grüße,
Jochen
Zitat von: Jochen1 am Februar 23, 2023, 17:51:02Auch meine Ergänzung des Codes (2) um die Definition des Druckers klappt nicht:
Weil du nicht den Drucker für den Bericht festlegst, sondern den Standarddrucker für die ganze Anwendung. Das hat keinen Effekt auf den Bericht, weil für diesen ja bereits ein abweichender Drucker festgelegt wurde.
So setzt du den Drucker für einen konkreten Bericht auf den Standarddrucker der Anwendung:
Set DeinBericht.Printer = Application.Printer Oder so einen konkreten Drucker, der nicht der Standarddrucker ist:
Set DeinBericht.Printer = Application.Printers("Druckername")
Hallo PhilS,
danke für die Hilfe, das ist das, was ich suche !
aber..., sowohl bei
Set DeinBericht.Printer = Application.Printerals auch
Set DeinBericht.Printer = Application.Printers("Druckername")kommt die Fehlermeldung
ZitatLaufzeitfehler 424 "Objekt erforderlich"
Den Druckernamen habe ich Original aus den Systemeigenschaften von Windows kopiert, der Drucker ist auch als Standarddrucker eingestellt. Der Bericht ist auch richtig geschrieben.
Hier der verwendete Code:
Private Sub Schaltfläche_Schnelldruck_Click()
Set TestBericht.Printer = Application.Printers("HP LaserJet Professional M1217nfw MFP")
DoCmd.PrintOut
End SubHm, woran kann es noch liegen ?
Danke und Grüße,
Jochen
P.S. Ich nutze Access 2010
"DeinBericht" in meinem Beispielcode ist ein Platzhalter für den Bericht als Report-Objekt, nicht nur für den Namen.
Wenn dein Bericht "TestBericht" heißt, und geöffnet ist, müsste die Codezeile lauten:
Set Reports("TestBericht").Printer = Application.Printers("HP LaserJet Professional M1217nfw MFP")
KLASSE :) !! Jetzt funktioniert es. Danke für die Hilfe !
Wenn ich jetzt noch eins draufsetzen darf:
Der auszudruckende Bericht ist (in der Berichtsansicht) geöffnet. Kann ich in das Objekt
Set Reports("TestBericht").Printer
statt des "TestBericht" den jeweiligen Namen des gerade geöffneten Berichts (auf dem sich der Button mit dem Code befindet), auch z.B. über eine Variable automatisch einfügen ?
Der Grund dafür ist, dass ich bei Ergänzung der Datenbank hin- und wieder einen Bericht umbenenne (und dann die Folgeänderungen übersehe). Dann würde dies automatisch in dem Code berücksichtigt.
Das wäre grandios ;D .
Danke und Grüsse,
Jochen
Zitat von: Jochen1 am Februar 24, 2023, 12:30:19statt des "TestBericht" den jeweiligen Namen des gerade geöffneten Berichts (auf dem sich der Button mit dem Code befindet), auch z.B. über eine Variable automatisch einfügen ?
Der Button befindet sich wirklich
auf dem Bericht selbst?
Das ist ungewöhnlich, macht die Sache aber sehr einfach:
Set Me.Printer = Application.Printers("HP LaserJet Professional M1217nfw MFP")
Ja, er befindet sich wirklich direkt auf dem Bericht, ebenso wie -neben dem Aufruf des Druckmenüs -jeweils ein Button, der zum Formular für die Berichtsauswahl bzw. zum Hauptmenü zurückgeht:
20230224 Screenshot Buttons.jpg
Die Buttons werden beim tatsächlichen Drucken nicht ausgedruckt, sondern nur in der Berichtsansicht auf dem Bildschirm angezeigt.
Für Profis ungewöhnlich, für mich aber sehr praktisch und hat i.d.F.
Zitatdie Sache aber sehr einfach
gemacht...!
Ich packe den Code jetzt noch in eine Funktion für den Button, dann ist es (für mich) perfekt !
Nochmals vielen Dank für die schnelle Unterstützung !
Jochen
.... da war ich etwas voreilig hinsichtlich der Funktion, denn Access meckert das Schlüsselwort "Me" an.
Lässt sich Set Me.Printer mit einfachen Mitteln in eine "Public-Funktion" bringen ?
Wenn nicht, auch nicht schlimm, ich muss die Berichte sowieso anfassen, und sie funktionieren mit ja bereits mit dem Code.
Danke und Grüße,
Jochen
Zitat von: Jochen1 am Februar 24, 2023, 15:23:01Lässt sich
Code [Auswählen] Erweitern
Set Me.Printer mit einfachen Mitteln in eine "Public-Funktion" bringen ?
Ja, indem du das Report-Objekt als Argument an die Prozedur übergibst.
Public Sub DruckerSetzen(derBericht as Report)
Set derBericht.Printer = Application.Printers("HP LaserJet Professional M1217nfw MFP")
End SubAufruf im Bericht:
DruckerSetzen Me
Hallo,
danke, aber ich befürchte, das übersteigt meine Fähigkeiten :o .
Im Button "Schnelldruck" im Bericht möchte ich beim Klicken die Funktion =fct_Sofortdruck hinterlegen.
Dies habe ich nun in einem Modul hinterlegt:
Public Sub DruckerSetzen(derBericht As Report)
Set derBericht.Printer = Application.Printers("HP LaserJet Professional M1217nfw MFP")
End Sub
Public Function fct_Sofortdruck()
DruckerSetzen Me
DoCmd.PrintOut
End Function
Das funktoniert natürlich so einfach nicht, "Me" wird angemeckert....
Die Idee dahinter ist, dass ich einen evtl. Austausch des Druckers über die Funktion komfortabel in allen Berichten ändern kann.
Ich möchte Deine Unterstützung aber nicht überstrapazieren. Die Lösung davor ist schon super.
Grüße,
Jochen
Zitat von: Jochen1 am Februar 24, 2023, 18:03:16Das funktoniert natürlich so einfach nicht, "Me" wird angemeckert....
Ja, weil Me eine Referenz auf die Klasseninstanz (den Bericht oder das Formular) darstellt, in der sich der Code befindet.
Bei einer Prozedur in einem allgemeinen Modul handelt es sich nicht um die Instanz einer Klasse und somit ist Me nicht zulässig.
Entweder du kopierst fct_Sofortdruck in jeden deiner Berichte, oder du übergibst den Namen des aktuellen Berichts an die Funktion und holst dir dann das Berichtsobjekt aus der Reports-Collection.
Also so:
Public Function fct_Sofortdruck(ByVal BerichtName as String)
DruckerSetzen Reports(BerichtName)
DoCmd.PrintOut
End FunctionIn die BeimClicken-Eigenschaft schreibst du dann:
=fct_Sofortdruck([Name])
Hallo,
ich habe etwas "experimentiert", komme aber mit der Funktion nicht zurecht.
Ich komme klar mit der Druckerdefinition, wenn ich den Code
Set Me.Printer = Application.Printer
DoCmd.PrintOutin die BeimClicken-Eigenschaft des Schnelldruck-Buttons aller Berichte einfüge. Wenn es sich um den "Standarddrucker" handelt, ist das vollkommen ausreichend. Aufwendiger ist es, wenn es sich nicht um den Standarddrucker handelt und der Drucker dann einmal gewechselt wird.
Zitat[Auswählen]
Public Function fct_Sofortdruck(ByVal BerichtName as String)
DruckerSetzen Reports(BerichtName)
DoCmd.PrintOut
End Function
In die BeimClicken-Eigenschaft schreibst du dann:
=fct_Sofortdruck([Name])
Hier scheitere ich, weil ich es nicht verstehe (Fehler: "das Objekt enthält das Automatisierungsobjekt nicht").
Zum einen weiss ich nicht, wie ich dann den Drucker innerhalb
fct_Sofortdruck() definieren kann.
Zum anderen müsste ich doch jeweils den "Name" des jeweiligen Berichtes in der BeimClicken-Eigenschaft in die Klammer des Funktionsausdrucks einfügen, wenn ich im Button die Funktion hinterlege ?
Meine Hoffnung ist, innerhalb der
fct_Sofortdruck() den gewünschten Drucker festzulegen und dass die Funktion "automatisch" den Berichtsnamen des geöffneten Berichtes, in dem die Funktion verwendet wird, zum Drucken übernimmt.
Ist das so überhaupt möglich ?
Grüsse,
Jochen
Zitat von: Jochen1 am Februar 25, 2023, 16:33:19Zum einen weiss ich nicht, wie ich dann den Drucker innerhalb fct_Sofortdruck() definieren kann.
Genau das tut der gezeigte Code. Mit
Reports(BerichtName) wird anhand des
BerichtName die Instanz des Berichts aus der
Reports-Collection ermittelt und dann an die Prozedur
DruckerSetzen übergeben.
Zitat von: Jochen1 am Februar 25, 2023, 16:33:19Zum anderen müsste ich doch jeweils den "Name" des jeweiligen Berichtes in der BeimClicken-Eigenschaft in die Klammer des Funktionsausdrucks einfügen, wenn ich im Button die Funktion hinterlege ?
Ja, im Prinzip richtig. Du kannst auch schreiben:
=fct_Sofortdruck("DerNameDesJeweiligenBerichts") Musst du aber nicht, stattdessen kannst du auch, wie oben vorgeschlagen, schreiben:
=fct_Sofortdruck([Name]) Im Kontext eines Berichts wird dann [Name] aufgelöst zur
Name-Eigenschaft des Berichts und somit ebenfalls der Berichtsname an die Funktion
fct_Sofortdruck übergeben. - Das hat den Vorteil, dass du den Bericht jederzeit umbenennen kannst ohne den Funktionsaufruf in der
BeimClicken-Eigenschaft anzupassen.
Hallo PhilS,
vielen Dank für die Antwort, jetzt funktioniert es :) !
Jetzt ist leider ein kleines Folgeproblem aufgetaucht:
Beim Ausdruck wird nicht erkannt, in welchem Format der Bericht vorliegt (Hoch- Querformat), unabhängig, ob ich in der Funktion Application.Printer oder den definierten Drucker hinterlege. Es wird immer im Hochformat gedruckt. Auch das Komprimieren/Reparieren/Neustart der DB hat nichts gebracht.
Das ist eigenartig, denn mit der bisherigen Schnelldruck-Funktion
Private Sub Schaltfläche_Schnelldruck_Click()
'Druckt das Dokument sofort aus (Schnelldruck)
DoCmd.PrintOut
End Sub
ist das nicht aufgetaucht. Der Fehler ist reproduzierbar.
Zudem ist nach dem Druck der Bericht nur noch "verzerrt" und lückenhaft auf dem Bildschirm zu sehen, keine Ahnung warum. EDIT: Durch "DoCmd.Requery" lässt sich Letzteres abfangen.
Hast Du eine Idee, woran das mit der Druckausrichtung liegen könnte ?
Jochen
Zitat von: Jochen1 am Februar 26, 2023, 12:26:12DoCmd.PrintOut
Zitat von: Jochen1 am Februar 26, 2023, 12:26:12Beim Ausdruck wird nicht erkannt, in welchem Format der Bericht vorliegt (Hoch- Querformat), unabhängig, ob ich in der Funktion Application.Printer oder den definierten Drucker hinterlege. Es wird immer im Hochformat gedruckt.
"nicht erkannt"?
D.h. du hast für den Bericht explizit Querformat eingestellt, aber es wird trotzdem im Hochformat gedruckt?
Ändert sich dabei das eingestellte Berichtsformat in Access?
Wenn ja, kannst du mal versuchen nachzuvollziehen, wann diese Änderung genau passiert?
Hallo,
ZitatD.h. du hast für den Bericht explizit Querformat eingestellt, aber es wird trotzdem im Hochformat gedruckt?
Ja.
ZitatÄndert sich dabei das eingestellte Berichtsformat in Access?
Es gibt unterschiedliche Berichte, entweder als Hoch- oder Querformat gespeichert.
Nach dem Drucken des Berichtes mit Querformat (der als Hochformat über mehrere Seiten ausgedruckt wird) steht in der Entwurfsansicht der Bericht auf "Hochformat". Wenn ich den Bericht schliesse, werde ich nicht zum Speichern aufgefordert.
Beim erneuten Öffnen des Berichtes steht er in der Entwurfsansicht wieder auf "Querformat". Das Hochformat wird also nicht im Bericht "hinterlegt", das Format scheint vor bzw. während des Druckvorgangs auf Hochformat zu springen.
Dieses Verhalten habe ich noch nie festgestellt, der Druck hat stets im hinterlegten Berichtsformat (seit Jahren) geklappt. Es gibt auch keine Änderungen an der Druckerkonfiguration o.ä.. Ganz eigenartig.
Die von mir im erwähnte "verzerrte Anzeige" tritt direkt nach dem Drucken auf. Z.B. werden die Buttons (bis auf den Schnelldruck-Button) nicht mehr angezeigt. Die Anzeige wirkt nach meinem Eindruck "auf Hochformat verdichtet".
Beim Ausdruck über das Druckmenü mit dem identischen Drucker erfolgt der Druck im gewünschten Querformat.
Grüße,
Jochen
Zitat von: Jochen1 am Februar 27, 2023, 09:55:59Nach dem Drucken des Berichtes mit Querformat (der als Hochformat über mehrere Seiten ausgedruckt wird) steht in der Entwurfsansicht der Bericht auf "Hochformat". Wenn ich den Bericht schliesse, werde ich nicht zum Speichern aufgefordert.
Ich hatte gehofft, du findest den genauen Zeitpunkt, wann sich das Format von Quer auf Hoch ändert. Dann könntest du vorher das eingestellte Format speichern und es nach der ungewollten Änderungen wieder auf den zuvor gespeicherten Wert setzen.
Ich kenne dieses Verhalten nicht und kann es auch bei mir in genau diesem Szenario nicht reproduzieren.
Hallo,
Ich hatte gehofft, du findest den genauen Zeitpunkt, wann sich das Format von Quer auf Hoch ändert.
Das mache ich gerne, aber wie stelle ich das an, der Druck erfolgt sehr schnell und währenddessen kann ich nicht auf den Bericht zugreifen ?
Zitat von: Jochen1 am Februar 27, 2023, 11:03:13Hallo,
Ich hatte gehofft, du findest den genauen Zeitpunkt, wann sich das Format von Quer auf Hoch ändert.
Das mache ich gerne, aber wie stelle ich das an, der Druck erfolgt sehr schnell und währenddessen kann ich nicht auf den Bericht zugreifen ?
Mit welchem Befehl knnte ich das versuchen ?
Ich nehme an, dieser müsste dann zwischen die beiden Zeilen
DruckerSetzen Reports(BerichtName)
DoCmd.PrintOut
und das "Rückgängigmachen" im Anschluss ?
Ich probiere das gerne, aber bräuchte Hilfe, wie der Befehl lauten müsste.
Danke für die Unterstützung !
Ich hatte etwas vorschnell eine Lösung mit Verweis auf die Eigenschaft Orientation (Ausrichtung) des Berichts gepostet. - Auf den zweiten Blick hat sich herausgestellt, dass diese Eigenschaft die Leserichtung (vLnR oder vRnL) meint.
Die vermutlich richtige Eigenschaft ist die Orientation des Printer-Objektes. Da ich vermute, dass diese beim Ändern des Druckers verloren geht. - Das solltest du ggfls. nochmal genauer verfolgen.
Auf Basis dieser Annahme würde ich den Code in der DruckerSetzen Prozedur unterbringen. Z.B. so:
Public Sub DruckerSetzen(derBericht As Report)
Dim oldOrientation As AcPrintOrientation
oldOrientation = derBericht.Printer.Orientation
Set derBericht.Printer = Application.Printers("HP LaserJet Professional M1217nfw MFP")
derBericht.Printer.Orientation = oldOrientation
End Sub
Hallo,
mit diesem Code funktioniert es jetzt :), super !
Um zu testen, ob der Fehler mit der Ausrichtung an meiner DB lag, hatte ich das Ganze zusätzlich in eine neue Datenbank gespeichert, aber der Fehler liess sich dort und auf einem anderen Rechner reproduzieren.
Da ich vor diesem Thread nirgendwo etwas (für mich) Verwertbares gefunden habe, nachstehend noch einmal eine kurze Zusammenfassung für alle, die auch mit diesem Problem konfrontiert sind und bei ihrer Suche im Netz auf diesen Post stossen:
Der nachstehende Code erlaubt es, mittels einer auf einem Bericht hinterlegten Schaltfläche einen Bericht im Schnelldruck mit dem gewünschten Drucker auszudrucken, ohne das Druckmenü aufzurufen. Der Code wählt dabei den "Standarddrucker" oder einen hinterlegten Drucker aus, auch wenn zuletzt mit einem anderen Drucker gedruckt worden ist.
In einem Modul hinterlegen:
Public Sub DruckerSetzen(derBericht As Report)
Dim oldOrientation As AcPrintOrientation
oldOrientation = derBericht.Printer.Orientation
Set derBericht.Printer = Application.Printers("Druckername")
'Set derBericht.Printer = Application.Printer wäre der "Standarddrucker"
derBericht.Printer.Orientation = oldOrientation
End Sub
Public Function fct_Sofortdruck(ByVal BerichtName As String)
DruckerSetzen Reports(BerichtName)
DoCmd.PrintOut
DoCmd.Requery 'Optional. Aktualisiert den Bericht nach dem Drucken, wenn Berichtsanzeige nach Drucken auf Bildschirm verzerrt dargestellt wird.
End Function
In der "BeimKlicken"-Eigenschaft" der Schaltfläche auf dem Bericht hinterlegen:
=fct_Sofortdruck([Name])
Die Beispieldatenbank habe ich hochgeladen:
Database1.zip
Nochmals vielen Dank an Dich, PhilS, für Deine Geduld und Unterstützung bei der Lösung meines Problems !
Jochen
@Jochen1, vielen Dank für das Feedback und die Beispiel-DB.