如何为值数组实现类似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。
虽然这可能不是世界上最漂亮的代码,但是它紧凑,快速(无循环),并且可以处理任何大小的范围和数组。
希望你们中的一些人觉得这有用! 🙂