Formatierte Word-Ausgabe

By , 17. September 2008

Um z.B. Rechnungen oder Lieferscheine zu erstellen und an den Kunden Weiterzugeben eignet sich nicht immer ein Access Bericht, vorallem dann nicht wenn die Weitergabe elektronisch in Form von einer E-Mail erfolgt.
Aus meiner Praxis hat sich als beste Methode herausgestellt, eine seprarate Word-Vorlage zu erstellen. Darin fügt man Textmarken ein, z.B. eine für den Kopf und in der Zeile darunter eine für die Angebotspositionen. Nur 2 Textmarkten? Genau, denn der Trick an der Sache ist, dass ich in der Zeile mit der Textmarke für die Angebotspositionen feste Tabulatoren einsetze:

Man benötigt die Tabulatoren z.B. für lfd.Nr, Artikelnummer, Menge + Einheit, Artikeltext, Euro-Zeichen und Preis. Beachtet wie rum die Tabulatoren gerichtet sind. Um z.B. bei den Preisen Komma und Tausender-Punkt untereinander zu haben muss man den Preis rechts ausrichten.

Wie das mit den Tabulatoren geht zeigt folgender Code. Word-Automation mit Late Binding, also ohne zusätzlichen Verweis auf Microsoft Word. Das macht allerdings erforderlich Konstanten des Objekts selbst zu definieren da diese dann nicht verfügbar sind:

Im Deklarationsbereich eines Moduls:

Global Const wdGoToBookmark = -1

Innerhalb eine Prozedur:

Dim Ausgabe As String
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Documents.Add (CurrentProject.Path & "/angebot.dot")
objWord.Visible = True

' zuerst den Textkopf schreiben
With objWord.Selection
    .GoTo What:=wdGoToBookmark, Name:="Angebotskopf"
    .TypeText Kopf & vbCrLf & vbCrLf & vbCrLf
    .GoTo What:=wdGoToBookmark, Name:="Angebotsposition"
End With

' innerhalb einer Schleife über alle Datensätze die Positionen schreiben
Do While Not rs.EOF
    Ausgabe = rs!lfdnr & vbTab & rs!Artikelnr & vbTab & rs!MengeEinheit & vbTab
    Ausgabe = AusgabeText  & rs!Beschreibung & vbTab & "EUR" & vbTab & rs!Preis
    With objWord.Selection
        .TypeText Ausgabe & vbcrlf & vbcrlf
    End With
    rs.moveNext
loop

rs.Close
Set rs = Nothing
Set objWord = Nothing


Zwei Probleme tun sich bei diesem Code allerdings auf:
1. Ist die Artikelbeschreibung länger ist als der vorgesehene Platz wird das Layout verrissen.
2. Mehrzeilige Artikelbeschreibung führt dazu dass EUR und Preis auf der Ebene der untersten Zeile der Artikelbeschreibung geschrieben wird und so ein unschöner Versatz entsteht.

Diese Erkenntnis führt dazu, dass man den Beschreibungstext splitten muss in ein Array, und diesen zeilenweise schreiben muss. Dabei gilt zu Bedenken, dass wir nicht mitten im Wort splitten möchten. Wir müssen also prüfen ob der Text länger als x Zeichen ist, und wenn ja Zeichenweise den Text untersuchen und das entscheidende Leerzeichen finden. Andere Trennstellen wären nach einem Punkt oder einem Komma. Dieser Code ist relativ komplex, ich möchte das an dieser Stelle aussparen. Wir haben nun also ein Array arrZeile.

Im Code muss jetzt unterschieden werden zwischen der ersten Zeile und den restlichen Zeilen, denn in der ersten soll ja auch EUR und Preis stehen.

Do While Not rs.EOF
    ' 1. Zeile Ausgeben
    Ausgabe = rs!lfdnr & vbTab & rs!Artikelnr & vbTab & rs!Menge & vbTab
    Ausgabe = Ausgabe & arrZeile(0) & vbTab & "EUR" & vbTab & rs!Preis
    With objWord.Selection
        .TypeText Ausgabe & vbcrlf

        ' restlichen Zeilen Ausgeben
        For i = 1 to ubound(arrZeile)-1
            Ausgabe = vbTab & vbTab & vbTab & arrZeile(i) & vbcrlf
            .TypeText Ausgabe
        End if
    End With
    rs.moveNext
loop

Als letztes fehlt noch ein wenig Formatierung. Z.B. wollen wir Zwischensummen einfach unterstreichen und die Endsumme doppelt. Auch könnte man Rubriken einfügen die man in Fettschrift möchte.

EUR und Preis Doppelt Unterstreichen geht so:

' Doppelt = 3
' Einfach = 1
' Nicht = 0

Ausgabe = rs!lfdnr & vbTab & rs!Artikelnr & vbTab & rs!Menge & vbTab & arrZeile(0)
With objWord.Selection
    .TypeText Ausgabe 

    .Font.Underline = 3
    .TypeText  vbTab & "EUR" & vbTab & rs!Preis & vbcrlf
    .Font.Underline = 0
End With

Man muss also zuerst das, was man nicht Formatieren möchte, mittels TypeText ausgeben, danach die Formatierung setzen, formatierenden Text ausgeben, Formatierung zurücksetzen.

Das gleiche gilt für die Fettschrift:

.Font.Bold = True
.TypeText "EUR" & vbTab & rs!Preis & vbcrlf
.Font.Bold = False

AV 2008

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy