Hallo zusammen,
ich habe mir ein kleines Formular mit speziellen Druckbefehlen erstellt, dass mit div. Berichten (1-seitig) aufgerufen werden soll.
In dem VBA-Code des Druckmenüs DoCmd.PrintOut acPrintAll wird das aktuelle Objekt gedruckt.
Leider druckt er nur das Druckformular aus. Der Druckbefehl soll bei beliebigen Berichten aufgerufen werden.
Gibt es einen Code, der den aktuell geöffneten Bericht fokusiert?
Ich habe es mit DoCmd.SelectObject acReport, "Berichtname" probiert.
Es funktioniert auch, aber ich brauche jedesmal den entsprechenden Berichtsnamen.
Kann man den Berichtsnamen direkt auslesen? Report.Name oder so?
Danke im Voraus.
Gruß
Max
Hallo,
Zitat
der den aktuell geöffneten Bericht fokusiert... Kann man den Berichtsnamen direkt auslesen?
Screen.ActiveReport.Name
Hallo,
nachdem ich den Code eingebunden habe, erscheint die Fehlermeldung:
Laufzeitfehler 2476: Sie haben einen Ausdruck eingegeben, für den es erforderlich ist, dass das aktive Fenster ein Bericht ist.
Der Bericht ist definitiv geöffnet, aber vermutlich nicht aktiv.
Gruß
Max
Hallo,
wir sprachen ja auch vom "aktuellen" Bericht. Wenn der Focus nicht darauf ist, ist der Bericht auch nicht aktuell.
Es wird halt dann schwierig, das Berichtsfenster zu aktivieren, wenn der Berichtsname nicht bekannt ist.
Warum kennst Du den Namen denn nicht? Wie wird der Bericht geöffnet?
Vermutlich hast Du eine falsche Vorgehensweise.
Doch ich kenne den Berichtsnamen, jedoch wollte ich eigentlich das Druckmenü wenn möglich von Berichtsnamen freihalten, um es universell einzusetzen.
Es gibt viele Berichte, die aus verschiedenen Formularen aus aktiviert werden.
Gruß
Max
Hallo,
dem kann ich nicht folgen...
Es ist doch möglich, den Berichtsnamen bei Öffnen z. B. in eine globale Variable zu schreiben und diese dann dort zu verwenden, wo Du es gedenkst zu tun.
Hallo Max,
ZitatDoch ich kenne den Berichtsnamen
Du kennst sogar alle. Somit kannst du den richtigen Namen doch an der
richtigen Stelle übergeben. Die .OpenReport-Methode erwartet ja nur einen
String als Parameter (ReportName), und der kann auch mit einer Variablen
geliefert werden.
gruss ekkehard
Hallo,
die Sache scheint doch schwieriger zu sein, als ich dachte.
Gretchenfrage:
Muss ich den Berichtnamen im Ausgangsformular z.B. über ein Steuerelement bereitstellen (was bei diesem Formular nicht so einfach wäre) oder kann der Berichtsname direkt beim Öffnen des Berichts an einen VBA-Code übergeben werden? (Man sollte meinen, dass der Bericht seinen eigenen Namen kennt)
Im ersten Fall müsste im Druck-Code das Form benannt werden und bei anderen Formularen müsste der Code dann anders lauten. Kompliziert!
Im zweiten Fall müsste der Berichtsname vom Bericht-Öffnen-Code, mit dem gleichzeitig auch das Druckformular geöffnet wird, an den per Button ausgelösten Druck-Code übergeben werden. Aber wie?
Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt.
Gruß
Max
Hallo,
ich verstehe nur Bahnhof...
Was überhaupt willst Du (prinzipiell) denn machen?
Ich hoffe, du öffnest die Berichte per VBA-Code , bzw. per Ereignisprozeduren...
Und was müsste bei anderen Formularen anders heißen?
Was soll das "Druckformular" bewirken?
Ich kann mir nur vorstellen, als dass Du einen Bericht öffnen willst und dieser Bericht wiederum ein Popup-Form läd, mit dem verschiedene Druckparameter, z. B. ein passender Drucker eingestellt werden können.
In diesen Fall kann eine Funktion herhalten, die beim Öffnen des Berichtes aufgerufen wird und alle Maßnahmen ausführt, die an dieser Stelle vorgesehen sind.
Mit "Me.Name" erhältst du den Namen des Berichtes, z. B. in dessen Ereignisprozedur "Beim Laden" .
Die o. g. Funktion musst Du halt entspr. den Anforderungen programmieren.
Hallo Max,
Mir geht es ja wie Franz, so recht verstehen kann ich es auch nicht.
ZitatMuss ich den Berichtnamen im Ausgangsformular z.B. über ein Steuerelement bereitstellen
Nicht unbedingt, - du kannst deine Berichte, richtiger ihre Namen, ja
auch in einer Tabelle bereithalten.
Zitatoder kann der Berichtsname direkt beim Öffnen des Berichts an einen VBA-Code übergeben werden? (Man sollte meinen, dass der Bericht seinen eigenen Namen kennt)
Der Bericht natürlich, aber VBA musst du den zum Öffnen erstmal
bekannt geben.
DoCmd.OpenReport "NameDesBerichtes", ...Wenn du einen Bericht jedoch direkt aus dem Navigationsbereich öffnest,
kannst du VBA den Namen in der Weise bekannt geben, wie es Franz
beschrieben hat.
gruss ekkehard
Hallo,
entschuldigt bitte, dass ich mein Vorhaben nur so knapp geschildert habe. Ich nahm an, dass viele Accessler so ihre Berichte drucken würden.
Deshalb noch mal zum besseren Nachvollziehen:
Statt meine zahlreichen Berichte (Schriftverkehr mit Kunden) klassisch über den entsprechenden Menüpunkt Drucken auszugeben und ständig einen anderen Drucker wählen zu müssen (Normal/Konzept/PDF/Fax), hatte ich die Idee, ein Formular zu entwerfen, in dem die gewünschten Druckaufträge mit einem Klick über Optionsschaltflächen gestartet werden können. (Anzahl der Kopien gibts auch noch). Dieses kleine Formular ist als Popup definiert und wird mit dem Öffnen des Berichts gestartet.
Im Druckereignis steht :
DoCmd.SelectObject acReport, rpt 'Aktivierung des geöffneten Berichts
'Druckauftrag z.B.
Application.Printer = Application.Printers("Druckername")
DoCmd.PrintOut acPrintAll, , , , varAnz
Die Variable rpt enthält den Berichtsnamen.
Der wird durch das Öffnen des Berichts in dem entsprechenden Ereignis über me.Name (Danke dafür) an ein ungebundenes Steuerelement in ein Startformular, das immer geöffnet ist, gespeichert. (Das geht sicherlich auch eleganter über Variablen-Weitergabe im VBA; das beherrsche ich jedoch (noch) nicht.)
Der Druckbefehl holt sich wiederum den Berichtsnamen aus dem besagtem Steuerelement des Startformulars und speichert ihn in der Variablen rpt.
So, nun funzt es! Ich denke, das war's.
Danke Euch!!
Gruß
Max
Hallo Max,
Auch wenn es nun so läuft, könnte ich mir eine andere Vorgehensweise
vorstellen.
Du speicherst alle Einstellungen zu den Berichten in eine Tabelle. Diese
wird dann DS-Herkunft deines Forms. Die Steuerelemente bindest du an
die entsprechenden Felder der Tabelle. Das Form kannst du dann gefiltert
(s.u.) auf den aktuellen Bericht öffnen. Auf diese Weise hast du schon alle
Einstellungen parat, und der Anwender muss nur noch evtl. Änderungen
vornehmen.
Wie du geschrieben hast, öffnest du das Form beim Öffnen des Berichtes
in dieser Art
Private Sub Report_Open(Cancel As Integer)
DoCmd.OpenForm "DeinForm", ...
End Sub
Mit einer Tabelle als Basis dann so
Private Sub Report_Open(Cancel As Integer)
Dim lRptID As Long
lRptID = Nz(DLookup("ReportID", "TabelleMitBerichten", "ReportName = " & Me.Name), 0)
'falls vergessen wurde den Bericht in die Tabelle einzutragen, was du mit dem gebundenen Form auch nebenbei erledigen kannst
If lRptID = 0 Then
If MsgBox(Prompt:="Dieser Bericht und seine Einstellungen wurden noch nicht erfasst! Soll er angelegt werden", _
Buttons:=vbOKCancel) = vbOK Then
DoCmd.OpenForm _
FormName:="DeinForm", _
DataMode:=acFormAdd
'hier könntest du auch per OpenArgs gleich den Berichtsnamen mit übergeben, und im Form_Load-Ereignis dem Feld als Vorgabe spendieren
Else
Cancel = True
Exit Sub
End If
Else
DoCmd.OpenForm _
FormName:="DeinForm", _
WhereCondition:="ReportID = " & lRptID
End If
'wegen Kommazählerei alles mit benannten Parametern, weitere musst du deinen Bedürfnissen entspr. ergänzen
End Sub
gruss ekkehard
Hallo Ekkehard,
danke für Deinen Nachtrag.
Sofern ich zu der Erkenntnis gelange, dass das Eintragen des Ereignisses in jeden Bericht mir zu umständlich ist, werde ich Deinen Code ausprobieren.
Besonders komfortabel finde ich die Möglichkeit des nachträglichen Aufnehmens eines Berichtsnamens in die Tabelle!
Gruß
Max
Hallo Max,
ZitatSofern ich zu der Erkenntnis gelange, dass das Eintragen des Ereignisses in jeden Bericht mir zu umständlich ist, werde ich Deinen Code ausprobieren.
Klar, den kannst du natürlich auch in eine öffentliche Prozedur auslagern,
der du als Parameter einfach den Berichtsnamen mitgibst.
Public Sub OpenFormReports(sRepName As String)
.
'einzige Änderung
lRptID = Nz(DLookup("ReportID", "TabelleMitBerichten", "ReportName = " & sRepName), 0)
.
End SubAufruf
Private Sub Report_Open(Cancel As Integer)
Call OpenFormReports(Me.Name)
End Sub gruss ekkehard