Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Drucker für Schnelldruck festlegen

Begonnen von Jochen1, Februar 23, 2023, 17:51:02

⏪ vorheriges - nächstes ⏩

Jochen1

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
_______________
Access 2010

trebuh

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

Jochen1

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




 
_______________
Access 2010

PhilS

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")
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Jochen1

Hallo PhilS,

danke für die Hilfe, das ist das, was ich suche !

aber..., sowohl bei

Set DeinBericht.Printer  = Application.Printer
als 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 Sub

Hm, woran kann es noch liegen ?

Danke und Grüße,
Jochen

P.S. Ich nutze Access 2010

_______________
Access 2010

PhilS

"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")
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Jochen1


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

_______________
Access 2010

PhilS

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")
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Jochen1

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:

Sie dürfen in diesem Board keine Dateianhänge sehen.

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
_______________
Access 2010

Jochen1

.... 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

_______________
Access 2010

PhilS

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 Sub

Aufruf im Bericht:
  DruckerSetzen Me


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Jochen1

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
_______________
Access 2010

PhilS

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 Function

In die BeimClicken-Eigenschaft schreibst du dann:
=fct_Sofortdruck([Name])
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Jochen1

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.PrintOut
in 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





 
   


_______________
Access 2010

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor