So mancher Kunde verlangt ein bestimmtes Aussehen in der Rechnung. Zumindest habe ich ein paar solcher Kunden, wo der Auftragsaufbau ein bestimmtes Aussehen haben muss, bzw. bestimmte Daten enthalten sein müssen. Darüberhinaus habe ich immer wiederkehrende Aufträge bei gleichen Kunden und natürlich wäre es schön, wenn dann beispielsweise die Adresse oder eben der Auftrag entsprechend automatisiert werden kann.

 

Dokumentation
Code

 rechformulare

Unsere bisherige Rechnung wird nun erweitert und auch etwas umgebaut. Für die Individualität einzelner Kunden werden Userforms eingefügt. Entweder klicken Sie dazu auf das Icon oben oder im Pulldownmenü auf Einfügen und anschließend UserForm. Sie erhalten danach eine leere Form mit dem Namen UserForm 1.

Neben Ihrer Form sollte eine kleine Toolbox aufgehen, die die möglichen Steuerelemente enthält. Falls Sie diese nicht sehen, klicken Sie in der Iconleiste auf das Werkzeug-Icon oder im Pulldownmenü auf Ansicht / Werkzeugsammlung.

 

 

 

 

rechtoolboxWas macht was:

  • Pfeil = wird zum Verschieben oder Auswählen benötigt und kehrt standardmäßig immer wieder zu dieser Auswahl zurück
  • A = das große "A" ist ein Labelfeld. Also ein reines Beschriftungsfeld
  • ab| = Fügt einen Eingabebereich für einen Text ein.
  • "Pulldown-Icon" = Damit können Sie einen Pulldownbutton einfügen, der eine Auswahl enthält.
  • "Listbox-Icon" = Eine Auswahlliste mit Mehrfachauswahl-Möglichkeit
  • Checkbox = Auswahlfeld mittels Checkbox
  • Radiobutton = Nur eine Auswahl von mehreren vorgegebenen ist möglich
  • xyz = Macht einen Frame, eine Umrandung, um Ihre Felder. Sie müssen aber erst das Frame und dann die Felder, die im Frame liegen sollen auswählen
  • Button = Zum Beispüiel einen Okay-Button einfügen, mit dem das Formular abgesendet und verarbeitet wird
  • Registerkarten = Sie können auf die einzelnen Tabs nur programmiertechnisch zugreifen nd so beispielsweise dynamische Auswertungen erzeugen
  • Multisites = Hier können Sie in jedem Tab Ihre eigenen Steuerelemente/Formulartfelder unterbringen
  • Scrollbalken = Wenn Sie in Ihrem Formular scrollen möchten
  • Drehfeld = Damit können Sie beispielsweise Zahlenfelder nach vorn oder hinten in Ihren gewählten Schritten durchqueeren
  • Imagefeld = Um ein Bild einzufügen

Bei allen Elementen erscheinen auf der linken Seite die Eigenschaften, wo Sie die einzelnen Einstellungen vornehmen.

Leider kann ich Ihnen in diesem Tutorial keinen umfassenden Überblick über alle Elemente und den Möglichkeiten der UserForms geben. Lediglich einen kleinen Einblick und einfachen Formen, wie sie für unsere Rechnung reichen sollten.

 rechformularandere

 

Eine einfache UserForm zur Auftragserfassung.

Zunächst ändere ich den Namen der UserForm in "ufAndere". uf steht dabei für UserForm. In der Programmierung benutze ich diesen Namen und kann jederzeit erkennen, dass es sich um eine UserForm handelt. Auch wenn ich den Code erst wieder nach Monaten anfasse. Das Formular hat auch einen Titel, den ich in der Caption ändere.

Zunächst füge ich ein Labelfeld ein (das Feld mit dem großen "A" in der Toolbox) und ändere die Beschriftung mittels der Caption-Eigenschaft, wie auch schon beim Fenstertitel der ganzen Form. Daneben ziehe ich ein Textfeld ("ab|") über die restliche Form. Den Namen nenne ich in "txbAuftrag" um. txb steht dabei für "Textbox". Geben Sie hier unbedingt einen aussagenden Namen ein, weil mit den Eingabefeldern programmiert wird!

Unten drunter wieder ein Labelfeld. Ich habe meist Aufträge über mehrere Tage, manchmal aber auch nur für einen Tag. Deswegen prüfe ich später in der Programmierung ab, ob in "Bis" was steht oder nur ein eintägiger Auftrag vorlag. Deswegen die Bezeichnung "Von / Am". Aber natürlich können und müssen Sie das auch an Ihren Bedürfnissen anpassen. Zu guter Letzt muss das Honorar noch rein. Die Mehrwertsteuer wird dann automatisch berechnet.

Zuletzt den Okay-Button nicht vergessen. Einfach einen Button in das Feld ziehen, einen sprechenden Namen in Name eintragen, damit Sie den Button einwandfrei zuordnen können, und "Okay" in die Caption schreiben.

Danach klicken Sie doppelt auf Ihren Okay-Button. Damit kommen Sie direkt in die Programmierung.

Private Sub cmdAndereOk_Click()
Dim strAusgabe As String

strAusgabe = ufAndere.txbAuftrag & " - " & ufAndere.txbDatumVonAm
If ufAndere.txbDatumBis <> "" Then
strAusgabe = strAusgabe & " bis " & ufAndere.txbDatumBis
End If
ActiveDocument.Bookmarks("Auftrag").Range.InsertBefore strAusgabe
ufAndere.Hide
End Sub

Nach dem Doppelklick auf den OK-Button finden Sie eine zunächst leere Subroutine:

Private Sub cmdAndereOk_Click()

End Sub

Hier nun programmieren wir unsere erste Ausgabe:

in der Variablen strAusgabe setzen wir unsere bisherigen Eingaben in der UserForm zusammen. Also zunächst den Auftrag, gefolgt von einem Bindestrich und dann das erste Datum. Danach wird abgeprüft, ob im zweiten Datumfeld etwas steht. Wenn ja, dann erweitere die bisherige strAusgabe mit dem Wort "bis" und dem Inhalt des zweiten Textfeldes.

An dieser Stelle ist unsere Auftragsform bereits abgearbeitet. Deshalb kann nun die UserForm geschlossen werden mit ufAndere.Hide.

Private Sub Document_New()
On Error GoTo Fehler

Dim Zahl As Word.Table
Dim Rechnung(2) As Double
Dim Summe As String
Dim MwstHono As Double, MwstSpes As Double
Dim Ergebnis As Double
Dim Befreit As Boolean
Dim Kunde As String

Befreit = False
Ergebnis = 0
Set Zahl = ActiveDocument.Tables(1)

Kunde = InputBox("Kunde auswählen" & Chr(13) & "1 = Kunde x" & Chr(13) & "2 = Andere", "Kunde")
If Kunde <> "" Then
If Kunde = 1 Then
ActiveDocument.Bookmarks("Auftraggeber").Range.InsertBefore "Firmenname" & Chr(10) & _
"Straße mit Hausnummer" & Chr(10) & "PLZ Ort"
ufKundeX.Show
Else
ufAndere.Show
End If
End If

'Zwischensumme Honorar auslesen
If ufAndere.txbHonorar <> "" Then Rechnung(1) = CDbl(ufAndere.txbHonorar)
Ergebnis = 0
Zahl.Cell(1, 2).Range.Text = Format(Rechnung(1), "#,##0.00 \€")
Zahl.Cell(1, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Zahl.Cell(1, 2).Range.Font.Bold = False

'Zwischensumme Spesen auslesen
Ergebnis = InputBox("Spesen eingeben" & Chr(13) & "0 = Ignorieren | 1 = Von MwSt befreit:", "Honorar")
If Ergebnis = 1 Then
Zahl.Cell(4, 1).Range.Text = "Das Honorar ist nach $4 Nr. 21 b) bb) UstG von der Umsatzsteuer befreit."
Zahl.Cell(5, 1).Range.Text = ""
Ergebnis = 0
Befreit = True
Else
Rechnung(2) = Ergebnis
End If

'MwSt berechnen
If Befreit = False Then
MwstHono = Rechnung(1) * 0.19
Zahl.Cell(2, 2).Range.Text = MwstHono
Zahl.Cell(2, 2).Range.Text = Format(MwstHono, "#,##0.00 \€")
Zahl.Cell(2, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Zahl.Cell(2, 2).Range.Font.Bold = False
End If
If Rechnung(2) > 0 Then
Zahl.Cell(4, 2).Range.Text = Format(Rechnung(2), "#,##0.00 \€")
Zahl.Cell(4, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Zahl.Cell(4, 2).Range.Font.Bold = False
MwstSpes = Rechnung(2) * 0.19
Zahl.Cell(5, 2).Range.Text = MwstSpes
Zahl.Cell(5, 2).Range.Text = Format(MwstSpes, "#,##0.00 \€")
Zahl.Cell(5, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Zahl.Cell(5, 2).Range.Font.Bold = False
End If

'Gesamtsumme berechnen
Summe = Rechnung(1) + MwstHono + Rechnung(2) + MwstSpes
Zahl.Cell(8, 2).Range.Text = Summe
Zahl.Cell(8, 2).Range.Text = Format(Summe, "#,##0.00 \€")
Zahl.Cell(8, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Zahl.Cell(8, 2).Range.Font.Bold = True
Exit Sub
Fehler:
MsgBox Err.Description
Resume Next
End Sub

Nun öffnen wir im Projekt-Editor unter "Microsoft Word Objekte" die "Rechnung" oder das "ThisDocument", wenn Sie noch keinen eigenen Namen vergeben haben.Achten Sie aber darauf, dass Sie im Bereich der Rechnungserstllung sind und nicht oben unter "Normal". Im Tab vorher gibt es einen Screenshot dazu.

Das ist viel Code, der da erscheint. Einen Teil davon kennen Sie jedoch bereits aus den vorangegangen Teilen. Der Code ist aber ein wenig erweitert und befindet sich jetzt an einer anderen Stelle. Die "andere Stelle" ist notwendig, da die ganzen Eingaben und automatischen Berechnungen bereits beim Aufruf der Vorlage stattfinden sollen und müssen. Wir benutzen dafür die Document-Ereignisse. Wenn Sie ganz oben im Kopfbereich des Dokuments "Document" auswählen, erhalten Sie rechts eine Liste der verfügbaren Ereignisse: Ereignisse in Word

Damit ist sichergestellt, dass, immer wenn Sie eine neue Rechnung auswählen, die Programmierung automatisch startet. Dazu gehört dann sowohl die eben erstellt UserForm, als auch das ein oder andere Inputfeld, welches wir jetzt erzeugen.

Unsere erste Inputbox starten wir in dieser Zeile:

 

Kunde = InputBox("Kunde auswählen" & Chr(13) & "1 = Kunde x" & Chr(13) & "2 = Andere", "Kunde")

In meinem Rechnungsvordruck habe ich im Adressfeld ein Bookmark gesetzt. Wie das geht habe ich im zweiten Teil dieser Rechnungsserie beschrieben. Wenn die Taste "1" gedrückt wurde, wird die Adresse des Kunden automatisch in das Adressfeld geschrieben. So können Sie eine Liste Ihrer wichtigsten wiederkehrenden Kunden zusammenstellen.

Wird die "2" ausgwählt, gibt es kein Adressfeld. Egal wie die Entscheidung ausfällt wird eine passende UserForm dazu geöffnet. Kunde 1 hat eine sehr komplexe Auftragsbeschriftung, die ich mit einer eigenen Form versehen habe (Kunde X). Alle anderen Kunden benötigen lediglich die Projektbeschreibung und das Datum. Und natürlich das Honorar. Also all das, was wir in der UserForm ufAndere eingetragen haben.

Nun geht es an der Berechnung (wobei ich im obigen Code lediglich das UserForm ufAndere berücksichtigt habe. Das deswegen, weil sich zum einen der Ablauf sehr ähnelt und ein paar wenige Kunden sehr spezielle Angaben benötigen, die ich hier nicht abbilden möchte).

If ufAndere.txbHonorar <> "" Then Rechnung(1) = CDbl(ufAndere.txbHonorar)

Eine kleine Sicherheitsabfrage, ob das Honorarfeld auch wirklich beschrieben ist. Ist das leer, gibt es ansonsten eine Fehlermeldung. Wenn ja, dann wird dem Arrayfeld Rechnung(1) der Inhalt des Textfeldes zugewiesen. Allerdings muss ich den Inhalt des Textfeldes, der ja eine Zeichenkette ist, zuvor in einen Doublewert umwandeln. Zeichenkette (String), Double, Integer und all diese Typenbezeichnungen haben etwas mit der Darstellung von Inhalten zu tun und wirken sich auch auf den Speicherbereich aus. Wichtig ist: damit Word mit dem eingegebenen Honorar rechnen kann, müssen wir zunächst eine Zahl daraus machen, die auch Nachkommastellen anzeigen kann.

Die Zeile danach kennen wir schon aus dem ersten Teil:

Zahl.Cell(1, 2).Range.Text = Format(Rechnung(1), "#,##0.00 \€")

Der Inhalt vom Array "Rechnung(1)" wird, richtig formatiert, in unsere Tabelle geschrieben. Die nachfolgenden zwei Zeilen formatieren diese Zahl noch ein wenig.

Ergebnis = InputBox("Spesen eingeben" & Chr(13) & "0 = Ignorieren | 1 = Von MwSt befreit:", "Honorar")
    If Ergebnis = 1 Then
            Zahl.Cell(4, 1).Range.Text = "Das Honorar ist nach $4 Nr. 21 b) bb) UstG von der Umsatzsteuer befreit."
            Zahl.Cell(5, 1).Range.Text = ""
            Ergebnis = 0
            Befreit = True
    Else
        Rechnung(2) = Ergebnis
End If

Ich habe ab und an Kunden, die von der Mehrwertsteuer befreit sind. Die benötigen dann eine Mitteilung auf der Rechnung, dass sie befreit sind. Gleiches ist natürlich auch für das Finanzamt wichtig. Dieser Block fragt zunächst in der Inputbox ab, ob der Kunde von der MwSt befreit ist. Ist er das, wird der Satz "Das Honorar ist nach $4 Nr. 21 b) bb) UstG von der Umsatzsteuer befreit." ausgegben und die MwSt-Zellen in der Tabelle gelöscht. Ist der Kunde nicht befreit, wird die Zahl "0" für "Ignorieren" gedrückt oder wahlweise ein Spesensatz eingegeben. Bei mir fällt das ab und an für Fahrtkosten oder auch Übernachtungen vor Ort an. Rechnung mit MwSt und ohne Spesen


Rechnung mit Spesen


 

rech mwstbefr

 

Was nun noch gemacht werden muss, ist das alles zu berechnen und in der Tabelle auszugeben. Die grundsätzliche Berechnung steht im ersten Teil. Hier ist sie lediglich ein wenig erweitert durch die mögliche Befreiung.

Haben Sie mehrere Kunden und zugehörige UserForms brauchen Sie lediglich im oberen Bereich, wo ich das Beispiel mit der Adresse abgebildet habe, Ihre Forms einzugeben und auszuwerten. Auch wenn Sie mit der Programmierung nicht so fit sind, sollten Sie mit den Beispielen die ein oder andere Idee haben, wie Sie das umsetzen können.