Excel VBA:检查以确保所有控件都不为空

时间:2015-11-27 08:38:53

标签: excel vba excel-vba

在我的程序中,我在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

我尝试了各种方法来实现这一目标:

  • 将Not IsNull(ctrl)语句嵌套在if中的唯一一个,If Len(ctrl)&lt;&gt; 0部分(IDK为什么)
  • 移除Len(ctrl)&lt;&gt; 0部分
  • 编辑Or语句的两个部分以评估ctrl.Value =“”而不是
  • 从组合框中移除“SEARCHME”标签,以防它们的动态值出现干扰。

但是,每次,我都会看到此功能突出显示我的所有控件绿色,然后继续尝试搜索。 (搜索中的函数调用表示如果所有单元格都返回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

1 个答案:

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