Hallo zusammen,
ich wollte mir eine Funktion schreiben, die einen Bericht aus der aktuellen MDB zurückgibt:
Private Function getReportByName(ByVal strReport As String) As Report
Dim rpt As Report
Dim i As Integer
For Each rpt In Application.CurrentProject.AllReports
If rpt.Name = strReport Then
Set getReportByName = rpt
Exit Function
End If
i = i + 1
Next
End Function
Wird kompiliert, gibt aber den Laufzeitfehler "Typen unverträglich". Bei Objekt vom Typ AccessObject gibt es keinen Laufzeitfehler, ich weiß aber nicht, wie man das dann auf Printer castet.
Folgender Code (analog für das Printer-Objekt) funktioniert aber:
Private Function getPrinterByName(ByVal strDrucker As String) As Printer
Dim prn As Printer
Dim i As Integer
For Each prn In Application.Printers
If prn.DeviceName = strDrucker Then
Set getPrinterByName = prn
Exit Function
End If
i = i + 1
Next
End Function
Was mache ich falsch?
Hintergrund der Funktion ist, die Funktion Docmd.OpenReport zu kapseln und darin 1. zu prüfen, ob der Bericht existiert und 2. den Drucker zu setzen.
Danke für Tips
Hallo,
so wie ich das sehe, muss der Bericht geöffnet sein, damit der folgende Befehl funktioniert:Set getReportByName = rpt
Nähere Informationen dürfte die Access-Hilfe zum Stichwort "allreports" liefern.
Hab gegoogelt. Über die Liste AllReports kann man nicht in ein Objekt vom Typ Printer casten und über die Liste Reports nur, wenn der Report geöffnet ist
Ich denke, ich hab jetzt eine Lösung. Das Problem war, daß man nur den Standarddrucker benutzen kann. Also lese ich den aus, setze den neuen Drucker als Standarddrucker und dann gleich wieder den alten Standarddrucker. Scheint zu funktionieren.
Private Sub ReportAusdrucken(ByVal strReport As String, ByVal strPrinter As String)
Dim prn As Printer
Dim prt As Printer
'Prüfen, ob der Report existiert
If ReportExistiert(strReport) = False Then Exit Sub
'Printer-Objekt für ausgewählten Drucker setzen
Set prt = getPrinterByName(strPrinter)
If prt Is Nothing Then Exit Sub
Debug.Print "Gewünschter Printer = " & prt.DeviceName
'Standarddrucker lesen
Set prn = Application.Printer
If prn Is Nothing Then Exit Sub
Debug.Print "Application.Printer = " & prn.DeviceName
'Ausgewählten Drucker als Standarddrucker setzen
Application.Printer = prt
'Drucken
DoCmd.OpenReport strReport, acViewNormal
'Zurücksetzen auf alten Standarddrucker
Application.Printer = prn
End Sub
Private Function getPrinterByName(ByVal strDrucker As String) As Printer
Dim prn As Printer
For Each prn In Application.Printers
If prn.DeviceName = strDrucker Then
Set getPrinterByName = prn
Exit Function
End If
Next
End Function
Private Function ReportExistiert(ByVal strReport As String) As Boolean
Dim aobj As AccessObject
For Each aobj In Application.CurrentProject.AllReports
If aobj.Name = strReport Then
ReportExistiert = True
Exit Function
End If
Next
End Function