2013-02-19 119 views
1

有没有人有任何精彩的想法来简化这个难点公式?当你看到它时不要惊慌,我会尽力解释。目前使用INDEX,ROW,SUMPRODUCT和IFERROR简化Excel公式

= IFERROR(INDEX(rangeOfDesiredValues,(1/SUMPRODUCT((rangeOfSerials = $ D 2 O)(rangeOfApps = cfgAppID)(rangeOfAccessIDs = cfgAccessID)* ROW(rangeOfDesiredValues))^ - 1)) “” )

当前我正在使用SUMPRODUCT做一个VLOOKUP的多个列作为条件的等价物。通常这只适用于数字结果,但由于我需要查找文本,因此我将SUMPRODUCT与ROW和INDEX结合使用。

不幸的是,当没有找到单元格时,我的SUMPRODUCT返回0.这会导致公式返回不正确的单元格而不是空白。出于这个原因,我通过这个计算运行结果:

(1/result)^-1 

这样的结果0变成错误和其他结果保持不变。我把这个喂给IFERROR,这样错误就会变成空白。

有谁知道如何使这个整洁?我无法在任何电子表格中创建新列。

+0

如果它工作正常,我不一定会改变它。你可能会改变的唯一的事情是你如何测试0,它不会使它更简单或更容易阅读。 – 2013-02-19 01:16:21

回答

4

当你想要找到一个值时,避免使用多条件求和功能,如SUMPRODUCT总是最好的(如果有多于一行匹配所有三个条件,它显然会给你一个不正确的结果或错误,我假设至多期望一场比赛呢?)。 ROW函数也可能会有问题,如果您在工作表中插入任何行.....

有几种方法可以工作。对于单个公式,使用MATCH是最常见的 - MATCH只会给出正确的位置或错误,所以零值没有问题。这将是这样的:

=IFERROR(INDEX(rangeOfDesiredValues,MATCH(1,(rangeOfSerials=$D20)*(rangeOfApps=cfgAppID)*(rangeOfAccessIDs=cfgAccessID),0)),"")

这是一个“数组公式”需要与CTRL+SHIFT+ENTER输入......或者你可以用这样一个额外的INDEX函数使之成为一个常规公式

=IFERROR(INDEX(rangeOfDesiredValues,MATCH(1,INDEX((rangeOfSerials=$D20)*(rangeOfApps=cfgAppID)*(rangeOfAccessIDs=cfgAccessID),0),0)),"")

第三种替代方案是使用LOOKUP其不需要 “阵列条目”

=IFERROR(LOOKUP(2,1/(rangeOfSerials=$D20)/(rangeOfApps=cfgAppID)/(rangeOfAccessIDs=cfgAccessID),rangeOfDesiredValues),"")

与以前的版本在多个匹配情况下略有不同 - 它会给你最后的匹配,而不是该场景中的第一个(但我假设你最多只有一个匹配,如上所述) 。

最后,如果你不介意使用助手列,你可以大大简化公式。只需使用“助手”列连接用破折号分隔的三个标准列,然后就可以使用简单的VLOOKUP或INDEX/MATCH,例如

=IFERROR(INDEX(rangeOfDesiredValues,MATCH($D20&"-"&cfgAppID&"-"&cfgAccessID,Helper_Column,0)),"")

+0

相当值得+1的努力。对我自己来说很多有用的东西非常感谢! – 2013-02-19 10:29:47

+0

非常感谢您的深思熟虑! – WoodenKitty 2013-02-21 22:41:22