如何在不必多次计算数组的情况下为值数组实现类似 ISBETWEEN 的函数?

How to implement an ISBETWEEN-like function for arrays of values without having to calculate the array more than once?

ISBETWEEN 函数测试值是否落在下限和上限之间。由于 Excel 中没有本机 ISBETWEEN 函数,被测值必须进行两次比较;首先使用“>”,然后使用“<”(或“>=”和“<=”用于包含边界的 ISBETWEEN 测试。)

两次比较值意味着必须计算两次,当该值是一个数组时,这可能会非常昂贵。即使在最好的时候,数组函数也有些神秘,加倍这样的计算也会使函数的可读性直线下降。

我的问题是,是否有人知道一种技术可以为值数组提供类似于 ISBETWEEN 的功能,而无需对该数组进行双重计算?我的偏好是使用本机 Excel 功能来执行此操作,但是,如果有人有一些很棒的 VBA,那也很好。

非常感谢您的宝贵时间!

根据我上面的评论:这并没有为您的问题提供 100% 的答案,但由于它非常笼统,我认为这是我能得到的最接近答案的答案。

想象一下电子表格设置如下:

我们可以使用 CTE/Array 公式计算 3 到 5 之间的所有值:

={SUM(IF(LOOKUP(A1:A6,{3,"B";6,"C"})="B",1,0))}

结果:

5

这是一种非常迂回的方法,但是 A1:A6 的数组只需要被引用一次。这很酷。

请注意,上面公式中的小括号实际上并没有输入,而是输入数组公式时excel放置的,表明它是数组公式......你可能已经知道了不过如果你已经读到这里了。

所以我已经能够根据 here 的想法开发出一块 VBA。

Dim vValueArg As Variant, vLowerArg As Variant, vUpperArg As Variant, vTestLower As Variant, vTestUpper As Variant

Function ISBETWEEN(vValue As Variant, vLower As Variant, vUpper As Variant, Optional bInc As Boolean = True) As Variant

vValueArg = vValue
vLowerArg = vLower
vUpperArg = vUpper

If bInc Then
   vTestLower = [GetValue() >= GetLower()]
   vTestUpper = [GetValue() <= GetUpper()]
Else
   vTestLower = [GetValue() > GetLower()]
   vTestUpper = [GetValue() < GetUpper()]
End If

ISBETWEEN = [IF((GetTestLower() * GetTestUpper()) = 1, TRUE, FALSE)]

End Function

Function GetValue() As Variant
   GetValue = vValueArg
End Function

Function GetLower() As Variant
   GetLower = vLowerArg
End Function

Function GetUpper() As Variant
   GetUpper = vUpperArg
End Function

Function GetTestLower() As Variant
   GetTestLower = vTestLower
End Function

Function GetTestUpper() As Variant
   GetTestUpper = vTestUpper
End Function

第一个参数可以是单个值、范围或数组。如果是单个值,那么接下来的两个参数也必须是单个值(但这有点违背代码的目的!)

第二个和第三个参数也可以是单个值、范围或数组。如果范围由多个单元格或多个值的数组组成,则这些参数的维度必须与第一个参数的维度匹配。 (注意 - 我没有用二维范围或数组测试代码!)

最后一个可选参数确定是否执行 ISBETWEEN 测试,包括或不包括边界。 TRUE = 包括边界;即 arg2 <= arg1 <= arg3(默认值,因此可以省略)。 FALSE = 排除边界;即 arg2 < arg1 < arg3.

虽然这可能不是世界上最漂亮的代码,但它紧凑、快速(无循环)并且可以处理任何大小的范围和数组。

希望你们中的一些人觉得这很有用! :)