【问题标题】:Distinguishing between 'Null' and '0' when taking the sum of a range of columns取一系列列的总和时区分“Null”和“0”
【发布时间】:2015-12-17 19:03:19
【问题描述】:

我试图区分无输入或“Null”与输入包括数字0 的内容。

我编写了一个名为“ZeroToAppear”的公共函数,通过将数字 0 作为字符串返回,与索引匹配函数一起使用时效果很好,但它不能与财务预算中常见的 sum 函数一起使用:

Public Function ZeroToAppear(x As Variant) As Variant

    If IsNull(x) Then
            ZeroToAppear = Null
    ElseIf x = 0 Then
        ZeroToAppear = CStr(x)
    Else
        ZeroToAppear = x
    End If
End Function

我已经合理化了问题在于 excel 自动将 null 视为 0 以避免 ArgumentNullExceptions。

所以我正在尝试编写另一个宏,该宏在获取可以区分无输入和 0 或更大输入的范围之和时会起作用,因为在 excel 中没有输入的单元格的总和自动等于零,我想要它报告 null 甚至更好地报告 false 以便根本不做总和。

我已经开始编写一个函数来测试我将求和的范围内的每个单元格,以查看它是否为空、错误或其他什么。如果它为 null 或错误,我希望它将 null 报告到测试数组中。如果还有其他输入,我希望它报告输入到测试数组中的任何内容。然后我想确定整个测试数组是否报告 null 以使我的原始函数为 false 并且不在我正在测试的范围内运行总和,但如果有其他值,那么函数应该返回 true 并且可以运行总和。

Public Function NullOrErrorFalse() As Variant

Dim arrOutput() As Variant
ReDim arrOutput(n) As Variant
n = 0
For Each cell In NullOrErrorFalse()
  If IsNull(cell) Then
     arrOutput(n) = Null
  ElseIf IsError(cell) Then
     arrOutput(n) = Null
  Else
     arrOutput(n) = cell.Value
  End If
n = n + 1
Next cell


Sub test(arrOutput())
If arrOutput() = Null Then
  NullOrErrorFalse = False
Else
  NullOrErrorFalse = True
End If

End Sub

End Function

此时我的函数将无法正确编译,并且对于 VBA 和一般编程来说是新手,我不确定我的问题是误用还是语法或操作顺序。

【问题讨论】:

  • 你不能在这样的函数中嵌套 Sub。

标签: arrays vba excel


【解决方案1】:

是的,由于对 VBA 语法的误解,存在编程缺陷。

Public Function NullOrErrorFalse() As Variant
    Dim arrOutput() As Variant
    ....
    For Each cell In NullOrErrorFalse()

NullOrErrorFalse 是函数的名称,而不是您正在检查的参数。更改它时,您实际上是在更改结果。另一方面,您需要为您的函数提供它将检查的参数(范围)。

您可以通过这种方式将总和自定义为用户定义函数 (UDF):

Public Function SumOrNull(r As Range) As Variant
    SumOrNull = 0
    For Each cel In r
        If IsError(cel) Or cel = "" Or Not IsNumeric(cel.Value) Then
            SumOrNull = CVErr(xlErrValue)
            Exit Function
        End If
        SumOrNull = SumOrNull + cel.Value
    Next
End Function

这个想法是,只要有任何您不想要的模式,您的 UDF 就会引发错误,以便 Excel 显示 #Value,并且使用您的 UDF 的单元格被认为是错误的。

【讨论】:

  • 感谢您提供此替代功能。当我将其应用于包含所有空白单元格的电子表格时,它没有返回任何错误,并且总和仍在运行。
  • 这有点奇怪,因为我测试成功了。请额外努力检查您是否正确使用它。请记住,我们的想法是将其作为公式输入,例如 =SumOrNull(F5:F7)
  • 谢谢 ASH,是的,我正在一系列单元格上测试它。但是当我在其中一个单元格中输入 0 时,它也会报告一个错误,所以这个函数不能区分 0 和 null。或者至少它没有将 0 视为数值。
  • 所以我尝试将 cel = "" 的第二个条件更改为 cel =Null ,然后没有产生错误,但是 sum 函数运行了,在这种情况下我不希望它运行。跨度>
  • 不,你不应该改变它。发生在你身上的 zero 事情不会发生在我自己的测试中。老实说,我看不出原因,我只能猜测在你的情况下这可能是单元格格式的问题。
猜你喜欢
  • 2011-04-27
  • 2022-01-24
  • 2020-07-04
  • 2013-03-04
  • 2018-11-08
  • 1970-01-01
  • 2023-04-07
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多