【问题标题】:BeforeUpdate event validation controlBeforeUpdate 事件验证控件
【发布时间】:2021-10-11 20:20:58
【问题描述】:

亲爱的,

我想制作一个简单的用户表单来将一些序列号记录到excel中,它包含一个textbox_serialNo.,一个命令按钮“输入”和另一个命令按钮“取消”。

我在那个 serialNo 文本框中做了一个验证控件,因此只能输入数字。但是,当我运行程序并在文本框中输入一些数字时,两个命令按钮(名为 label_enter 的“enter”按钮,名为 label_cancel 的“cancel”按钮)都没有反应(例如,“cancel”按钮没有按时卸载表格),我应该如何更正程序?以下是相关代码,谢谢。

Private Sub TextBox_SerialNo_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox_SerialNo.Value) Then
    TextBox_SerialNo.BackColor = rgbYellow
End If
Cancel = True
End Sub

Private Sub TextBox_SerialNo_AfterUpdate()
If TextBox_SerialNo.Value <> "" Then
    TextBox_SerialNo.BackColor = rgbWhite
End If
End Sub

Private sub label_enter_click()
sheet1.Select
Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1
ActiveCell.Offset(0, 1) = TextBox_SerialNo.Value
 TextBox_SerialNo.Value = ""
 End Sub

Private Sub Label_Cancel_Click()
Unload Me
End Sub

【问题讨论】:

  • “两个命令按钮”的代码片段在哪里?如何在没有看到它们的代码的情况下回答你提到这两个按钮的问题?你真的指的是命令按钮吗?
  • 您好,“两个命令按钮”是指“取消”命令按钮和“输入”命令按钮。 “取消”命令按钮代码如上所示,“输入”命令按钮代码为: sheet1.select;单元格(Rows.Count, 1).End(xlUp).Offset(1, 0).Select; ActiveCell.Value = TextBox_SerialNo.Value; ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1; ActiveCell.Offset(0, 1) = TextBox_SerialNo.Value; TextBox_SerialNo.Value = "";结束子
  • 1.请不要在评论中发布代码。编辑您的问题并将代码放在那里。 2. 那么,您是否有一个名为“Label_Cancel”的按钮,按下时它不会卸载表单? 3.根据我在发布的代码中可以理解的任何选择都是无用的。您应该避免选择、激活...
  • 嗨,我刚刚更新了问题中的代码,是的,我有一个名为“Label_Cancel”的按钮,按下时它不会卸载表单。我的代码中可能有很多错误.....
  • 您的代码看起来没有优化,但它应该可以工作。你能分享你正在使用的工作簿吗?

标签: excel vba validation controls beforeupdate


【解决方案1】:

很抱歉作为答案发布,没有足够的代表。

Cancel=True 不应该在 if 语句中吗?无论条目是否为数字,您都将其锁定。

编辑: 实际上,经过进一步的测试,仍然无法正常工作。但是,更改事件效果更好,您可以获得任何非数字的即时反馈。

更新后的代码如下所示,控件名称不同。我习惯于使用 .Text,与 .Value 相同。另外,由于我不确定您将如何处理空字符串,因此假设它也是黄色背景。

一个问题是,您可以在其中允许逗号或句点吗?根据区域设置,小数也将被视为数字。

Private Sub cmdCancel_Click()

    Unload Me

End Sub

Private Sub cmdEnter_Click()
    
    If TextBox1.BackColor = rgbYellow Then Exit Sub
    test4.Range("A1").Value = TextBox1.Text

End Sub

Private Sub TextBox1_Change()

    If Not IsNumeric(TextBox1.Text) Or TextBox1.Text = "" Then
        TextBox1.BackColor = rgbYellow
    Else
        If TextBox1.Text <> "" Then
            TextBox1.BackColor = rgbWhite
        End If
    End If
    
End Sub

编辑 2:我使用这段代码只检查数字(假设数字 Ascii 代码是标准的)。也许它可以提供帮助。

Public Function isnumber(ByVal strValue As Variant) As Boolean

    On Error Resume Next
    
    Dim i As Long
    
    isnumber = True
    If Not strValue = "" Then
        For i = 1 To Len(CStr(strValue))
            If Asc(Mid(strValue, i, 1)) > 57 Or Asc(Mid(strValue, i, 1)) < 48 Then
                isnumber = False
                Exit For
            End If
        Next i
    Else
        isnumber = False
    End If
    
    On Error GoTo 0
    Err.Clear
    
End Function

编辑 3:我已经修改了 TextBox1_Change 事件代码,因此所有无效字符都被立即删除。但是,在这种状态下,如果您复制粘贴带有不允许的字符的序列号,它将剥离它们,只留下数字。不确定是否可以接受。

Private Sub TextBox1_Change()

    If Not isnumber(TextBox1.Text) Or TextBox1.Text = "" Then
        TextBox1.BackColor = rgbYellow
            
        Dim i As Long
        Dim strValue As String
        
        strValue = ""
        
        If Not TextBox1.Text = "" Then
            For i = 1 To Len(CStr(TextBox1.Text))
                If Not (Asc(Mid(TextBox1.Text, i, 1)) > 57 Or Asc(Mid(TextBox1.Text, i, 1)) < 48) Then
                    strValue = strValue & Mid(TextBox1.Text, i, 1)
                End If
            Next i
        End If
        
        TextBox1.Text = strValue
        
    Else
        If TextBox1.Text <> "" Then
            TextBox1.BackColor = rgbWhite
        End If
    End If
    
End Sub

【讨论】:

  • 非常感谢,Gokhan Aycan 先生。文本框中不允许使用逗号或句号,我只有一个 preli。试试看,似乎可行。我需要一些时间来验证它是否真的有效......并且会让你知道......
  • 再次感谢。我试过你的第一个版本,一个缺点是仍然可以输入字母(是的,如果输入的是字母,它的背景颜色会显示为黄色,但这不是我最初的想法)。我将包括你的第二版,但我想首先澄清一些事情,即公共函数名称是 Isnumber,但我似乎在你的第一版中找不到这个关键字,或者我有一些误解.. ..?谢谢。
  • isnumber 是我自己编写的一个函数(可能是从网上得到的想法),它和任何其他函数一样。您将使用isnumber (TextBox1.Text) 而不是IsNumeric (TextBox1.Text)。对于仍然可以输入其他字符的部分,您可以立即从文本中去除无效字符(除数字以外的任何字符),而不是用黄色为背景着色?
  • 我将第 2 版包含在程序中,是的比使用 IsNumeric 更好,但是我仍然可以在列表中输入带有字母的序列号,这不是我想要的......(是的,当有字母时,组合框背景颜色变为黄色。)
  • 在编辑 3 的情况下,由于我们将剥离的 strValue 分配回文本框,因此会触发另一个不必要的更改事件。根据您的情况,这可能是可接受的,也可能是不可接受的。如果不可接受,您可以使用用户窗体范围的全局布尔变量绕过更改事件的代码,以防止不必要的计算。
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2019-09-13
相关资源
最近更新 更多