Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Laufzeitfehler 2501 'Die Aktion OpenReport wurde abgebrochen'

Begonnen von Gockel67, Juni 20, 2026, 10:15:38

⏪ vorheriges - nächstes ⏩

Gockel67

Moin Gemeinde,

meine Datenbank respektive Access treibt mich gerade in den Wahnsinn.
Egal was ich mache - ich erhalte bei einem Klick auf einen Button der einen Bericht öffnen soll immer obige Fehlermeldung.

Was ich bis jetzt versucht habe:

Datensatzherkunft überprüft.
Neuen Bericht erstellt.
Datenbank neu erstellt.
Leere Testdatenbank mit einem Formular und einem Button, einer Tabelle und einem Bericht.
Officereperatur ausgeführt.

Immer kommt die Fehlermeldung 2501.
Wenn man den Bericht direkt aufruft wird er ordnungsgemäß angezeigt

Jemand von euch eine Idee woran es liegen könnte?
Falls es wichtig ist - folgende Accessversion kommt zum Einsatz
Microsoft Office LTSC Professional Plus 2024

Wünsche allen ein schönes Wochenende
Jörg

Gockel67

Moin Gemeinde,

nochmal ich. Hab den Fehler gefunden.
Ich weiß nicht wie es passieren konnte - aber plötzlich war mein Etikettendrucker als Standarddrucker eingstellt.
Wieder auf den normalen umgestellt und alles funktioniert.
Vielleicht ist die Info für andere Suchende mal interessant.

Wünsche allen ein schönes Wochenende
Jörg

Bitsqueezer

Hallo,

die Meldung kommt auch, wenn Du in Report_Open Cancel=True setzt.

Daher am besten immer einen Error-Handler in der aufrufenden Prozedur verwenden und dort den Fehler 2501 abfangen und ignorieren.

Gruß

Christian

Debus

Hallo Jörg,

oder Du machst folgende Wege (natürlich nur einen davon)


Den Drucker direkt hart im Code beim Button hinterlegen dadurch kommt der Fehler auch nicht mehr. Dafür musst Du natürlich wissen wie Dein Drucker heißt und den darfst Du natürlich auch nicht umbenennen.

Private Sub btnDrucken_Click()
On Error GoTo ErrHandler

    Dim rpt As Report
    Dim strAlterDrucker As String
   
   
    DoCmd.OpenReport "DeinBerichtsname", acViewDesign, , , acHidden
    Set rpt = Reports("DeinBerichtsname")
   
   
    strAlterDrucker = rpt.Printer.DeviceName
   
   
    Set rpt.Printer = Application.Printers("HP LaserJet M404") ' <- Hier deinen Drucker eintragen
   
   
    DoCmd.Close acReport, "DeinBerichtsname", acSaveYes
    DoCmd.OpenReport "DeinBerichtsname", acViewNormal ' Druckt sofort
   
   
    DoCmd.OpenReport "DeinBerichtsname", acViewDesign, , , acHidden
    Reports("DeinBerichtsname").Printer = Application.Printers(strAlterDrucker)
    DoCmd.Close acReport, "DeinBerichtsname", acSaveYes
   
ExitHandler:
    Set rpt = Nothing
    Exit Sub
   
ErrHandler:
    If Err.Number = 2501 Then
        Resume Next
    Else
        MsgBox "Fehler " & Err.Number & ": " & Err.Description
    End If
    Resume ExitHandler
End Sub


Wenn Du wissen willst wie Deine Drucker im Windows heißen, dan schau mal so nach:

Dim p As Printer
For Each p In Application.Printers
    Debug.Print p.DeviceName
Next p


Die zweite Lösung ist die, den Drucker über einen Auswahlbox auszusuchen/ein zu geben:


Private Sub btnDruckenMitListe_Click()
On Error GoTo ErrHandler
   
    Dim rpt As Report
    Dim p As Printer
    Dim strDrucker As String
   

    For Each p In Application.Printers
        strDrucker = strDrucker & p.DeviceName & ";"
    Next p
   

    strDrucker = InputBox("Welchen Drucker möchtest Du verwenden?" & vbCrLf & _
                          Replace(strDrucker, ";", vbCrLf), "Drucker wählen")
   
    If strDrucker = "" Then Exit Sub ' Abgebrochen
   
    DoCmd.OpenReport "DeinBericht", acViewDesign, , , acHidden
    Set Reports("DeinBericht").Printer = Application.Printers(strDrucker)
    DoCmd.Close acReport, "DeinBericht", acSaveYes
    DoCmd.OpenReport "DeinBericht", acViewNormal
   
ExitHandler:
    Exit Sub
ErrHandler:
    If Err.Number <> 2501 Then MsgBox Err.Description
    Resume ExitHandler
End Sub

Hier wird kein OCX verwendet. Du kannst natürlich auch das  ganze mit einem OCX und Windows Boardmittel machen. Wenn Du willst kann ich auch das noch posten.

Holger


Knobbi38

ZitatDoCmd.OpenReport "DeinBericht", acViewDesign, , , acHidden
Set Reports("DeinBericht").Printer = Application.Printers(strDrucker)
DoCmd.Close acReport, "DeinBericht", acSaveYes
DoCmd.OpenReport "DeinBericht", acViewNormal    DoCmd.OpenReport "DeinBericht", acViewDesign, , , acHidden
In einer Klick-Prozedur zum Drucken eher weniger geeignet. Damit würde man jedesmal den Default Printer eines Reports unnötiger weise neu zuweisen und dann den Report abspeichern.
Entweder man macht das temporär, oder über das Ribbon ordnet man dem Report den Drucker einmalig zu.

Knobbi38

Debus

Hallo Ulli,

da hast Du mal wieder recht. Wenn man das nicht will, sondern nur den Drucker anders ansteuern will geht es natürlich auch.

Ich würde mal so schauen

Private Sub btnDruckenDirekt_Click()
On Error GoTo ErrHandler
    Dim strDrucker As String
    Dim p As Printer
         

    For Each p In Application.Printers
        strDrucker = strDrucker & p.DeviceName & ";"
    Next p
   

    strDrucker = InputBox("Welchen Drucker verwenden?" & vbCrLf & _
                          Replace(strDrucker, ";", vbCrLf), "Drucker wählen")

    DoCmd.OpenReport "DeinBericht", acViewPreview, , , acHidden
   

    Reports("DeinBericht").Printer = Application.Printers(strDrucker)
   

    DoCmd.PrintOut acPrintAll
   
    DoCmd.Close acReport, "DeinBericht"
   
ExitHandler:
    Exit Sub
ErrHandler:
    If Err.Number <> 2501 Then MsgBox Err.Description
    Resume ExitHandler

End Sub

Hier wird nichts verändert

Holger

Knobbi38

Hallo Holger,

das Zuweisen eines Printers kann je nach Report etwas Zeit in Anspruch nehmen, weil der Report dabei neu gerendert wird. Da Docmd sich immer auf das aktiv Objekt bezieht, verwende ich zur Sicherheit noch ein SelectObject:
DoCmd.OpenReport Reportname:=Reportname, _
                View:=acViewPreview, WindowMode:=acHidden
DoCmd.SelectObject acReport, Reportname
DoCmd.PrintOut
DoCmd.Close acReport, Reportname

Tip:
Manchmal werden Reports direkt einem speziellen Drucker zugeordnet, z.B. wenn der Ausdruck nur für einen Etikettendrucker sinnvoll ist. Um trotzdem eine generische Prozedur für das Ausdrucken verwenden zu können, kann die Property "UseDefaultPrinter" für die Zuweisung des Printers ausgewertet werden:
If Reports(Reportname).UseDefaultPrinter Then
    Set Reports(Reportname).Printer = objPrinter
End If

Knobbi38