Excel VBA:自动编号

Excel VBA:自动编号,vba,excel,autonumber,Vba,Excel,Autonumber,我正在Excel上创建一个数据库,在尝试为每一行分配自动编号时遇到了一些问题 要求如下: 当B列不为空时,为每行(A列上)生成自动编号 数字应该是唯一的,并且必须始终连接到同一行的内容,即使在对列进行排序或插入新行时也是如此 插入新行(同一列中的任意位置)时,应分配一个新编号(最新编号应为最大编号) 如果 可能的话,自动编号应该有一个前缀,编号应该以四位数字显示(例如0001、0011) 我试过从其他人的问题中找到的一些VBA代码(例如) 到目前为止,下面的代码工作得最好,但该代码无法解决需求(

我正在Excel上创建一个数据库,在尝试为每一行分配自动编号时遇到了一些问题

要求如下:

  • 当B列不为空时,为每行(A列上)生成自动编号
  • 数字应该是唯一的,并且必须始终连接到同一行的内容,即使在对列进行排序或插入新行时也是如此
  • 插入新行(同一列中的任意位置)时,应分配一个新编号(最新编号应为最大编号) 如果
  • 可能的话,自动编号应该有一个前缀,编号应该以四位数字显示(例如0001、0011)
  • 我试过从其他人的问题中找到的一些VBA代码(例如)

    到目前为止,下面的代码工作得最好,但该代码无法解决需求(3)和(4)

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim maxNumber
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
    ' don't run when more than one row is changed
        If Target.Rows.Count > 1 Then Exit Sub
    ' if column A in the current row has a value, don't run
        If Cells(Target.Row, 1) > 0 Then Exit Sub
    ' get the highest number in column A, then add 1 and write to the
    ' current row, column A
        maxNumber = Application.WorksheetFunction.Max(Range("A:A"))
        Target.Offset(0, -1) = maxNumber + 1
    End If
    End Sub
    
    我缺乏VBA的知识,希望有人能帮助我。 非常感谢。

    不要使用Max()查找下一个号码-而是使用隐藏的工作表或名称来存储当前号码,并在每次需要新Id时递增

    例如:

    Public Function NextNumber(SequenceName As String)
        Dim n As Name, v
        On Error Resume Next
        Set n = ThisWorkbook.Names(SequenceName)
        On Error GoTo 0
    
        If n Is Nothing Then
            'create the name if it doesn't exist
            ThisWorkbook.Names.Add SequenceName, RefersTo:=2
            v = 1
        Else
            'increment the current value
            v = Replace(n.RefersTo, "=", "")
            n.RefersTo = v + 1
        End If
        NextNumber = v
    End Function
    
    这允许您使用多个不同的序列,只要为每个序列指定一个不同的名称

    Dim seq
    seq = NextNumber("seqOne")
    'etc
    
    不要使用Max()查找下一个编号-而是使用隐藏的工作表或名称来存储当前编号,并在每次需要新Id时递增该编号

    例如:

    Public Function NextNumber(SequenceName As String)
        Dim n As Name, v
        On Error Resume Next
        Set n = ThisWorkbook.Names(SequenceName)
        On Error GoTo 0
    
        If n Is Nothing Then
            'create the name if it doesn't exist
            ThisWorkbook.Names.Add SequenceName, RefersTo:=2
            v = 1
        Else
            'increment the current value
            v = Replace(n.RefersTo, "=", "")
            n.RefersTo = v + 1
        End If
        NextNumber = v
    End Function
    
    这允许您使用多个不同的序列,只要为每个序列指定一个不同的名称

    Dim seq
    seq = NextNumber("seqOne")
    'etc
    

    “我正在用Excel创建数据库”-这是你的错误。Excel不是数据库。不使用Access有什么好的理由吗?(a)请注意,您的要求3与要求1相矛盾-即,当插入新行时,该行上的B列将为空,要求3表示应生成新id,但要求1表示不应生成。(b) 要求4是否意味着单元格的值必须包含前缀,或仅显示前缀-即使用数字格式
    “someprefix”0000
    是否满足要求?(c)当用户将整个第5行(例如)复制到第10行(例如)的顶部时,其中两行在复制之前都有有效的ID,复制后的第10行应该使用什么id?不要使用Max()查找下一个数字-而是使用隐藏的工作表或名称来存储当前数字,并在每次需要新id时递增它。“我正在Excel中创建数据库”-这是您的错误。Excel不是数据库。不使用Access有什么好的理由吗?(a)请注意,您的要求3与要求1相矛盾-即,当插入新行时,该行上的B列将为空,要求3表示应生成新id,但要求1表示不应生成。(b) 要求4是否意味着单元格的值必须包含前缀,或仅显示前缀-即使用数字格式
    “someprefix”0000
    是否满足要求?(c)当用户将整个第5行(例如)复制到第10行(例如)的顶部时,其中两行在复制之前都有有效的ID,复制后的第10行中应该使用什么id?不要使用Max()查找下一个编号-而是使用隐藏的工作表或名称来存储当前编号,并在每次需要新id时递增。