【问题标题】:Configure job number to incorporate prefix, year, month and next sequential number配置工作编号以包含前缀、年份、月份和下一个序列号
【发布时间】:2016-03-26 11:15:56
【问题描述】:

我使用的是 Excel 2013(64 位)。

我目前正在开发一个用于记录事件的用户表单。但是,我无法在 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

其他信息 当这个表格上线时,我需要让它从以前的号码继续,例如,如果我们当前工作表上的 Inc 号码,在 A 行是 Inc201603-00456,那么我需要你的初始化表单时转到下一个 Inc 编号的代码,例如 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 格式.

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

【问题讨论】:

    标签: vba excel excel-2013 countif


    【解决方案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
    

    【讨论】:

    • 嗨 Florent B,感谢您的时间和精力不幸的是,只有一个问题,我似乎无法让它工作,它会生成运行时错误“9”-“下标范围。它没有显示调试以向我指出问题所在 - 我已注释掉与此函数相关的所有代码,我之前没有此错误代码。我所做的只是复制例程并粘贴他们在适当的子例程下。我还在我的原始帖子中添加了一些“附加信息”,可能会有所帮助。非常感谢,ShyButterfly
    • 可能有一个以“Inc”开头但没有“-”的记录ID。可以查一下吗?
    • 我会检查一下 :) 非常感谢您抽出宝贵时间 :)
    • 很抱歉没有尽快回复您。我接受了你的建议,果然你是对的。据我所知,您的代码可以 100% 运行……测试将在月份切换到新的月份时进行……但是如果/何时发生这种情况,我会担心。非常感谢您的帮助。
    【解决方案2】:

    据我了解,您的前一行有一个类似 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 函数再次给它一个五位数掩码的原因。

    【讨论】:

    • 嗨,大卫,感谢您的时间和精力。您是正确的,日期基于今天,但是,您提供的第一个代码给了我 2 个问题 1. 在工作表单元格的 B 列中,填满了我。 ADD_Date_Recorded_TXT.value = Format(Now, "dd/mm/yyyy") but now has mm/dd/yyyy format must be UK date format dd/mm/yyyy in Column B 2. 来自您的代码的实际日期是 Inc201604-201605 并且当我创建另一个条目时,它不会增加到下一个序列号,而是出现相同的数字 Inc201604-201605 我感谢您通过 Cheers,ShyButterfly 付出的努力
    【解决方案3】:

    为保证下一个可用号码,您应该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 重新开始。

    【讨论】:

    • 您好 Jeeped,感谢您的时间和精力。我不希望号码每个月都重新开始编号。无论月份和年份如何,编号顺序都必须继续。唯一会改变的是年和月,具体取决于事件/作业的记录日期。
    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多