配置作业编号以包含前缀、年、月和下一个序号

Configure job number to incorporate prefix, year, month and next sequential number

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

我目前正在处理用于记录事件的用户表单。但是,我一直无法在 VBA 中计算出如何得出代码,该代码将导致上一行中的下一个可用数字填充用户窗体中的 INC 数字文本框(ADD_txtSEC_INC_No)(和然后相应地更新点差sheet)。

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

我目前有一个代码(如下)可以显示下一个数字,但它不是所需的格式。 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

附加信息 当此表格上线时,我需要让它从以前的号码继续,例如,如果我们当前 sheet 上的 Inc 号码,在 A 行中是 Inc201603-00456 然后我需要你的代码在表格初始化时转到下一个公司号码,例如 Inc201603-00457 我们不能从 0000 开始编号,因为那样会使序列从之前的条目中消失。 对不起,如果这听起来令人困惑。

B 列中,我用一个名为 ADD_Date_Recorded_TXT 的文本框填充单元格,该文本框的编码为:

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

我提到这个是因为下面 David 的解决方案似乎将日期格式更改为 mm/dd/yyyy(不明白为什么这样做)- 我需要我所有的日期都保留在 dd/mm/yyyy 格式。

我只是想在 "Additional Information" 中解决上述这些问题,而不是单独回复每个问题

据我了解,您的前一行的事件编号类似于 Inc201603-00455,您需要生成 Inc201603-00456为你的新?如果是这样,请尝试用此替换您的最后一行:

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

这将 assemble 您需要的所有片段,以您需要的格式。但这假设您想要今天的日期,而不是从上一行中提取日期。如果您真的想从上一行复制日期,那么您可以改用它:

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

我们正在使用 Split 函数使用连字符作为分隔符来划分旧事件编号。所以第 (0) 部分是 'Inc201603',第 (1) 部分是作为文本字符串的数字“00456”。但是一旦你用它做数学运算 (+1),这个值就变成了一个纯数字,“456”,所以这就是为什么我们使用 Format 函数再次给它一个五位数的掩码。

为了保证下一个可用的数字,您应该COUNTIF A 列中以前的 IncYYYYMM-nnnnn 个数字。

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

这将动态工作。下个月计数将在 Inc201604-00000 处重新开始。

我发现使用最后一行来构建新 ID 非常危险。如果第一列未排序,您可能会得到重复的标识符。 所以我会先搜索第一列中的最大数字,然后递增该数字,最后格式化一个新的标识符:

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