如何在关闭用户窗体后继续 excel sheet 中唯一数字的序列?

How to continue the sequence of the unique numbers in the excel sheet after closing the userform?

当用户窗体关闭并稍后打开时,我在获取唯一编号(序列号)的序列时遇到了问题。首先,当我在用户表单中填写数据时,所有内容都以正确的顺序完美地捕获在 excel sheet 中;如果我通过用新数据填充用户表单来关闭用户表单和 运行 代码,唯一 ID 再次从“1”开始,但不是根据之前的 excel sheet 行号已保存。

下面是我试过的代码:

Private Sub cmdSubmit_Click()
    Dim WB As Workbook
    Dim lr As Long

    Set WB = Workbooks.Open("C:\Users\Desktop\Book2.xlsx")

    Dim Database As Worksheet
    Set Database = WB.Worksheets("Sheet1")
    eRow = Database.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

    lr = Database.Range("a65536").End(xlUp).Row
    With Sheets("Sheet1")
        If IsEmpty(.Range("A1")) Then
            .Range("A1").Value = 0
        Else
            Database.Cells(lr + 1, 1) = Val(Database.Cells(lr, 1)) + 1
        End If
    End With

    Database.Cells(eRow, 4).Value = cmbls.Text
    Database.Cells(eRow, 2).Value = txtProject.Text
    Database.Cells(eRow, 3).Value = txtEovia.Text
    Database.Cells(eRow, 1).Value = txtUid.Text

    Call UserForm_Initialize
    WB.SaveAs ("C:\Users\Desktop\Book2.xlsx")

End Sub

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

Private Sub UserForm_Initialize()
    With txtUid
        .Value = Format(Val(Cells(Rows.Count, 1).End(xlUp)) + 1, "0000")
        .Enabled = False
    End With
    With txtProject
        .Value = ""
        .SetFocus
    End With
End Sub

在此图片中,如果您看到唯一 ID 重复 1 和 2,但我需要 1,2,3,4....

我认为这就是问题所在。每次用户表单为 Initialized 时,您都需要重新计算最后一行。

Private Sub UserForm_Initialize()

Dim ws as Worksheet: Set ws = Thisworkbook.Sheets("Database")
    With txtUid
        .Value = Format(ws.Range("A" & ws.Rows.Count).End(xlUp) + 1, "0000")
        .Enabled = False
    End With

    With txtProject
        .Value = ""
        .SetFocus
    End With
End Sub

使用行号或[最大范围值+1]作为序列号总是有风险的。 使用工作表范围内的名称之类的东西更安全,它具有可以递增的值。然后序列独立于你的数据。

例如

Function GetNextSequence(sht As Worksheet) As Long
    Const SEQ_NAME As String = "SEQ"
    Dim nm As Name, rv As Long

    On Error Resume Next
    Set nm = sht.Names(SEQ_NAME)
    On Error GoTo 0

    'add the name if it doesn't exist
    If nm Is Nothing Then
        Set nm = sht.Names.Add(Name:=SEQ_NAME, RefersToR1C1:="=0")
    End If

    rv = Evaluate(nm.Value) + 1
    nm.Value = rv
    GetNextSequence = rv
End Function