DataGrid Drucken

Schönen guten Hallo,
ich mal wieder.

Also nu is mein Programm zu 99% fertig funktioniert alles wunderbar und schön schnell :wink:

Also was ich jetz noch brauche ist eine Drucken Funktion.

Und zwar…
Datagrid Aufbau:
7 Sichtbare Spalten
22 Nicht Sichtbare Spalten

Die Informationen die gedruckt werden sollen, sollen

  1. Auf eine A4 Seite Passen
  2. Nach möglichkeit in einem Formular sein
  3. Aus sichtbaren und unsichtbaren Spalten bestehen
  4. Lesbar sein
  5. Die Spalten sollen so skaliert werden das kein platz verschwendet wird.

Ich habe da schon eine Drucken Funktion gefunden die ganz gut aussah.
Aber sie funktioniert nicht ^^

 Dim fmt As String
 Dim sRow As String
 Dim xPos As Long
 Dim I As Long
 Dim intProz As Integer
 Dim GridWidth As Long
 Dim ColWidth As Long
 Dim PageWidth As Long
 Dim sHeader As String

 Screen.MousePointer = 11
 With Printer
 .ScaleMode = 6 ' Maßeinheit "mm"
 xPos = 20 ' 20mm Rand link

 .Font.Name = "Arial"
 .Font.Size = 12

 ' Listenbezeichnung
 .CurrentY = 10
 .CurrentX = xPos
 .Font.Bold = True
 Printer.Print DGV.Caption + vbCrLf
 .Font.Bold = False

 ' Format (Spaltenbreiten) + Tabellenkopf
 ' anhand Bildschirm-Spaltenbreite ermitteln
 PageWidth = .ScaleWidth - (xPos \* 2)
 With DGV
 ' Gesamtbreite
 For I = 0 To .Columns.Count - 1
 If .Columns(I).Visible Then
 GridWidth = GridWidth + .Columns(I).Width
 End If
 Next I

 ' Prozentuale Verteilung auf die Spalten
 ' plus Tabellenkopf
 For I = 0 To .Columns.Count - 1
 With .Columns(I)
 ' zunächst Spaltenausrichtung berücksichtigen
 Select Case .Alignment
 Case dbgCenter
 ' zentriert
 fmt = fmt + "^"
 Case dbgRight
 ' rechtsbündig
 fmt = fmt + "\>"
 End Select

 ' jetzt Spaltenbreite berechnen
 intProz = (.Width / GridWidth \* 100 + 0.5)
 ColWidth = (PageWidth / 100 \* intProz + 0.5)
 fmt = fmt + Format$(ColWidth, "0")

 ' Tabellenkopf
 sHeader = sHeader + .Caption
 End With

 fmt = fmt + "|"
 sHeader = sHeader + "|"
 Next I

 ' abschliessendes "|" entfernen
 fmt = Left$(fmt, Len(fmt) - 1)
 sHeader = Left$(sHeader, Len(sHeader) - 1)
 End With

 ' Tabellenkopf drucken
 .Font.Bold = True
 .Font.Size = 9
 PrintRow xPos, fmt, sHeader
 .Font.Bold = False

 ' Jetzt Recordset "satzweise" ausdrucken
 .Font.Size = 8
 .CurrentY = .CurrentY + 5
 Rs.MoveFirst
 While Not Rs.EOF
 sRow = ""
 With DGV
 For I = 0 To .Columns.Count - 1
 If .Columns(I).Visible Then
 ' NumberFormat berücksichtigen
 If .Columns(I).NumberFormat "" Then
 sRow = sRow + Format$(FeldInhalt(Rs.Fields(I)), \_
 .Columns(I).NumberFormat) + "|"
 Else
 ' normaler Text / sonstige Datentypen
 sRow = sRow + CStr(FeldInhalt(Rs.Fields(I))) + "|"
 End If
 End If
 Next I
 PrintRow xPos, fmt, sRow
 End With

 ' nächster Datensatz
 Rs.MoveNext
 Wend

 ' Druckauftrag beenden
 .EndDoc
 End With
 Screen.MousePointer = 0

 MsgBox "Grid wurde ausgedruckt!", 64, "Drucken..."
End Sub

' Nullfeld abfragen
Public Function FeldInhalt(Feld As Field) As Variant
 If IsNull(Feld.Value) Then
 Select Case Feld.Type
 Case adInteger, adSmallInt
 FeldInhalt = 0
 Case adBoolean
 FeldInhalt = False
 Case Else
 FeldInhalt = ""
 End Select
 Else
 FeldInhalt = Feld.Value
 End If

Der fehler tritt bei der funktion „PrintRow“ auf.
Warum? Was muss geändert werden?

Hoffe jemand erbarmt sich den langen code zu lesen und mir n paar tipps zu geben ^^

Danke :smile:

Hallo Digitalfreak.

Eigentlich sollte die Drucken-Funktion schon deshalb nicht funktionieren, weil der Printer bzw. seine Eigenschaften nicht in einen With-Block geschrieben werden können.

Viele Grüße
Carsten

Doch sie funktioniert. Nur haut er alles durcheinander.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

PrintRow xPos, fmt, sHeader

Der fehler tritt bei der funktion „PrintRow“ auf.
Warum? Was muss geändert werden?

Was ist denn PrintRow? Eine selbstgeschriebene Sub oder Function?
Wenn ja, wieso postest du diese dann nicht?
Und ansonsten: Ich kenn Sie jedenfalls nicht, und mein VB auch nicht.

Oder hab ich was übersehen?

Gruß, Phil