Excel VBA - fortlaufende Rechnungsnummer

An dieser Stelle möchte ich euch einmal zeigen wie man eine fortlaufende Rechnungsnummer, oder Auftragsnummer, mit Hilfe von Excel VBA in sein Tabellenblatt einfügen kann. Wie ihr Euch denken könnt gibt es wieder einmal verschiedene Möglichkeiten.

 

Die einfachste Möglichkeit eine fortlaufende Rechnungsnummer zu erzeugen ist eine Nummer in ein Tabellenblatt einzufügen. Diese wird mit betätigen eines Schalters eingelesen - mit 1 aufaddiert - und wieder in die dafür vorgesehende Zelle zurück geschrieben. Ein VBA Code für diese einfache Variante würde so aussehen:


Sub Rechnungsnummer()
    Range("A1") = Range("A1") + 1
End Sub

Diese Variante hat für mich aber einen bitteren Beigeschmack. Der Grund ist, dass man mal eben hergehen könnte und einen Wert in Zelle A1 schreiben, welcher bereits existiert.

 

Ich denke dass man von daher doch lieber alternative Möglichkeiten aufgreifen sollte. Aus diesem Grund habe ich mir heute überlegt: Warum sollten wir nicht einfach die Dokumenteigenschaften zum Ablegen der aktuellen Rechnungsnummer nutzen? Diese Dokumenteigenschaften werden eh nicht unbedingt genutzt. Und viele Anwender nutzen sie gar nicht. Viel mehr ist auch hier nicht zu programmieren. Schaut euch einmal diesen VBA Code an:


Sub Rechnungsnummer()
Dim RechNr As Long
    RechNr = ActiveWorkbook.BuiltinDocumentProperties(5)
    RechNr = RechNr + 1
    ActiveWorkbook.BuiltinDocumentProperties(5) = RechNr
    Range("A1") = RechNr
End Sub

Diesen VBA Code habe ich noch etwas weiter ausgebaut, denn ich möchte eigentlich, dass die Rechnungsnummer jedes Jahr wieder bei 1 anfängt. Das geht aber nur wenn ich jedes Jahr auch die Jahreszahl mit anhänge:


Sub Rechnungsnummer()
Dim RechNr As Long
Dim Jahr As Integer
    Jahr = ActiveWorkbook.BuiltinDocumentProperties(6)
    RechNr = ActiveWorkbook.BuiltinDocumentProperties(5)
    If Jahr <> Year(Date) Then
        RechNr = 0
        Jahr = Year(Date)
        ActiveWorkbook.BuiltinDocumentProperties(6) = Jahr
    End If
    RechNr = RechNr + 1
    ActiveWorkbook.BuiltinDocumentProperties(5) = RechNr
    Range("A1") = Format(RechNr, "00000") & "/" & Jahr
End Sub

Meiner Meinung nach fehlt nun aber immer noch eine Kleinigkeit. Ich bin der Auffassung, dass sich die Rechnungsnummer erst erhöhen darf, wenn die Rechnung auch ausgedruckt wurde. Um dieses Vorhaben zu realisieren legen wir den folgenden Code hinter diese Arbeitsmappe :


Option Explicit

Public Druck As Boolean

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    If Druck = False Then
        Cancel = True
        MsgBox "Drucken ist nur über den vorgesehenen Button Möglich!"
    Else
        Druck = False
    End If
End Sub

Dieses Makro bewirkt, dass wir nicht mehr über den Drucken - Schalter aus der Symbolleiste drucken können. Wir drucken somit nur noch über einen Schalter, den wir uns selber angelegt haben. Hinter unser Tabellenblatt kommt nun dieser leicht abgewandelte Code:


Option Explicit

Sub Rechnungsnummer()
Dim RechNr As Long
Dim Jahr As Integer
    Jahr = ActiveWorkbook.BuiltinDocumentProperties(6)
    RechNr = ActiveWorkbook.BuiltinDocumentProperties(5)
    If Application.Dialogs(xlDialogPrinterSetup).Show = False Then Exit Sub
    If Jahr <> Year(Date) Then
        RechNr = 0
        Jahr = Year(Date)
        ActiveWorkbook.BuiltinDocumentProperties(6) = Jahr
    End If
    RechNr = RechNr + 1
    ActiveWorkbook.BuiltinDocumentProperties(5) = RechNr
    Range("A5") = Format(RechNr, "00000") & "/" & Jahr
End Sub

Nun wird die Rechnungsnummer nur noch hochgezählt, wenn auch die Rechnung ausgedruckt wurde. Nutzen wir im Druckermenü den Schalter Abbrechen, so wird das Makro sofort abgebrochen, so dass sich die Rechnungsnummer nicht verändert.

Hinweis: Es ist nicht unbedingt nötig, dass wir die Rechnungsnummer in den Dokumenteigenschaften ablegen. Alternativ könnten wir diese auch in einem versteckten (ausgeblendeten) Tabellenblatt unterbringen. Das ist mit ganz kleinen Veränderungen am Code zu bewerkstelligen:


Sub Rechnungsnummer()
Dim RechNr As Long
Dim Jahr As Integer
    Jahr = Worksheets("Versteckt").Range("A1")
    RechNr = Worksheets("Versteckt").Range("B1")
    If Application.Dialogs(xlDialogPrinterSetup).Show = False Then Exit Sub
    If Jahr <> Year(Date) Then
        RechNr = 0
        Jahr = Year(Date)
        Worksheets("Versteckt").Range("A1") = Jahr
    End If
    RechNr = RechNr + 1
    Worksheets("Versteckt").Range("B1") = RechNr
    Range("A5") = Format(RechNr, "00000") & "/" & Jahr
End Sub

Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Weitere Informationen Ok