如何修复“用单元格值比较用户窗体文本框”代码

时间:2019-01-10 06:27:01

标签: excel vba

我要在下一行添加一条带有sr.no和其他数据的记录。当我在用户窗体文本框中输入一个数字时,它必须检查它是否重复。数字按顺序排列

Private Sub TextBox1_Change()

    Dim x As Long
    Dim y As Worksheet

    Set y = Sheets("Data")
    x = y.Range("A" & Rows.Count).End(xlUp).Row

    If CInt(TextBox1.Value) <= CInt((Sheets("Data").Range
    .Cells(x, "A").Value)) 
    Then
        MsgBox "Duplicate serial no. found. Increase it"
    End If

End Sub

enter image description here

2 个答案:

答案 0 :(得分:1)

我同意@MatteoNNZ。无需询问用户S.No.因为用户将如何知道当前的用户号是哪个?

我推荐2个选项

[A] 自动插入序号:从图片中,行号始终为(Lastrow-5),因此,如果要填充第9行,则序号将为{ {1}}。例如

9-5=4

[B] 以表格形式自动填充S.No::找到最后一行并从中减去5,然后在用户窗体中显示。保留文本框Sub Sample() Dim ws As Worksheet Dim lRow As Long Set ws = Sheet1 With ws lRow = .Range("A" & .Rows.Count).End(xlUp).Row '~~> Insert Sno .Range("A" & lRow).Value = lRow - 5 End With End Sub

locked

答案 1 :(得分:1)

您发布的代码可能已经可以正常工作了,但是我会采用另一种方法。

序列号是系统应计算的值,而不是用户应插入的值。因此,我的建议是使用功能获取下一个序列号:

Private Function getNextSerial() As Long
    Dim x As Long
    Dim y As Worksheet

    Set y = Sheets("Data")
    x = y.Range("A" & Rows.Count).End(xlUp).Row

    getNextSerial = y.Cells(x, "A").Value + 1 
End Function

...,并在初始化表单时直接在TextBox1中进行设置。例如,假设您的表单名为MyUserForm,则在此表单的Initialize()事件中,您应该输入以下内容:

Me.TextBox1.Text = getNextSerial() '<-- write next serial
Me.TextBox1.Locked = True '<-- forbid writing

如果您真的想使用用户键入序列号的方法,那么您仍然可以使用函数getNextSerial()并输入:

If Me.TextBox1.Text <= getNextSerial() Then

...但是,请注意,您正在TextBox.Change事件中执行此操作。这意味着,如果用户想输入1001作为值,则使用您当前的代码,他们将具有:

  • 键入“ 1”-> MsgBox弹出
  • 继续显示“ 10”-> MsgBox再次弹出
  • 继续显示“ 100”-> MsgBox再次弹出!
  • 结束键入“ 1001”->最后!

...这会引起用户对系统的高度憎恶:)