2016-03-26 13 views
3

Ich benutze Excel 2013 (64 Bit).Konfigurieren Sie Jobnummer, um Präfix, Jahr, Monat und nächste fortlaufende Nummer zu integrieren

Ich arbeite derzeit an einem Benutzerformular, mit dem Vorfälle protokolliert werden. Allerdings konnte ich in VBA nicht herausfinden, wie der Code erstellt werden soll, der dazu führt, dass die nächste verfügbare Nummer aus der vorherigen Zeile das INC-Nummernfeld (ADD_txtSEC_INC_No) im Benutzerformular füllt (und dann die Tabelle entsprechend aktualisiert).

sollte das Endformat angezeigt als IncYYYYMM-00000 - Beispiel: Inc201603-00456 (das ist genau das, was ich brauche)

I (unten) einen Code zur Zeit hat, die die nächste Nummer bringt aber Es ist nicht im erforderlichen Format. Sample of New form in development

Private Sub UserForm_Initialize() 
'** SECURITY INCIDENT NUMBER IN TEXTBOX 
'**WORKS 

    Me.ADD_txtSEC_INC_No.Enabled = True 
    Dim irow As Long 
    Dim ws As sw_SecIncidentDetails 
    Set ws = sw_SecIncidentDetails 

'find last data row from database' 
    irow = ws.Cells(Rows.Count, 1).End(xlUp).Row 

    Me.ADD_txtSEC_INC_No.Text = ws.Cells(irow, 1).value + 1 

End Sub 

Weitere Informationen Wenn diese Form live geht, dann werde ich es aus der vorherigen Reihe, beispielsweise aus weiter haben müssen, wenn die Inc Nummer auf unserem aktuellen Blatt, in Reihe A ist Inc201603- 00456 dann würde ich Ihren Code benötigen, um zur nächsten Inc-Nummer zu gehen, wenn das Formular initialisiert wird, zB Inc201603-00457 Wir können die Nummerierung nicht von 0000 starten, weil das die Sequenz aus vorherigen Einträgen herauswerfen würde. Entschuldigung, das klingt verwirrend.

In Spalte B Ich habe die Zelle durch eine Textbox ADD_Date_Recorded_TXT genannt bevölkert, die codiert:

 Me.ADD_Date_Recorded_TXT.value = Format(Now, "dd/mm/yyyy") 

Ich erwähne dies, weil Davids unter Lösung das Format des Datums mm zu ändern scheint/dd/yyyy (verstehe nicht, warum es das getan hat) - Ich brauche alle meine Daten im Format TT/MM/JJJJ.

Ich dachte nur, ich diese Probleme oben eher im Abschnitt „Weitere Informationen“ adressieren würde als

Antwort

1

Ich finde es ziemlich gefährlich, die letzte Zeile zu verwenden, um die neue ID zu erstellen. Wenn die erste Spalte unsortiert wäre, würden Sie wahrscheinlich doppelte Kennungen erhalten. So würde ich zum ersten Mal für die maximale Anzahl in der ersten Spalte sucht, dann diese Zahl erhöht und schließlich einen neuen Identifier Format:

Private Sub UserForm_Initialize() 
'** SECURITY INCIDENT NUMBER IN TEXTBOX 
'**WORKS 

    Me.ADD_txtSEC_INC_No.Enabled = True 
    Dim nextNumber As Long 
    Dim nextId As String 
    Dim ws As sw_SecIncidentDetails 
    Set ws = sw_SecIncidentDetails 

    ' get the next record number from the first column 
    nextNumber = GetNextRecordNumber(ws.UsedRange.Columns(1)) 

    ' build the new record id 
    nextId = "Inc" & Format(Now, "yyyymm") & Format(nextNumber, "-00000") 

    Me.ADD_txtSEC_INC_No.text = nextId 

End Sub 

Private Function GetNextRecordNumber(source As Range) As Long 
    Dim max$, v 
    For Each v In source.value 
    If InStr(1, v, "Inc") = 1 And v > max Then max = v 
    Next 
    If max <> Empty Then GetNextRecordNumber = Split(max, "-")(1) + 1 
End Function 
+0

Hallo Florent B, vielen Dank für Ihre Zeit und Mühe Leider gibt es nur ein Problem, ich kann nicht scheinen, es zu arbeiten, es erzeugt einen Laufzeitfehler '9' - "Index außerhalb des Bereichs. It zeigt kein Debug an, um mir anzuzeigen, wo das Problem liegt - ich hatte meinen gesamten Code, der sich auf diese Funktion bezieht, auskommentiert Ich hatte diesen Fehlercode vorher nicht Alles, was ich getan habe, kopiert die Routinen und fügt sie unter passender ein Subroutinen Ich habe auch einige 'Zusätzliche Informationen' in meinem orig post hinzugefügt, die zusätzliche Hilfe sein können Mit viel Dankbarkeit, ShyButterfly – TheShyButterfly

+0

Es gibt wahrscheinlich eine Record-ID beginnend mit "Inc" aber ohne ein "-" in. Können Sie es überprüfen? –

+0

Ich werde es überprüfen :) Vielen Dank für Ihre Zeit :) – TheShyButterfly

1

zu jedem individuell zu reagieren Wie ich es, Ihre vorherigen Zeile zu verstehen hat einen Vorfall Zahl wie Inc201603-00455 und Sie müssen Inc201603-00456 für Ihre neue generieren? Wenn ja, versuchen Sie, Ihre letzte Zeile mit diesem ersetzen:

Me.ADD_txtSEC_INC_No.Text = "Inc" & Year(Date) & Format(Month(Date), "00") & "-" & Format(Split(ws.Cells(irow, 1).value, "-")(1) + 1, "00000") 

Dies wird montieren alle Segmente, die Sie benötigen, in Ihrem gewünschten Format. Aber das setzt voraus, dass Sie das heutige Datum wünschen, anstatt das Datum von Ihrer vorherigen Zeile abzuheben. Wenn Sie tatsächlich das Datum aus dem vorherigen Zeile kopieren wollen, dann würden Sie diese stattdessen verwenden:

Me.ADD_txtSEC_INC_No.Text = Split(ws.Cells(irow, 1).value, "-")(0) & "-" & Format(Split(ws.Cells(irow, 1).value, "-")(1) + 1, "00000") 

Wir haben die Split-Funktion werden mit der alten Vorfallsnummer mit dem Bindestrich als Trennzeichen zu teilen. So ist Teil (0) 'Inc201603' und Teil (1) ist die Nummer als Textstring '00456'. Aber sobald Sie mit ihm rechnen (+1), wird der Wert zu einer reinen Zahl, '456', deshalb verwenden wir die Format-Funktion, um ihm wieder eine fünfstellige Maske zu geben.

+0

Hallo David, ty für Ihre Zeit und Mühe Sie sind richtig, das Datum basierend auf Heute jedoch gibt der 1. Code, den Sie gaben, mir 2 Ausgaben 1. In Spalte B in Blatt Zellen sind mit Me.ADD_Date_Recorded_TXT.value = Format (jetzt, "TT/MM/JJJJ") gefüllt, aber jetzt hat mm/dd/yyyy format Muss UK-Datumsformat TT/MM/JJJJ in Spalte B sein 2. Das tatsächliche Datum, das aus Ihrem Code kommt Inc201604-201605 und wenn ich einen anderen Eintrag erstellen, es nicht inc rement auf die nächste fortlaufende Nummer, kommt als die gleiche Anzahl Inc201604-201605 Ich schätze die Mühe, die Sie in gesetzt haben, obwohl Cheers, ShyButterfly – TheShyButterfly

1

Um die nächste verfügbare Nummer zu garantieren, sollten Sie COUNTIF die vorherigen IncYYYYMM- nnnnn Zahlen in Spalte A

Private Sub UserForm_Initialize() 
'** SECURITY INCIDENT NUMBER IN TEXTBOX 
'**WORKS 

    Me.ADD_txtSEC_INC_No.Enabled = True 
    Dim i As Long, str As String 
    Dim ws As sw_SecIncidentDetails 
    Set ws = sw_SecIncidentDetails 

    'find last data row from database' 
    str = Format(Date, "\I\n\cyyyymm") 
    i = Application.CountIf(ws.Columns(1), str & Chr(42)) 

    Me.ADD_txtSEC_INC_No.Text = str & Format(i, "-00000") 

End Sub 

Dies wird dynamisch funktionieren. Nächsten Monat wird die Zählung bei Inc201604-00000 neu gestartet.

+0

Hallo Jeeped, Vielen Dank für Ihre Zeit und Mühe. Ich möchte nicht, dass die Nummer die Nummerierung jeden Monat neu startet. Die Nummernfolge muss unabhängig von Monat und Jahr fortgeführt werden. Die einzigen Dinge, die sich ändern, sind das Jahr und der Monat, basierend auf dem Datum, an dem der Vorfall/Auftrag protokolliert wird. – TheShyButterfly