配置作业编号以包含前缀、年、月和下一个序号
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
我正在使用 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