Excel fortlaufende Rechnungsnummer?
Hallo,
ich möchte in Excel jedes mal wenn ich die Rechnungs-Vorlage öffne, die nächste Rechnungsnummer eingetragen haben.
Meine Rechnungen sind alle in einem Ordner gespeichert.
Ich habe schon versucht mit VBA ein Script zu schreiben, welches alle Dateien in dem Ordner durchgeht und den Wert aus Zelle B13 nimmt und den höchsten am ende mit +1 in die Vorlage einträgt.
Da bin ich aber leider gescheitert :-)
Vielleicht kennt sich einer von euch da besser aus und könnte mit weiterhelfen.
Vielen Dank im Vorraus,
LG, Julian
3 Antworten
Du solltest die Rechnungsnummern irgendwo extern speichern (z.b. in einer access-db) und diesen wert dann abrufen. Dann mach dir noch ein vba makro welches diesen wert suf Knopfdruck um eins erhöht und dabei das Rechnungsnummernfeld sperrt.
Aber wie schon geschrieben ist excel für Rechnungen grundsätzlich schon der falsche weg.
Hallo,
ich hatte vor einiger Zeit eine ähnliche Fragestellung, deren Lösung ich dir grob überarbeitet habe. Es wird auf das Speicherdatum geprüft, da mich die neueste Datei des Ordners interessierte. Sollte dir das nicht reichen, müsste in der Schleife jede Datei geöffnet, deren Nummer in einer Variable zwischengespeichert und diese analog zu den Datumswerten weiterverwendet werden:
Sub nachsteNummer()
Dim pfad As String, aktDatei As String, aktBlatt As String, zelle As String, nDatei As String
Dim objFS As Object, objFolder As Object, objDateienliste As Object
Dim nDatum As Double, vDatum As Double
Dim warGeschlossen As Boolean
'Ziele festlegen
pfad = "C:\Beispielpfad\Rechnungen\"
zelle = "B13"
aktDatei = ActiveWorkbook.Name
aktBlatt = ActiveSheet.Name
If Right(pfad, 1) <> "\" Then
pfad = pfad & "\"
End If
'Ordner durchsuchen
Set objFS = CreateObject("scripting.filesystemobject")
Set objFolder = objFS.Getfolder(pfad)
Set objDateienliste = objFolder.Files
vDatum = 0
For Each objDatei In objDateienliste
If Not objDatei Is Nothing Then
dateiname = objDatei.Name
nDatum = FileDateTime(pfad & dateiname)
If nDatum > vDatum Then
vDatum = nDatum
nDatei = dateiname
End If
End If
Next objDatei
'ignorieren temporärer Dateien
If Left(nDatei, 2) = "~$" Then
nDatei = Right(nDatei, Len(nDatei) - 2)
End If
warGeschlossen = False
If Not DateiGeoeffnet(nDatei) Then
Workbooks.Open pfad & nDatei
warGeschlossen = True
End If
Workbooks(aktDatei).Sheets(aktBlatt).Range(zelle) = Workbooks(nDatei).ActiveSheet.Range(zelle) + 1
If warGeschlossen Then
Workbooks(nDatei).Close SaveChanges:=False
End If
End Sub
Function DateiGeoeffnet(datei As String) As Boolean
On Error Resume Next
DateiGeoeffnet = Not Workbooks(datei) Is Nothing
End Function
Also auch wenn man das mit VBA hinbekommen sollte, wird man dies nicht GoBD konform hinbekommen und bei einer Steuerprüfung Probleme bekommen.
Am einfachsten bekommt man das natürlich mit "Worksheetfunction.Max(...)" hin. Hier kann man als Argument dann die Spalte mit den bereits vergebenen Rechnungsnummern übergeben. Die neue Rechnungsnummer ist dann das Ergebnis aus der Max Funktion + 1.
Um eine manuelle Änderung dann zu verhindern, würde ich in der Tabelle dann mit der "ScrollArea" arbeiten. Diese also per VBA für das Sheet setzen (Worksheets("Blattname").ScrollArea="$A$1" - ich müsste nochmal genau schauen, wie es geschrieben wird - denke aber, das stimmt so.) . Dann ist also das Tabellenblatt per ScrollArea auf die Bearbeitung für Zelle A1 beschränkt.
ggf doch mal mit Access probieren - hier bietet sich das AutoWert Feld als Rechnungsnummer an.
Oder einfach ein Sage Abo, oder Ähnliches für ein paar EUR im Monat buchen - dann ist man alle Sorgen los.
Ja, richtig.
Oder möchtest Du, dass im Dateisystem - also im Rechnungsordner - über die Dateinamen geschaut wird, welches die letzte Rechnungsnummer war/ist?
Das ist schon sehr wackelig und überlebt niemals auch nur im Ansatz eine Steuerprüfung.
Nene mein Plan war jede datei mit einer for() schleife im ordner durchgehen und dort immer den Wert dieser einen Zelle nehmen und schauen ob er größer ist als der von der Datei davor. Wenn ja, soll dieser Wert wieder zwischengespeichert werden usw..
Am Ende hat man dann ja sozusagen die höchste Rechnungsnummer die es in dem Ordner gibt und die schreibt dann vba mit +1 in die Zelle in der Vorlage.
Excel ist einfach nicht das Programm dafür . Sorry das ich das so abwiegel . Aber ist nun einmal so. Reicht gerade mal für Lieferscheine. Aber es ist eben keine Rechnungssoftware. Da wäre Access schon besser .
Hi, erstmal vielen Dank für deine Antwort.
Aber wenn ich das mit vba mit der Worksheetfunktion.max() machen will, muss ich doch eine eigene tabelle mit den bereits vergebenen nummern machen oder?