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: