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

ISBETWEEN函数testing一个值是否在下限和上限之间。 在Excel中没有原生的ISBETWEEN函数时,被测值必须进行两次比较; 先用'>',然后用'<'(或'> ='和'<='表示包含边界的ISBETWEENtesting)。

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

我的问题是,是否有人知道一种技术,为一个值的数组提供类似ISBETWEEN的function,而不是该数组的双重计算? 我的首选是使用本地Excelfunction做到这一点,但如果任何人有一些伟大的VBA,这将是很好的。

非常感谢您的时间!

从我上面的评论构build:这并不能为你的问题提供100%的答案,但是因为它是非常通用的,所以我认为这是最接近我能得到的答案。

设想一个电子表格,如下所示:

在这里输入图像说明

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

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

结果:

 5 

这是一个很好的做法,但是A1:A6的数组只需要被引用一次。 这很酷。

请注意,上面公式中的圆括号并不是实际input的,但是当您input数组公式时,可以通过excel进行放置,以指示它是数组公式,但您可能已经知道,但是如果您已经阅读了这一点。

所以我能够根据这个想法开发一块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 

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

第二个和第三个参数也可以是单个值,范围或数组。 如果一个范围包含多个单元格或多个值的数组,那么这些参数的维数必须与第一个参数的维数相匹配。 (NB – 我没有用2维范围或数组testing代码!)

最后的可选参数决定是否执行ISBETWEENtesting,包括或不包括边界。 TRUE =包含边界; 即arg2 <= arg1 <= arg3(默认值,因此可以省略)。 FALSE =排除边界; 即arg2 <arg1 <arg3。

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

希望你们中的一些人觉得这有用! 🙂