假设您有UserForm
TextBox1
,TextBox3
,TextBox3
和OK
按钮。
要仅允许UserForm
关闭所有三个TextBox
都有数据,我会使用以下脚本分配给OK
按钮:
Private Sub CommandButton1_Click()
If Len(TextBox1.Value) >= 1 And _
Len(TextBox2.Value) >= 1 And _
Len(TextBox3.Value) >= 1 Then
Me.Hide
Else
MsgBox "Please Complete All Fields!"
End If
End Sub
除了If
声明之外还有另一种方法吗?
答案 0 :(得分:1)
正如我在评论中所说,这是一种可行的方法。但是我发布这个就是为了让你有另一种方式的例子。这样您就可以评估文本框设置时的内容。
Option Explicit
Dim bBox1Value As Boolean
Dim bBox2Value As Boolean
Dim bBox3Value As Boolean
Private Sub TextBox1_Change()
If Trim(TextBox1.Text) <> "" Then
bBox1Value = True
End If
End Sub
Private Sub TextBox2_Change()
If Trim(TextBox2.Text) <> "" Then
bBox2Value = True
End If
End Sub
Private Sub TextBox3_Change()
If Trim(TextBox3.Text) <> "" Then
bBox3Value = True
End If
End Sub
Private Sub CommandButton1_Click()
If bBox1Value = True And bBox2Value = True And bBox3Value = True Then
Me.Hide
Else
MsgBox "Please Complete All Fields!"
End If
End Sub
答案 1 :(得分:1)
您可以使用循环:
Private Sub CommandButton1_Click()
Dim n as long
For n = 1 to 3
If Len(Trim(Me.Controls("TextBox" & n).Value)) = 0 Then
MsgBox "Please Complete All Fields!"
Exit Sub
End If
Next n
Me.Hide
End Sub
答案 2 :(得分:1)
优先在做出无效操作后通知用户是阻止用户首先执行该无效操作[1]。一种方法是使用Textbox_AfterUpdate
事件来调用控制OK按钮的Enabled
属性的共享验证例程,并控制状态标签的显示。结果是一个信息量更大的界面,只允许有效的操作,从而限制了msgbox弹出窗口的麻烦。这是一些示例代码和屏幕截图。
Private Sub TextBox1_AfterUpdate()
RunValidation
End Sub
Private Sub TextBox2_AfterUpdate()
RunValidation
End Sub
Private Sub TextBox3_AfterUpdate()
RunValidation
End Sub
Private Sub RunValidation()
If Len(TextBox1.Value) = 0 Or Len(TextBox2.Value) = 0 Or Len(TextBox3.Value) = 0 Then
CommandButton1.Enabled = False
Label1.Visible = True
Else
CommandButton1.Enabled = True
Label1.Visible = False
End If
End Sub
Private Sub CommandButton1_Click()
Me.Hide
End Sub
If
声明就If
语句而言,有很多方法可以做,但我认为除了直接评估TextBox.Value
之外的任何事情都会导致不必要的管道和代码复杂性,所以我认为除了OP中的If
陈述之外,很难争论任何其他事情。话虽如此,这个特殊的If
语句可以通过利用其数字性质来轻微压缩,这允许
Len(TextBox1.Value) = 0 Or Len(TextBox2.Value) = 0 Or Len(TextBox3.Value) = 0
替换为
Len(TextBox1.Value) * Len(TextBox2.Value) * Len(TextBox3.Value) = 0
虽然这并没有给你带来太大的影响,并且可以说是可读性较低的代码,但它确实允许使用精简的内容,特别是如果文本框被重命名...
If Len(TB1.Value) * Len(TB2.Value) * Len(TB3.Value) = 0 Then
最后,在这种情况下,我认为应该使用.Value
而不是.Text
。 .Text
更适合在输入时验证文本框条目,但在这种情况下,您需要查看文本框保存的数据,这是您从{{1}获得的内容}。
我差点忘了,我想要包含这个如何包含更多用户反馈的示例。在提供有用的反馈和压倒性的过多之间存在平衡。如果整体形式复杂,或者如果预期用户具有偏好,则尤其如此,但关键字段的颜色指示通常是有益的。许多应用程序可能首先显示没有颜色的表单,然后在用户遇到问题时将其着色。
.Value
答案 3 :(得分:0)
您可以使用以下代码
Private Sub CommandButton1_Click()
If Trim(TextBox1.Value & vbNullString) = vbNullString And _
Trim(TextBox2.Value & vbNullString) = vbNullString And _
Trim(TextBox3.Value & vbNullString) = vbNullString Then
Me.Hide
Else
MsgBox "Please Complete All Fields!"
End If
End Sub
我从这个问题得到了答案 VBA to verify if text exists in a textbox, then check if date is in the correct format