我正在使用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格式。
我只是认为我会在“附加信息”中解决上述问题,而不是单独回复每个
答案 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