Neuigkeiten:

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

Mobiles Hauptmenü

"Typen unverträglich" beim Suchen eines Berichts

Begonnen von Wurliwurm, Dezember 20, 2014, 20:30:28

⏪ vorheriges - nächstes ⏩

Wurliwurm

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

Wurliwurm

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