configuration作业编号,以合并前缀,年份,月份和下一个连续编号

我正在使用Excel 2013(64位)。

我目前正在使用用于logging事件的用户窗体。 不过,我一直无法在VBA中find如何创build代码,这将导致在用户窗体中填充INC编号文本框(ADD_txtSEC_INC_No)的前一行中的下一个可用编号(然后相应地更新电子表格)。

结束格式应该显示为IncYYYYMM-00000 – 例如: Inc201603-00456 (这正是我所需要的)

我目前有一个代码(下面),它会显示下一个数字,但它不是所需的格式。 在开发中的新forms的示例

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 

其他信息当这个表单变为LIVE时,我将需要从前一个数字继续,例如,如果我们当前表单上的公司编号是Inc201603-00456,那么我需要您的代码去到Inc201603-00457我们不能从0000开始编号,因为这会从先前的input中排除序列。 对不起,如果这听起来很混乱。

在列B中,我有一个名为ADD_Date_Recorded_TXT的文本框填充单元,

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

我提到这一点,因为大卫的解决scheme似乎将date的格式更改为mm / dd / yyyy(不明白为什么这样做) – 我需要我所有的date保持在dd / mm / yyyy格式。

我只是认为我会在“附加信息”中解决上述问题,而不是单独回答每个问题

我发现使用最后一行来构build新的ID非常危险。 如果第一个柱子没有sorting,你可能会得到重复的标识符。 所以我会先search第一列的最大数字,然后增加这个数字,最后格式化一个新的标识符:

 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 

据我了解,您的上一行有Inc201603-00455事件编号,您需要为您的新产生Inc201603-00456 ? 如果是这样,请尝试replace你的最后一行:

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

这将以你需要的格式组装你需要的所有部分。 但是,这是假定你想要今天的date,而不是提前一行的date。 如果你真的想复制上一行的date,那么你应该使用它:

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

我们使用分割function来使用连字符作为分隔符来分割旧的事件编号。 所以部分(0)是'Inc201603',部分(1)是作为文本string的数字'00456'。 但是,只要你用它做math(+1),数值就变成了一个纯数字'456',所以我们使用Format函数给它一个五位掩码。

为了保证下一个可用号码,您应该在A列中logging以前的IncYYYYYnnnnn号码。

 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 

这将dynamic工作。 下个月,计数将在Inc201604-00000重新开始。