Für Selbständige und freiberuflich Tätige reicht es in vielen Fällen, ein einfaches Rechnungsausgangsbuch zu führen, welches nicht an eine Finanzbuchhaltung geknüpft ist. Wenn dies bei Ihnen zutrifft, dann wird Ihnen das nachfolgend näher erläuterte Tool gute Dienste erweisen. Das Programm besteht aus folgenden Tabellenblättern:
- Tabellenblatt Erfassen: Dieses Tabellenblatt ist Grundlage zur Erfassung von Angeboten und Rechnungen. Gleichzeitig befindet sich auf diesem Tabellenblatt der Button zum Verbuchen der erfassten Daten.
- Tabellenblatt geb.Rechnung: In diesem Tabellen-blatt werden die gebuchten Rechnungen aufgelistet.
- Tabellenblatt geb.Angebot: Im Tabellenblatt "geb.Angebot" werden wie im Blatt geb.Rechnung, die erstellten Angebote festgehalten.
- Tabellenblatt Offene.RG: Dieses Tabellenblatt dient zur Auflistung der offenen Rechnungen, das heißt es werden alle Rechnungen in dieses Blatt extrahiert, bei denen noch kein Geldeingang verzeichnet wurde.

Bild 1: Erfassungsblatt für Angebote und Rechnungen
Listing 1: automatische Erfassung des Rechnungsdatums
Private Sub Worksheet_Activate()
'Datum bei Aktivierung des Tabellenblattes Erfassung automatisch aktualisieren
Sheets("Erfassung").Range("F20").Value = Date
End Sub
Der Vorteil, das aktuelle Datum über ein Makro und nicht mit der Funktion =Heute() einzutragen besteht darin, dass das Datum jederzeit beliebig manuell abgeändert werden kann, ohne die erfasst Formel zu überschreiben. Da es sich beim Ereignis Worksheet_Acitvate um ein Ereignis für das Tabellenblatt Erfassen handelt, müssen Sie den Code aus Listing 1 im VBA-Editor auch zwingend in diesem Arbeitsblatt erfassen.
In den Zellen C25 bis D25 befindet sich ein DropDown-Element, aus dem zwischen Angebot und Rechnung gewählt werden kann. Damit in diesem DropDown-Feld diese Auswahlmöglichkeit zur Verfügung steht, muss dieses beim Start der Arbeitsmappe zuerst initialisiert werden. Tragen Sie dazu im Modul DieseArbeitsmappe im VBA-Editor das Makro aus Listing 2 ein.
Listing 2: Initialisieren des DropDown-Feldes und Aktu-alisierung des Datums
Private Sub Workbook_Open()
'Initialisierung der Combobox
With Sheets("Erfassung").ComboBox1
.AddItem "Rechnung"
.AddItem "Angebot"
End With
'Datum bei Aktivierung des Tabellenblattes Erfassung automatisch aktualisieren
Sheets("Erfassung").Range("F20").Value = Date
End Sub
Listing 3: Angebots- bzw. Rechnungsnummer erzeugen
Private Sub ComboBox1_Change()
'Aufurf der Prozedur zum Erzeugen von Angebots- bzw.
'Rechnungsnummer
belegnummer
End Sub
Auf die Ermittlung dieser Belegnummern wird in der Folge dieses Artikels noch näher eingegangen. Ab Zelle B35 werden die einzelnen Auftragsdaten erfasst. Die Vorlage ist derzeit zur Abrechnung von Leistungshonoraren aufgebaut. Selbstverständlich können Sie diese Vorlage jederzeit an Ihre individuellen Bedürfnisse anpassen, beispielsweise wenn Sie zusätzlich ein Feld zu Erfassung von Mengenangaben oder Ähnlichem benötigen.
Die Ermittlung des Nettorechnungsbetrages erfolgt in Zelle F58, indem mit der Funktion =SUMME(F35:F57) die einzelnen Werte einfach addiert werden. In Zelle E59 können Sie über ein DropDown-Feld aus den Umsatzsteuersätzen 0, 7 und 19 Prozent wählen. Dieses DropDown-Feld wurde mit Hilfe der Gültigkeitsprüfung erzeugt. Gehen Sie dazu wie folgt vor. Markieren Sie die Zelle E59 und öffnen über den Menüpunkt Daten / Datentools / Datenüberprüfung das Dialogfeld zur Erfassung der Gültigkeitskriterien, siehe Bild 2.

Listing 4: Start des Buchungsvorgangs
Public Sub CommandButton1_Click()
'Dimensionierung der Variablen
Dim strAntwort As String
'Prüfen, ob der Rechnungsbetrag größer Null ist und Ausgabe eines
'entsprechenden Hinweises
If Sheets("Erfassung").Range("F61") <> 0 Then
buchen
Else
strAntwort = MsgBox("Der Rechnungsbetrag lautet 0,00 €!" & Chr(13) & _
"Möchten Sie diese Rechnung wirklich verbuchen", vbYesNo)
If strAntwort = vbYes Then
buchen
Else
Exit Sub
End If
End If
End Sub
Listing 5: Verbuchung von Angeboten und Rechnungen
Public Sub buchen()
'Dimensionierung der Variablen
Dim lngLetzte As Long
Dim strObjblatt As String
‘Bildschirmaktualisierung wird aktiviert
Application.ScreenUpdating = False
'Prüfung, ob im DropDown-Feld der Eintrag Rechnung oder Angebot ausgewählt ist
If Sheets("Erfassung").ComboBox1.Value = "Rechnung" Then
'Zuweisen des Tabellenblattes geb.Rechnung
strObjblatt = "geb.Rechnung"
Else
'Zuweisen des Tabellenblattes geb.Angebot
strObjblatt = "geb.Angebot"
End If
'Prüfen, ob in Zelle B28 eine Belegnummer eingetragen ist
If Sheets("Erfassung").Range("B28").Value <> "" Then
'####Ermittlung der letzten Zeile in Spalte A des Tabellenblattes "strObjblatt"
lngLetzte = Sheets(strObjblatt).Cells(65536, 1).End(xlUp).Row + 1
'####Daten in Buchungsblatt "strObjblatt" übertragen
Sheets(strObjblatt).Cells(lngLetzte, 1).Value = Sheets("Erfassung").Range("F20").Value 'Datum
Sheets(strObjblatt).Cells(lngLetzte, 2).Value = Sheets("Erfassung").Range("B28").Value 'RG-Nr.
Sheets(strObjblatt).Cells(lngLetzte, 3).Value = Sheets("Erfassung").Range("A13").Value 'Name
Sheets(strObjblatt).Cells(lngLetzte, 4).Value = Sheets("Erfassung").Range("F58").Value 'Netto
Sheets(strObjblatt).Cells(lngLetzte, 5).Value = Sheets("Erfassung").Range("F61").Value 'Brutto
If Sheets("Erfassung").ComboBox1.Value = "Rechnung"
Then
Sheets(strObjblatt).Cells(lngLetzte, 6).Value = "JA" 'KZ RE offen setzen
End If
'Löschen der Anschrift und ersetzen durch die Vorga-ben
Sheets("Erfassung").Range("A12").Value = "Anrede"
Sheets("Erfassung").Range("A13").Value = "Name / Firma"
Sheets("Erfassung").Range("A14").Value = "Straße, Hs-
Nr"
Sheets("Erfassung").Range("A16").Value = "Plz"
Sheets("Erfassung").Range("B16").Value = "Ort"
'Löschen der Objektnummer
Sheets("Erfassung").Range("B28").ClearContents
'Löschen aller Aufträge Position 1-23
Sheets("Erfassung").Range("B35:F57").Select
Selection.ClearContents
Range("B35").Select
'Aufruf der Prozedur "belegnummer"
belegnummer
Else
'belegnummer erzeugen
belegnummer
'Hinweis Fenster, bezüglich Buchung ohne Angebots- bzw.
Rechnungsnummer
MsgBox "Eine Buchung ohne Angebots- bzw. Rechnungsnummer kann nicht erfolgen!" & Chr(13) & _
"Es wurde eine neue RG-Nr. erzeugt!" & Chr(13) & Chr(13) & _
"Bitte starten Sie den Buchungsvorgang erneut!"
Exit Sub
End If
'Bestätigung der ordnungsgemäßen Verbuchung
MsgBox "Buchungsvorgang erfolgreich abgeschlossen!", vbInformation, "Hinweis"
'Bildschirmaktualisierung wird aktiviert
Application.ScreenUpdating = True
End Sub

Bild 3: gebuchte Angebote
Nachdem die Verbuchung von Angebot und Rechnung erledigt ist, werden im Tabellenblatt Erfassung die eingegebenen Werte wieder auf die Stan-dardvorgaben zurückgesetzt. So werden in die Zellen A12 bis B16 die Standardwerte für die Anschrift eingetragen. In Zelle B28 wird die Objektnummer gelöscht und die Zellen B35 bis F57 in denen die einzelnen Leistungsbeschreibungen eingegeben wurden, werden ebenfalls geleert. Im Anschluss an die verschiedenen Löschaktionen wird eine neue Rechnungs- beziehungsweise Angebotsnummer erzeugt, indem die Prozedur belegnummer aufgerufen wird. Dazu später mehr. Jetzt aber noch mal zurück zur If-Then-Abfrage am Anfang des Codes, in der geprüft wird, ob sich in Zelle B28 eine Belegnummer befindet. Sollte diese Zelle keinen Eintrag aufweisen, wird die Else-Bedingung ausgeführt. In dieser wird zuerst die Prozedur belegnummer aufgerufen, um eine neue Belegnummer zu erzeugen. Anschließend öffnet sich ein Hinweisfenster, welches darauf hinweist, dass eine Verbuchung ohne gültige Angebots- beziehungsweise Rechnungsnummer nicht vorgenommen werden kann. Sie werden aufgefordert, den Buchungsvorgang erneut zu starten. Danach wird das Makro mit der Funktion Exit Sub vorzeitig beendet.
Der Befehl Application .ScreenUpdating = True bewirkt, dass die Bildschirmaktualisierung wieder aktiviert wird. In Listing 6 sehen Sie, wie die Belegnummer (An-gebots- beziehungsweise Rechnungsnummer) automatisch generiert wird.
Listing 6: Ermittlung der Belegnummern
Public Sub belegnummer()
'Dimensionieren der Variablen
Dim strObjblatt As String
Dim lngLetzte As Long
Dim intPos1 As Integer
Dim intJahr As Integer
Dim intLfdnr As Integer
'Prüfen ob Belegnummer für Rechnung oder für Angebot erzeugt werden soll
If Sheets("Erfassung").ComboBox1.Value = "Rechnung" Then
strObjblatt = "geb.Rechnung"
Else
strObjblatt = "geb.Angebot"
End If
'letzte Zeile ermitteln
lngLetzte = Sheets(strObjblatt).Cells(65536,
1).End(xlUp).Row
'Auswerten der letzten Belegnummer (Angebot bzw. Rechnung)
intPos1 = InStr(Sheets(strObjblatt).Cells(lngLetzte, 2),
"/")
intLfdnr = For-mat(Left(Sheets(strObjblatt).Cells(lngLetzte,2), intPos1 - 1), "00")
intJahr = Mid(Sheets(strObjblatt).Cells(lngLetzte, 2),
intPos1 + 1, intPos1 + 1)
'Neu generierte Belegnummer in das Tabellenblatt "Erfas-sung" schreiben
Sheets("Erfassung").Range("B28").Value = Format(intLfdnr +1, "00") & "/" & intJahr
'Formatierung der Belegnummer als String
Sheets("Erfassung").Range("B28").NumberFormat = "@"
End Sub
In Bild 4 sehen Sie einen Auszug aus dem Tabellenblatt geb.Rechnung. Ähnlich wie bei der Verbuchung der Angebote werden auch bei der Verbuchung der Rechnungen die Felder Datum, Rechnungsnummer, Name sowie Netto- und Bruttobetrag aus dem Erfassungsblatt ausgelesen und in das Tabellenblatt geb.Rechnung übernommen. Zusätzlich ist zu diesen Daten eine Hilfsspalte notwendig. Mit dieser Hilfsspalte werden alle Rechnungsbeträge, die mit einem JA im Feld Re offen? gekennzeichnet sind in dieser Spalte mit einer laufenden Nummer versehen. Diese Hilfsspalte ist Grundlage zur Anzeige aller offenen Rechnungen, das heißt es werden alle Rechnungen im Tabellenblatt Offene RG. angezeigt, die in Spalte F mit einem JA gekennzeichnet sind.

Bild 4: gebuchte Rechnungen im Tabellenblatt geb.Rechnung
Nachdem die Formeln in die entsprechenden Zellen kopiert wurden, können Sie die Hilfsspalte G komplett ausblenden, da diese zum „Betrieb“ des Rechnungsbuches nicht weiter benötigt wird. Mit der Funktion Gültigkeitsprüfung wird in den Zellen F4 bis F1000 sichergestellt, dass nur die Werte JA und NEIN eingegeben werden können. Um die Gültigkeitsprüfung einzurichten, gehen Sie wie folgt vor. Starten Sie zuerst die Gültigkeitsprüfung und wählen anschließend bitte aus dem Feld Zulassen den Eintrag Liste aus. Im Feld Quelle erfassen Sie, wie in Bild 5 zu sehen, die zulässigen Werte JA und NEIN. Sobald Sie nun eine Zelle im Bereich F4 bis F1000 anklicken, erscheint neben der selektierten Zelle ein DropDown-Menü, in welchem Sie die Einträge JA beziehungsweise NEIN auswählen können.


Bild 6: Zusammenstellung aller offenen Rechnungen
Tragen Sie diese Funktion im Tabellenblatt Offene RG in Zelle A6 ein, damit das Rechnungsdatum übernommen wird. Zur Übernahme der Rechnungsnummer in Zelle B6 ist folgende leicht modifizierte Funktion notwendig: