Excel “如何修复”;比较userform textbox与cellvalue“;代码

Excel “如何修复”;比较userform textbox与cellvalue“;代码,excel,vba,Excel,Vba,我正在下一行添加一条记录,其中包含sr.no和其他数据。当我在userform文本框中输入一个数字时,它必须检查它是否不重复。这些号码是按顺序排列的 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.V

我正在下一行添加一条记录,其中包含sr.no和其他数据。当我在userform文本框中输入一个数字时,它必须检查它是否不重复。这些号码是按顺序排列的

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
Private子文本框1_Change()
暗x等长
将y作为工作表
设置y=图纸(“数据”)
x=y.Range(“A”和Rows.Count).End(xlUp).Row

如果CInt(TextBox1.Value)我同意@MatteoNNZ。无需向用户询问序列号。既然如此,用户如何知道哪一个是当前用户号码

我推荐两种选择

[A] 自动插入序号:从图像中,行号始终为(最后一行-5),因此如果要填充第9行,则序号将为
9-5=4
。比如说

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
[B] 在表单中自动填充S.No:找到最后一行并从中减去5,然后在用户表单中显示。保持文本框
锁定

Private Sub UserForm_Initialize()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = Sheet1

    lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

     '~~> Insert Sno
     TextBox1.Text = lRow - 5
End Sub

您发布的代码可能已经非常有效了,但我会选择另一种方法

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

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
。。。并在初始化表单时直接在
文本框1
中进行设置。例如,假设您的表单名为
MyUserForm
,则在此表单的
Initialize()
事件中,您应该放置如下内容:

Me.TextBox1.Text = getNextSerial() '<-- write next serial
Me.TextBox1.Locked = True '<-- forbid writing
。。。但是,请注意,您是在
文本框中执行此操作的。更改
事件。这意味着,如果用户希望使用当前代码键入1001作为值,他们将有:

  • 键入“1”-->
    MsgBox
    将弹出
  • 继续“10”->
    MsgBox
    再次弹出
  • 继续“100”->
    MsgBox
    再次弹出
  • 最后输入“1001”-->

。。。这将导致用户对系统产生强烈的仇恨:)

从用户友好的角度来看,您根本不应该要求用户插入序列号,而只需获取下一个序列号,并以只读模式将其提供到用户表单中。此外,请注意,您处于更改事件中,每当框中的文本小于或等于列表中的最后一个Sr.No.时,您都会弹出一个MsgBox。这意味着当你有1000条记录,而你的用户想要输入1001时,它们会有:“输入1->msgbox”,“输入10”->msgbox”,“输入100->msgbox”,“输入1001->finally ok”。你的用户会因此讨厌你:)并且为了通过注释完成这个小代码检查,请注意你没有处理任何
IsNumeric()
应用前
CInt(TextBox1.Value)
。这意味着,如果用户在其中键入字母,您的代码将崩溃。很抱歉,我不知道您正在发布asnwer:)一个建议…
Me.TextBox1.Enabled=False
可以是
Me.TextBox1.Locked=True
。要禁用编辑,但看起来非常活跃:PI直到5分钟前才知道:)要删除我的,你先来:)
If Me.TextBox1.Text <= getNextSerial() Then