Dears,
我想制作一个简单的用户表单,将一些序列号记录到excel中,它包含一个textbox_serialNo。,一个命令按钮"输入"和另一个命令按键"取消"。
我在serialNo文本框中做了一个验证控件,这样只能输入数字。然而,当我运行程序并在文本框中输入一些数字时,两个命令按钮(名为label_enter的"输入"按钮和名为label_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
很抱歉作为回答发布,没有足够的代表。
Cancel=True
不应该在if语句中吗?无论输入是否为数字,您都将其锁定。
编辑:事实上,经过进一步的测试,仍然无法正常工作。不过,change事件的效果更好,您可以获得任何非数字的即时反馈。
更新后的代码如下所示,控件名称不同。我习惯于使用.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