在我的程序中,我在userfrom中有一段代码,它们查看自己的控件并循环查看是否所有这些代码都是空的。这是为了将所有非空控件的值用作搜索参数。它们是三个列表框和三个组合框。如果它找到一个非空的控件,它会将该函数设置为false并退出。这是因为我的搜索找到了可以使用的标准。我有这样的设置:
Function IsAllEmpty() As Boolean
'presumes true until we find evidence of a control being not empty
IsAllEmpty = True
'function elsewhere that sets my control background to normal
ClearControlFormatting
Dim ctrl As Control
'checks every control in the form
For Each ctrl In Me.Controls
'that is tagged with "searchme" (there are 6, three listbox, three combobox)
If ctrl.Tag = "SEARCHME" Then
'if the value of the control isn't null or len = 0
If Not IsNull(ctrl) Or Len(ctrl) <> 0 Then
ctrl.BackColor = vbGreen
IsAllEmpty = False 'in my other code, I can continue the search if this is triggered
MsgBox "Everything is good (no sarcasm) on this control!"
Exit Function
Else: MsgBox "EVERYTHING IS EMPTY, CARL. THAT KILLS PEOPLE."
End If
End If
Next
'If something is empty, tell the user to correct it
If IsAllEmpty = True Then
MsgBox "YOU NEED TO FILL OUT YOUR SEARCH, PAUL."
End If
End Function
我尝试了各种方法来实现这一目标:
但是,每次,我都会看到此功能突出显示我的所有控件绿色,然后继续尝试搜索。 (搜索中的函数调用表示如果所有单元格都返回null,则退出子节点。)
我很茫然,非常感谢你的帮助!谢谢!
P.S。:如果有帮助,上面的代码是以下代码的修改版本,旨在检查是否存在任何空控件。当我在我的控件上使用它时,它发现它们都是空的并且按照设计工作。
Function CheckForEmpty() As Boolean
CheckForEmpty = True
ClearControlFormatting
Dim ctrl As Control
'Checks each control that needs to be filled for null or 0 length value
'For every one it finds, it marks red
CheckForEmpty = True
For Each ctrl In Me.Controls
If ctrl.Tag = "FILL" Then
If IsNull(ctrl) Or Len(ctrl) = 0 Then
ctrl.BackColor = vbRed
CheckForEmpty = False
End If
End If
Next
'If something is empty, tell the user to correct it
If CheckForEmpty = False Then
MsgBox "Please fill out red boxes!"
End If
End Function
答案 0 :(得分:-1)
在此行中,更改为明确表示您正在寻找值:
If Not IsNull(ctrl) Or Len(ctrl) <> 0 Then
更改为:
If (Not IsNull(ctrl.Value)) OR (Len(ctl.Value & "") <> 0) Then
首先,我将.Value限定符添加到控件中。这是默认属性,但有时(例如,在分配变量或检查null时),它可能会检查Control本身是否为null,因为VBA并不总是足够聪明,可以阅读您的想法而且您已经#39在技术上告诉它检查控制,而不是它的价值:明确。
其次,我使用括号将两个支票明确地分成两个单独的支票。不确定它是否严格要求,但最好是清晰易读,现在我们不必担心它可能是错误地读取布尔逻辑。
第三,我在.Value中添加了一个ZLS连接,如果在检查长度之前将其强制为ZLS(如果尝试检查一个Len(),则会得到一个“无效使用空”&#39;错误空值)。
正如Tom提到的那样,在这种情况下,ctrl永远不会为null(因为它是表单集合中的一部分,它不会在其中包含空引用),所以整个事情可以简化为:
If Len(ctrl.Value & "") <> 0 Then 'ctrl has no value entered
最后,将其打包在Trim()
函数中,以防万一那里有一个(或两个或更多)空格,你有:
If Len(Trim(ctrl.Value & "")) <> 0 Then 'ctrl has no meaningful value entered