我尝试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
答案 0 :(得分:1)
您的ValidarForm5
代码有效。我在Userform上测试过它而没有丢失任何错误。 @Peh在他的评论中提供了一个解决方案,但我想我会通过解释你的代码现在正在做什么来扩展。
您正在遍历所有34个文本框,一次一个。因此,您正在测试TextBox1
以查看它是否为空。如果是,那么您SetFocus
到Textbox1
。然后你转到TextBox2
并测试一下。如果它是空的,那么你SetFocus
到Textbox2
..然后......和... ..
所以这意味着如果最后一个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