我有一个包含多个文本框的用户表单。如果TextBox2和/或TextBox3中有任何内容,我想要一个消息框,但TextBox1中没有任何内容。如果用户在发生这种情况时无法继续,我也会喜欢它。
这是我目前的代码:
Private Sub SubmitCommandButtom_Click()
If Len(TextBox1) = "" And Len(TextBox2) > 0 Or Len(TextBox3) > 0 Then
MsgBox "Unit Number must be entered to continue!"
End If
Sheets("Uneven Split Job Aid").Range("A2") = TextBox1.Value
Sheets("Uneven Split Job Aid").Range("B2") = TextBox2.Value
Sheets("Uneven Split Job Aid").Range("C2") = TextBox3.Value
此代码目前仅在Textbox3中存在值而不在TextBox1中时生成消息框,如果TextBox2中有任何内容则无关紧要。我想要检查TextBox2的值。此外,当我在消息框上单击“确定”时,Sub继续运行并将TextBox的值插入到工作表中。如果出现消息框,我想不会发生这种情况。
提前感谢您的帮助!
答案 0 :(得分:2)
使用And
/ Or
布尔逻辑时,有时需要使用括号来确保正确计算它。当它是:
If Con1 And Con2 Or Con3 Then
正在被解释:
Con1
和Con2
都是真的吗? 或者
Con3
是真的吗? 所以,我添加括号来阅读:
If Con1 And (Con2 Or Con3) Then
将被解释为:
Con1
是真的吗?和
Con2
或Con3
是真的吗?如果我理解你的问题,那就是你的目标逻辑。但是,这确实意味着如果TextBox2
和Textbox3
都为空,那么TextBox1
是否有任何内容都无关紧要; MsgBox
不会发生,其余代码将会发生。
进一步的布尔分析:
由于Con1
- Len(TextBox1) = ""
- 始终解析为False
(请参阅下面的注释1),And
检查 - Con1 And Con2
总是false
。因此,if
语句可以解析为true
的唯一方法是Con3
解析为True
。
由于Con3
为Len(TextBox3) > 0
,因此整个if语句取决于TextBox3
中文本的长度!
注意:
Len(TextBox1) = ""
将始终等于false。 Len()
返回的数字不是字符串。我认为你偶然结合了两种检查空字符串的方法。 TextBox1.Value = ""
或Len(TextBox1.Value) = 0
都有效;但是,这种组合没有意义。 虽然在我发现这个问题之前,我花了大部分时间来打听我的答案。
最好在访问内容时使用TextBox.Value
或TextBox.Text
而非TextBox
。
仅当TextBox1
为空时,您对MsgBox
内容的当前检查才会导致TextBox1
。此排除空格字符,例如空格。如果在只有空格字符时也需要MsgBox
,则应尝试使用Len(Trim(TextBox1.Value)) = 0
而不是之前的Len(TextBox1) = ""
)。
您可以查看有关此问题的其他建议here如果您不想触发{{1},您可能还需要考虑在TextBox2
和TextBox3
上添加类似的检查如果他们有空白字符,但没有任何非空白字符。
MsgBox
答案 1 :(得分:0)
替换:
If Len(TextBox1) = "" And Len(TextBox2 & TextBox3) > 0 Then
使用:
@Injectable()