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
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
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
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
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
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
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
Hallo Ulli,
werde ich mal einbauen
Danke
Holger
ZitatDoCmd.OpenReport Reportname:=Reportname, _
View:=acViewPreview, WindowMode:=acHidden
DoCmd.SelectObject acReport, Reportname
DoCmd.PrintOut
DoCmd.Close acReport, Reportname