Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1908to1912
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Rechnungsnummern erstellen

Rechnungsnummern erstellen
08.12.2022 17:47:00
Daniel
Hallo allerseits,
ich arbeite derzeit eine eine Massengenerierung von manuellen Rechnungsdokumenten anhand einer tabellarischen Aufstellung. Bis hierhin auch soweit ganz gut.
Jetzt arbeite ich derzeit an eine automatischen Generierung von Rechnungsnummern für die jeweiligen Dokumente, das klappt auch. Jedoch möchte ich, wenn der Buchungskreis in Spalte "intColBUKRS" wechselt, dass der Zähler auch wieder von 1 beginnt. Bisher werden mit fortlaufende Nummer (ungeachtet vom Buchungskreis) erstellt. Ich habe jetzt schon Einiges durch experimentiert, aber ohne Erfolg. Hat jemand eine Idee wie ich es besser machen kann. Für Eure Hilfe bin ich Euch sehr dankbar.

Option Explicit
Private intColBUKRS As Integer
Private intColInvPos As Integer
Private intColXBLNR As Integer
Private lo As ListObject
Private Sub InvNo()
Dim ws As Worksheet
Dim intRowNo As Integer
Dim intInvNo As Integer
Dim intYear As Integer
Dim intCC As Integer
Set ws = shAufstellung
Set lo = ws.ListObjects("tblSource")
intColBUKRS = GetHeaderColumn("Company Code")
intColInvPos = GetHeaderColumn("Invoice position")
intColXBLNR = GetHeaderColumn("Reference")
intYear = ActiveWorkbook.BuiltinDocumentProperties(6)
intInvNo = ActiveWorkbook.BuiltinDocumentProperties(5)
Application.ScreenUpdating = False
On Error Resume Next
If intYear  Year(Date) Then
intInvNo = 0
intYear = Year(Date)
ActiveWorkbook.BuiltinDocumentProperties(6) = intYear
End If
For intRowNo = 1 To lo.DataBodyRange.Rows.Count
intCC = lo.DataBodyRange(intRowNo, intColBUKRS)
If lo.DataBodyRange(intRowNo, 2).Text  "No" _
And lo.DataBodyRange(intRowNo, intColInvPos).Value = 1 _
Then
intInvNo = intInvNo + 1
ActiveWorkbook.BuiltinDocumentProperties(5) = intInvNo
lo.DataBodyRange(intRowNo, intColXBLNR) = intCC & intYear & Format(intInvNo, "0000")
Else:
If lo.DataBodyRange(intRowNo, 2).Text  "No" _
And lo.DataBodyRange(intRowNo, intColInvPos).Value  1 _
And lo.DataBodyRange(intRowNo, intColXBLNR).Value = "" _
Then
lo.DataBodyRange(intRowNo, intColXBLNR).Value = lo.DataBodyRange(intRowNo - 1, intColXBLNR).Value
End If
End If
Next intRowNo
Err.Clear
Application.ScreenUpdating = True
End Sub
'get header column
Private Function GetHeaderColumn(ByVal strHeader As String)
Dim i As Integer
Set lo = shAufstellung.ListObjects("tblSource")
For i = 1 To lo.ListColumns.Count
If UCase(lo.HeaderRowRange.Columns(i)) = UCase(strHeader) Then
GetHeaderColumn = lo.HeaderRowRange.Columns(i).Column
Exit Function
End If
Next i
'not found, return 0, leads to an error
GetHeaderColumn = 0
End Function

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Rechnungsnummern erstellen
08.12.2022 17:50:57
onur
Ist ja nett, dass du den Code gepostet hast, aber ohne die dazugehörige Datei bringt das nicht viel.
AW: Rechnungsnummern erstellen
09.12.2022 13:26:44
Daniel
Hallo Ralf,
vielen Dank für die von Dir erstelle Variante. Vor allem, dass Du Dir Zeit genommen hast, mein Problem lösen zu wollen.
Da die Tabelle ohnehin schon viele Spalten aufweist, wollte ich diese nicht weiter für den EndUser aufblähen. Was Du nicht wissen konntest, da ich nur einen Auszug der Tabelle hochgeladen hatte, da diese Firmendaten enthält. Aus dieser Tabelle wird nämlich das Rechnunsdokument erstellt, der dazugehörige Buchungsbeleg sowie der Versand der Dokumente per Mail bzw. der Buchungsbeleg wird entsprechend nach SAP hochgeladen/ verbucht.
Anzeige
AW: Rechnungsnummern erstellen
09.12.2022 14:04:36
ralf_b
Kein Problem.
Ich hatte auch über Dictionary nachgedacht aber du hast ja schon mit der Positionspalte eine Näherung zu den laufenden Nummern pro CompanyCode.
Du speicherst die letzte Nummer in die Documentproperties. Somit gehe ich davon aus das die Datei immer die Selbe ist.
Somit wäre eine Speicherung der max Re-Nr auch in einer separaten Tabelle mit Zuordnung zu den Companies oder was auch immer du dazu benötigst möglich.
AW: Rechnungsnummern erstellen
09.12.2022 09:23:16
Steffen
Um den Zähler bei jedem Wechsel des Buchungskreises von 1 beginnen zu lassen, können Sie den Zähler in einem Dictionary speichern und die Rechnungsnummern für jeden Buchungskreis separat erstellen. Hier ist ein Beispiel für die Änderungen in der InvNo()-Funktion:

Private Sub InvNo()
Dim ws As Worksheet
Dim intRowNo As Integer
Dim intInvNo As Integer
Dim intYear As Integer
Dim intCC As Integer
Dim dicInvNos As Object
Set dicInvNos = CreateObject("Scripting.Dictionary")
Set ws = shAufstellung
Set lo = ws.ListObjects("tblSource")
intColBUKRS = GetHeaderColumn("Company Code")
intColInvPos = GetHeaderColumn("Invoice position")
intColXBLNR = GetHeaderColumn("Reference")
intYear = ActiveWorkbook.BuiltinDocumentProperties(6)
Application.ScreenUpdating = False
On Error Resume Next
If intYear  Year(Date) Then
'initialisiere den Zähler für alle Buchungskreise
For Each intCC In lo.DataBodyRange.Columns(intColBUKRS).Value
If Not dicInvNos.Exists(intCC) Then
dicInvNos.Add intCC, 0
End If
Next
intYear = Year(Date)
ActiveWorkbook.BuiltinDocumentProperties(6) = intYear
End If
For intRowNo = 1 To lo.DataBodyRange.Rows.Count
intCC = lo.DataBodyRange(intRowNo, intColBUKRS)
If lo.DataBodyRange(intRowNo, 2).Text  "No" _
And lo.DataBodyRange(intRowNo, intColInvPos).Value = 1 _
Then
'verwende den Zähler für den aktuellen Buchungskreis
intInvNo = dicInvNos(intCC) + 1
dicInvNos(intCC) = intInvNo
lo.DataBodyRange(intRowNo, intColXBLNR) = intCC & intYear & Format(intInvNo, "0000")
Else:
If lo.DataBodyRange(intRowNo, 2).Text  "No" _
And lo.DataBodyRange(intRowNo, intColInvPos).Value  1 _
And lo.DataBodyRange(intRowNo, intColXBLNR).Value = "" _
Then
lo.DataBodyRange(intRowNo, intColXBLNR).Value = lo.DataBodyRange(intRowNo - 1, intColXBLNR).Value
End If
End If
Next intRowNo
Err.Clear
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Rechnungsnummern erstellen
09.12.2022 13:37:42
Daniel
Hallo Steffen,
vielen Dank für die Zeit, die Du Dir genommen hast, um mein Problem zu lösen.
Auf die Idee, ein Dictionary zu schreiben, bin ich nicht gekommen, bzw. soweit bin ich leider noch nicht in VBA.
Dein Code funktioniert auch bestens, jedoch habe ich noch nicht herausgefunden, wie dieser den Wert im folgenden Monat erhöhen würde, ausgehend von der letzmaligen vergebenen Nummer innerhalb des Buchungskreises. Auf Basis dieser Tabelle soll ein Rechnungsformular erstellt werden und im Idealfall soll erst die Nummer vergeben werden, wenn diese dazugehörige Rechnung als pdf abgespeichert wird und im Folgemonat bei Ausführung des Codes die Nummernfolge erhöhen.
Hast Du hierzu noch einen Tipp für mich? Muss ich hierzu das Workbook_BeforeSave Event verwenden?
Anzeige
AW: Rechnungsnummern erstellen
10.12.2022 09:16:51
Steffen
Um die Nummernfolge im Folgemonat zu erhöhen, müssen Sie die aktuelle Jahreszahl überprüfen und den Zähler für jeden Buchungskreis im Dictionary zurücksetzen, wenn das aktuelle Jahr sich geändert hat. Dies können Sie in einer eigenen Sub-Funktion tun, die im Workbook_BeforeSave-Event aufgerufen wird.
Hier ist ein Beispiel für die neue Funktion ResetInvoiceNumbers, die im Workbook_BeforeSave-Event aufgerufen wird:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim intYear As Integer
intYear = ActiveWorkbook.BuiltinDocumentProperties(6)
If intYear  Year(Date) Then
ResetInvoiceNumbers intYear
End If
End Sub
Private Sub ResetInvoiceNumbers(intYear As Integer)
Dim ws As Worksheet
Dim lo As ListObject
Dim intColBUKRS As Integer
Dim dicInvNos As Object
Set ws = shAufstellung
Set lo = ws.ListObjects("tblSource")
intColBUKRS = GetHeaderColumn("Company Code")
Set dicInvNos = CreateObject("Scripting.Dictionary")
'initialisiere den Zähler für alle Buchungskreise
InitializeInvoiceNumbers lo, intColBUKRS, dicInvNos
'aktualisiere das aktuelle Jahr im Workbook-Property
ActiveWorkbook.BuiltinDocumentProperties(6) = Year(Date)
End Sub

Hinweis: In diesem Beispiel werden die shAufstellung-Variable und die tblSource-Tabelle verwendet. Stellen Sie sicher, dass diese Variablen und Objekte in Ihrem Code korrekt definiert sind.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige