Excel fortlaufende Rechnungsnummer?

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.

Woher ich das weiß:Berufserfahrung – arbeite seit vielen Jahren in der IT

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.

fishgamerYT 
Fragesteller
 27.12.2020, 13:26

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?

1
adi120369  27.12.2020, 13:28
@fishgamerYT

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.

1
fishgamerYT 
Fragesteller
 27.12.2020, 13:31
@adi120369

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.

1
TechPech1984  27.12.2020, 13:41
@fishgamerYT

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 .

1