我要在下一行添加一条带有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
答案 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作为值,则使用您当前的代码,他们将具有:
MsgBox
弹出MsgBox
再次弹出MsgBox
再次弹出!...这会引起用户对系统的高度憎恶:)