如果捕获了所有数据,请关闭UserForm

时间:2015-12-30 13:55:27

标签: vba excel-vba word-vba userform excel

假设您有UserForm TextBox1TextBox3TextBox3OK按钮。

要仅允许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声明之外还有另一种方法吗?

4 个答案:

答案 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

enter image description here

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 vs .Text

最后,在这种情况下,我认为应该使用.Value而不是.Text.Text更适合在输入时验证文本框条目,但在这种情况下,您需要查看文本框保存的数据,这是您从{{1}获得的内容}。

更多用户反馈 - 着色

我差点忘了,我想要包含这个如何包含更多用户反馈的示例。在提供有用的反馈和压倒性的过多之间存在平衡。如果整体形式复杂,或者如果预期用户具有偏好,则尤其如此,但关键字段的颜色指示通常是有益的。许多应用程序可能首先显示没有颜色的表单,然后在用户遇到问题时将其着色。

.Value

enter image description here

答案 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