Word Rechnungsnummer soll automatisch weiterzählen?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Hallo,

hier ein Makro, das die Rechnungsnummer in Word durchzählt. Ich habe es von dieser Seite, allerdings habe ich das dortige Makro ein wenig umgeschrieben und das Format der Rechnungsnummer entsprechend angepasst.

Alles, was du tun musst, sind folgende Schritte:

1. Makro in deine Rechnungsvorlage kopieren
  • Öffne deine Rechnungsvorlage (eine Microsoft Word-Vorlage mit Makros) und rufe dort die Visual-Basic-Ansicht auf.
  • Wechsle in dieser im VB-Editor im Projektfenster in den Ordner Microsoft Word Objekte DER RECHNUNGSVORLAGE (nicht der Normalvorlage). Dort findest du ThisDocument, auf das du doppelt klickst, um dorthin zu wechseln.
  • Kopiere den kompletten Code unten in diesen Container.
  • Außerdem solltest du im Windows-Explorer einen entsprechenden Ordner anlegen, in dem alle deine Rechnungen gespeichert werden, und auf den dein Ablagepfad dann verweist.
2. Ablage-/Speicherpfad ändern
  • In der Codezeile '### Hier den passenden Ablagepfad einsetzen:, die zweimal vorhanden ist (einmal in der Function nextFilename und einmal in der Function RgNr), musst du in der Zeile sAblage = "D:\Temp\" deinen Ablagepfad für deine Rechnungen entsprechend ändern.
3. Textmarke für die Rechnungsnummer erstellen
  • Erstelle an der Stelle, an der deine Rechnungsnummer im Dokument eingefügt werden soll, in deiner Rechnungsvorlage eine Textmarke mit dem Namen Nr (bitte unbedingt genau diesen Namen verwenden, keinen anderen, da das Makro damit arbeitet und sonst nicht weiß, wo es die Rechnungsnummer einfügen soll).
  • Speichere deine Vorlage ab.
4. Dateinamen im Ablageordner anlegen

Abschließend musst du noch 12 Worddokumente mit den Namen 001-2018 bis 012-2018 in deinem Ablageordner anlegen, damit Word bei der nächsten Rechnung wie gewünscht den Namen bzw. die Rechnungsnummer 013-2018 verwendet.

Wie das Makro arbeitet
  • Das Makro erstellt dir auf Grundlage deiner Vorlage eine Rechnung mit neuer Rechnungsnummer und speichert diese sofort im Ablageordner ab. Jahreswechsel sollte es selbstständig mitkriegen und dann bei der Rechnungsnummer von vorne zu zählen beginnen.
  • Beim Öffnen eines neuen Dokuments bekommst du eine Meldung mit Rechnungsnummer und Dateiname, die du nur bestätigen brauchst.
  • Wenn du eine unbenutzte Rechnungsnummer aus Versehen vergeben hast, lösche einfach das entsprechende Rechnungsdokument im Ablageordner, dann wird die Nummer wieder vergeben.

Wenn du noch Fragen hast, melde dich bitte.

Gruß, BerchGerch

Hier der Code:

Function nextFilename() As String
'Ermittelt den nächsten freien Dateinamen für ein Rechnungsdokument

    Dim sAblage As String, sVorgabe As String, sDocExt As String, sIstDa As String
    Dim c As Integer
    Dim Mnt As String
    Dim RgNr As String
    
    Mnt = Format(Now(), "mm")
    
    '### Hier den passenden Ablagepfad einsetzen:
    sAblage = "D:\Temp\"

    'auf abschließenden Backslash überprüfen
    If Right(sAblage, 1) <> "\" Then sAblage = sAblage & "\"
    
    'Dateinamen mit Jahr vorbelegen
    sVorgabe = "-" & Year(Now)

    'Dateiextender bestimmen
    sDocExt = IIf(Val(Application.Version) > 11, ".docx", ".doc")
      
    'ersten freien Dateinamen ermitteln
    c = 1
    sIstDa = Dir(sAblage & Format(c, "000") & sVorgabe & sDocExt)
    While sIstDa <> ""
        c = c + 1
        sIstDa = Dir(sAblage & Format(c, "000") & sVorgabe & sDocExt)
    Wend
    
    'Fullname als Ergebnis zurückgeben
    nextFilename = sAblage & Format(c, "000") & sVorgabe & sDocExt
    
End Function

Function RgNr() As String
'Ermittelt die Rechnungsnummer

    Dim sAblage As String, sVorgabe As String, sDocExt As String, sIstDa As String
    Dim c As Integer
    Dim Mnt As String
    
    Mnt = Format(Now(), "mm")
    
    '### Hier den passenden Ablagepfad einsetzen:
    sAblage = "D:\Temp\"

    'Auf abschließenden Backslash überprüfen
    If Right(sAblage, 1) <> "\" Then sAblage = sAblage & "\"
    
    '### Hier das Format der RgNr. bestimmen
    sVorgabe = "-" & Year(Now)
    
    'Dateiextender bestimmen
    sDocExt = IIf(Val(Application.Version) > 11, ".docx", ".doc")
      
    'Ersten freien Dateinamen ermitteln
    c = 1
    sIstDa = Dir(sAblage & Format(c, "000") & sVorgabe & sDocExt)
    While sIstDa <> ""
        c = c + 1
        sIstDa = Dir(sAblage & Format(c, "000") & sVorgabe & sDocExt)
    Wend
    
    'RgNr als Ergebnis zurückgeben
    RgNr = Format(c, "000") & sVorgabe 'Hier das Format der Nr bestimmen
    
End Function

Sub Document_New()
'Beim Öffnen eines neuen Dokuments auf Basis der Vorlage neues Rechnungsdokument anlegen und Rechnungsnummer einfügen

Dim rechnungsnummer As String
Dim dateiname As String
Dim pos As Integer
Dim Invoice As String

dateiname = nextFilename
pos = InStrRev(dateiname, "\")
rechnungsnummer = Right(dateiname, Len(dateiname) - InStrRev(dateiname, "\"))
Invoice = RgNr

'Kontrollmeldung
MsgBox "Dateipfad und -name: " & vbLf & vbLf & dateiname & vbLf & vbLf & _
"Rechnungsnummer: " & vbTab & vbTab & Invoice

With ActiveDocument
    'Rechnungsnummer in Textmarke anlegen
    .Bookmarks("Nr").Range.Text = Invoice
    'Dokument unter dem erzeugten Dateinamen speichern
    .SaveAs dateiname
End With

End Sub
Woher ich das weiß:eigene Erfahrung – Ich arbeite seit 30 Jahren nahezu täglich mit Word.

Sudje  04.12.2019, 12:53

Hallo,
Guter Ansatz, leider habe ich nicht voel Programmiererfahrung. Ich würde den Dateinamen doch lieber wie folgt haben: 2019-1013. Wo muss ich da alles Anpassungen machen? Für Hilfe wäre ich sehr dankbar.

Viele Grüße

Sudje

BerchGerch  04.12.2019, 12:58
@Sudje

Hallo,

mir erschließt sich nicht ganz, was das 1013 in deiner Rechnungsnummer sein soll. 2019 ist das Jahr, schon klar, aber soll 1013 einfach nur eine vierstellige fortlaufende Rechnungsnummer sein, oder wie stellst du dir das genau vor?

Gruß, BerchGerch

Sudje  04.12.2019, 13:09
@BerchGerch

Ja, 1013 soll meine Rechnungsnummer sein. Ich will nicht mit 1 beginnen, sondern mit 1000.

Viele Grüße Sudje

Hallo Sudje,

hier der neue Code, der an deine Wünsche angepasst wurde:

Option Explicit

Function nextFilename() As String
'Ermittelt den nächsten freien Dateinamen für ein Rechnungsdokument

    Dim sAblage As String, sVorgabe As String, sDocExt As String, sIstDa As String
    Dim c As Integer
    Dim Mnt As String
    Dim RgNr As String
    
    Mnt = Format(Now(), "mm")
    
    '### Hier den passenden Ablagepfad einsetzen:
    sAblage = "D:\Temp\"

    'auf abschließenden Backslash überprüfen
    If Right(sAblage, 1) <> "\" Then sAblage = sAblage & "\"
    
    'Dateinamen mit Jahr vorbelegen
    sVorgabe = Year(Now) & "-"

    'Dateiextender bestimmen
    sDocExt = IIf(Val(Application.Version) > 11, ".docx", ".doc")
      
    'ersten freien Dateinamen ermitteln
    c = 1000
    sIstDa = Dir(sAblage & sVorgabe & Format(c, "0000") & sDocExt)
    While sIstDa <> ""
        c = c + 1
        sIstDa = Dir(sAblage & sVorgabe & Format(c, "0000") & sDocExt)
    Wend
    
    'Fullname als Ergebnis zurückgeben
    nextFilename = sAblage & sVorgabe & Format(c, "0000") & sDocExt
    
End Function

Function RgNr() As String
'Ermittelt die Rechnungsnummer

    Dim sAblage As String, sVorgabe As String, sDocExt As String, sIstDa As String
    Dim c As Integer
    Dim Mnt As String
    
    Mnt = Format(Now(), "mm")
    
    '### Hier den passenden Ablagepfad einsetzen:
    sAblage = "D:\Temp\"

    'Auf abschließenden Backslash überprüfen
    If Right(sAblage, 1) <> "\" Then sAblage = sAblage & "\"
    
    '### Hier das Format der RgNr. bestimmen
    sVorgabe = Year(Now) & "-"
    
    'Dateiextender bestimmen
    sDocExt = IIf(Val(Application.Version) > 11, ".docx", ".doc")
      
    'Ersten freien Dateinamen ermitteln
    c = 1000
    sIstDa = Dir(sAblage & sVorgabe & Format(c, "0000") & sDocExt)
    While sIstDa <> ""
        c = c + 1
        sIstDa = Dir(sAblage & sVorgabe & Format(c, "0000") & sDocExt)
    Wend
    
    'RgNr als Ergebnis zurückgeben
    RgNr = sVorgabe & Format(c, "0000") 'Hier das Format der Nr bestimmen
    
End Function

Sub Document_New()
'Beim Öffnen eines neuen Dokuments auf Basis der Vorlage neues Rechnungsdokument anlegen und Rechnungsnummer einfügen

Dim rechnungsnummer As String
Dim dateiname As String
Dim pos As Integer
Dim Invoice As String

dateiname = nextFilename
pos = InStrRev(dateiname, "\")
rechnungsnummer = Right(dateiname, Len(dateiname) - InStrRev(dateiname, "\"))
Invoice = RgNr

'Kontrollmeldung
MsgBox "Dateipfad und -name: " & vbLf & vbLf & dateiname & vbLf & vbLf & _
"Rechnungsnummer: " & vbTab & vbTab & Invoice

With ActiveDocument
    'Rechnungsnummer in Textmarke anlegen
    .Bookmarks("Nr").Range.Text = Invoice
    'Dokument unter dem erzeugten Dateinamen speichern
    .SaveAs dateiname
End With

End Sub

Ich habe alle Änderungen so vorgenommen, wie von dir gewünscht: Der erste generierte Dateiname wird jetzt 2019-1000 sein. Ansonsten musst du alles so machen, wie in meiner anderen Antwort beschrieben.

Bei Fragen oder Unklarheiten einfach melden!

Gruß, BerchGerch

Woher ich das weiß:eigene Erfahrung

Sudje  04.12.2019, 22:47

Perfekt, funktioniert wunderbar! Danke!

Ich mache so etwas mit der Feldfunktion Datum:
Einfügen->Schnellbaustein->Feld.
Aus der Liste "Date" auswählen. Bei jedem Öffnen sollte dass Datum natürlich den aktuellen Tag zeigen, was natürlich zu Lücken wegen der Wochenende führt.
Sollte es sich nicht aktualisieren dann mit der Kombination:
STRG+A (alles markieren)
dann F9 drücken erhälst du den heutigen Tag. Davor und/oder dahinter kannst du noch andere Zahlen anfügen.
==
Das Format kann man auch selbst noch anpassen in dem man
ALT+F9 drückt. Dann erhält man in geschweiften Klammern den Feld Code und kann noch in Eigenregie etwas ändern. z.b:
aus
 {DATE \@ "yy-MM-dd" \* MERGEFORMAT}
dies
{ DATE \@ "yyMMdd" \* MERGEFORMAT }
machen


straussenbein 
Beitragsersteller
 08.04.2018, 19:53

Hallo IchMalWiederXY ,

danke für deine Antwort, die Feldfunktion habe ich eingefügt. Das Datum auch in der Formatierung verändert. Nur ein verstehe ich nicht. Meine Rechnungsnr. soll so beginnen 12-2018. Wenn ich aber an einem Tag vier Rechnungen schreibe, soll er weiterzählen, 13-2018; 14-2018, 15-2018. Aber an ein und dem selben Tag zählt er doch nicht weiter. Stehe ich auf dem Schlauch, was mache ich falsch:

IchMalWiederXY  08.04.2018, 20:26
@straussenbein

OK. Dann wird diese Lösung nix. Dann sind wir wieder beim "Makro", aber auch dies würde irgendein Ereignis benötigen, welches als "hochzählen" interpretiert werden kann. Rechnung ausdrucken (oder speichern) könnte so ein Ereignis sein. Allerdings, sollte mal an der Rechnung noch eine Korrektur vorgenommen werden müssen, oder sie noch ein weiteres mal ausgedruckt (versendet) werden müssen, dürfte nicht hochgezählt werden. Du siehst, dies kann beliebig komplex werden. Am besten wird man daher am Start gefragt "Neue Rechnung erstellen", dann könnte man die Vorlage laden, die dann auf jeden Fall eine neue Nummer erhält. WENN man sich irgendwo gemerkt hat welche Nummern bereits vergeben wurden. Vielleicht gibt es noch eine zweite (dritte) Person die Rechnungen schreibt, dort muss schließlich auch bekannt sein, was die anderen bereits vergeben haben. Deshalb gibt es Buchhaltungssoftware mit Datenbank und "Multiplatz" Möglichkeiten. Selbst machen ist aufwendig.

Moin,

danke an BerchGerch für deine Mühe den Code umzuschreiben und hier einzustellen!

Ich benötige zu diesem Thema Hilfe und bin was das Programmieren angeht ziemlich talentfrei.

Ich habe den oben stehenden Code verwendet und würde gerne im Dateinamen noch zusätzlich zur Rechnungsnummer, den Nachnamen der Person haben, die ich anschreibe. Für die Empfängerauswahl habe ich eine Funktion ausgewählt, die die Kontaktdaten aus Outlook zieht.

Ich hoffe ihr könnt mir helfen, wie ich den verwendeten Code umschreiben kann, dass es funktioniert.

vielen Dank und beste Grüße

Niklas


BerchGerch  05.03.2020, 05:18

Hallo,

ich habe dein Problem gesehen, habe aber momentan wenig bis gar keine Zeit, um mich bei GF blicken zu lassen. Aber wenn ich demnächst mal Zeit haben sollte, stell ich dir einen möglichen Lösungsansatz ein.

Gruß, BerchGerch

OskarWhite  05.03.2020, 21:46
@BerchGerch

Hallo BerchGerch,

kein Thema. Das wäre richtig klasse mit dem Lösungsansatz!

danke und viele Grüße