循环以检查TextBoxes是否为空

时间:2018-01-18 10:00:13

标签: vba excel-vba loops for-loop excel

我尝试For遍历表单上的所有控件以检查TextBox是否为空。然后将焦点放在第一个空的TextBox上。

我的Excel VBA表单有34个TextBox。目前它有一个嵌套的If函数,用于检查所有TextBox是否为空。如果第一个空文本框上有空.SetFocus

Sub ValidateForm()
  If TextBox1.Text = Empty Then
      TextBox1.SetFocus
  Else    
       If TextBox2.Text = Empty Then .........

想象一下这有34个嵌套吗? 所以我尝试了For Each循环解决方案。但它不起作用!有什么想法吗?

Sub ValidarForm5()
    For Each ctrl In UserForm1.Controls
        If TypeName(ctrl) = "TextBox" Then
            If ctrl.Text = Empty Then
                ctrl.SetFocus
            End If
        End If
    Next ctrl
End Sub

2 个答案:

答案 0 :(得分:1)

您的ValidarForm5代码有效。我在Userform上测试过它而没有丢失任何错误。 @Peh在他的评论中提供了一个解决方案,但我想我会通过解释你的代码现在正在做什么来扩展。

您正在遍历所有34个文本框,一次一个。因此,您正在测试TextBox1以查看它是否为空。如果是,那么您SetFocusTextbox1。然后你转到TextBox2并测试一下。如果它是空的,那么你SetFocusTextbox2 ..然后......和... ..

所以这意味着如果最后一个TextBox(Textbox34)为空,那么这将是最后一个设置焦点的文本框。如果那不是空的,那么它将是之前的等等..等等。

你所追求的是 第一个 Textbox是空的。正如@Peh所提到的,你只需要在设置第一个循环后退出循环。使用Exit For就可以轻松完成此操作:

Sub ValidarForm5()
    For Each ctrl In UserForm1.Controls
        If TypeName(ctrl) = "TextBox" Then
            If ctrl.Text = Empty Then
                ctrl.SetFocus
                Exit For
            End If
        End If
    Next ctrl
End Sub

答案 1 :(得分:0)

如果您在UserForm中使用自己的代码,请使用Me代替UserForm1并声明您的变量。如果找到一个空的TextBox,你必须退出For循环,否则你将不会留在其中。

UserForm中的代码

Option Explicit    ' declaration head of your userform code module

Sub ValidateForm()
Dim ctrl As Object
For Each ctrl In Me.Controls
    If TypeName(ctrl) = "TextBox" Then
        If ctrl.Text = Empty Then
            ctrl.SetFocus
            Exit For    ' escape to remain in found textbox
        End If
    End If
Next ctrl
End Sub