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

时间:2016-03-26 11:15:56

标签: excel vba excel-vba excel-2013 countif

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

我目前正在处理一个用于记录事件的Userform。但是,我无法在VBA中找到如何编写代码,该代码将导致上一行中的下一个可用编号填充用户窗体中的INC编号文本框(ADD_txtSEC_INC_No)(然后相应地更新电子表格)。

结束格式应显示为 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

其他信息 当这个表单生效时,我需要继续使用上一个数字,例如,如果我们当前工作表上的公司编号,在行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格式。

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

3 个答案:

答案 0 :(得分:1)

据我了解,您之前的行有一个事件编号,如 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")

这将按您所需的格式汇集您需要的所有细分。但这假定你想要今天的日期,而不是从前一行中提取日期。如果您确实想要复制上一行中的日期,那么您可以使用它来代替:

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函数再次给它一个五位数的掩码。

答案 1 :(得分:1)

为了保证下一个可用的号码,您应该在{A}栏中COUNTIF以前的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。

答案 2 :(得分:1)

我发现使用最后一行构建新的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