使用IF函数时,如何在“Logical_test”参数中使用动态集进行比较?

时间:2010-08-09 16:09:02

标签: excel excel-formula

我使用数组公式(在Excel 2003中)来计算满足特定条件的字符串数。由于文件大小的限制,我使用一列字符串而不是单元格表来存储我的数据。

公式如下:

{=SUM(IF((VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),6,1))*VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),1,1)))=VLOOKUP(D2,t.lkup,2,FALSE),1,0))}

表达式VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),6,1))查看命名范围中的单元格以返回值。此值乘以表达式VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),1,1))返回的另一个值。然后在VLOOKUP(D2,t.lkup,2,FALSE)给出的一组数字中查找生成的产品,该数字返回类似“{1,2,3,4}”的字符串。如果乘积是set的元素,则将1添加到总和中,否则将0添加到总和中。

当我使用上面的数组公式(使用动态查找集)时,返回值为零。如果我使用以下公式,

{=SUM(IF((VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),6,1))*VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),1,1)))={1,2,3,4},1,0))}

然后返回正确的总和。有谁知道如何让Excel将集查找视为静态集而不是字符串?

1 个答案:

答案 0 :(得分:0)

数组公式执行多个clalculations并返回单个结果或数组。公式中的所有数组参数必须大小相同。

在你的第一个例子中,你将某个值的某个值(因为IF中的最外层函数是一个VALUE()函数)与一个返回字符串的VLOOKUP进行比较......这个字母必须出错......这个事实就是你的string包含大括号不会将其转换为数组。

在第二个示例中,您将单个值与包含元素{1,2,3,4}的数组进行比较,因此实际上您进行了四次比较,如果其中一个解析为TRUE,则添加1。

我不知道如何在不使用VBA的情况下将逗号分隔的字符串“{1,2,3,4}”转换为数组{1,2,3,4},但也许您可以更改通过将VALUE(...)* VALUE(...)数转换为字符串并使用FIND()函数将数字标识为条件字符串的子字符串来实现策略。

e.g。说你的MID_CONCATENATE_TIMES_BLA_BLAH结果是7,你的

  • condition string =“{1,3,5,7,9}”,FIND(MID_BLA,CONX_STR)= TRUE
  • condition string =“{1,2,3,4}”,FIND(MID_BLA,CONDX_STR)= FALSE

只要您的结果是1位数,这将有效。如果数字超过1位,则需要在MID_BLA和CONDX_STR中的数字之前加入SPACE;也不是太困难,但为公式增加了更多的复杂性。

如果你想做VBA,你可以使用Split()函数从一个单独的字符串创建一个从零开始的数组

Function StrToArray(Arg As String) As Variant
    StrToArray = Split(Arg, ",")
End Function

并通过StrToArray(VLOOKUP(...))在(1)中传播你的VLOOKUP,在这种情况下你必须从条件字符串中删除花括号。

希望有所帮助 - 祝你好运