Как продолжить последовательность уникальных чисел в листе Excel после закрытия пользовательской формы? - PullRequest
0 голосов
/ 26 августа 2018

У меня проблема с получением последовательности уникальных номеров (серийный номер), когда пользовательская форма закрывается и открывается позже.Во-первых, когда я заполняю данные в пользовательской форме, все отлично фиксируется в листе Excel с правильной последовательностью;если я закрываю пользовательскую форму и запускаю код, заполняя пользовательскую форму новыми данными, уникальные идентификаторы снова начинаются с «1», но не в соответствии с номером строки таблицы Excel, который был ранее сохранен.

IMG1

Ниже приведен код, который я пробовал:

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

На этом изображении, если вы видите, уникальные идентификаторы повторяют 1 и 2, но мне нужно как 1,2,3,4 ....

IMG2

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Всегда рискованно использовать номера строк или [максимальное значение диапазона +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
0 голосов
/ 26 августа 2018

Я думаю, что это проблема. Вам нужно пересчитывать последнюю строку каждый раз, когда пользовательская форма 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
...