我知道可以使用LOOKUP或VLOOKUP从值所属的连续范围列表中查找范围。我知道您可以使用IF语句执行一些功能强大但很糟糕的事情来执行类似的操作。
我要做什么:
我的计算值在1%到100%之间(代表月球沿着月球划定轨道一周的距离)。
我需要确定计算值是否属于以下范围:
s.__proto__.sum = function(items, prop){
return items.reduce( function(a, b){
return a + +b[prop];
}, 0);
};
sTotal = s.sum(s, 'AMOUNT');
console.log(sTotal);
因此,我需要检查计算值是否落在任何计算范围内,如果是,则返回关联的文本。如果没有,则返回一个空白(“”)。
我想知道我是否只需要使用一个丑陋的嵌套IF语句,或者是否有某种优雅的方法可以使用一个或两个查找函数来完成我想要的操作。一个挑战是要测试的整个范围是稀疏的(范围的一部分应返回空白)。
我可以看到的一种方法不是使用稀疏范围-只是在每个现有范围之间填充一个返回空白的范围,然后使用LOOKUP或VLOOKUP。这是我最好的选择,还是有更好的解决方案?
例如:
0 - 0.6 Full
11.9 - 13.1 3/4 Waning
24.4 - 25.6 1/2 Waning
36.9 - 38.1 1/4 Waning
49.4 - 50.6 No Moon
61.9 - 63.1 1/4 Waxing
74.4 - 75.6 1/2 Waxing
86.9 - 88.1 3/4 Waxing
99.4 - 100 Full
答案 0 :(得分:2)
鉴于您的原始数据分为三列,并格式化为名为PhaseTbl
的表,并带有列标题Min
,Max
和Phase
,相信以下内容用您要在A2中测试的值来做您需要的事情:
=IFERROR(INDEX(PhaseTbl,AGGREGATE(15,6,1/((A2>=PhaseTbl[Min])*(A2<=PhaseTbl[Max]))*ROW(PhaseTbl)-ROW(PhaseTbl[#Headers]),1),3),"")
相表
样本结果
您可以使用公式评估工具检查此公式的工作原理。 简而言之,从内到外->外出
(A2>=PhaseTbl[Min])*(A2<=PhaseTbl[Max])
我们取我们的值,并通过乘以布尔比较,返回1和0的数组,这取决于我们是否满足以下条件:在同一行中,测试值都大于(或等于)Minimum和小于或等于最大值。
1/{1,0,0,...}
将0
转换为错误值。
带有AGGREGATE
参数的ignore errors
函数的数组形式将返回匹配的行号。我们调整表位置以返回INDEX
函数中第3列的值。
答案 1 :(得分:1)
除了罗恩的答案,您还可以使用数组公式:
=IFERROR(INDEX(PhaseTbl[State],MATCH(1,([@Value]>=PhaseTbl[Min])*([@Value]<=PhaseTbl[Max]),0)),"")
答案 2 :(得分:1)
我还有另一个选择,其中包含三个基本公式IF
,COUNTIFS
和INDEX(MATCH())
,并且没有数组。正如其他答案所建议的那样,我首先建议您将数据分为3列:“最小值”,“最大值”和“相位”,因此看起来像以下示例。
输入数据:
A B C
1|Min |Max | Phase |
+---+-----+-----------+
| 0 |0.6 | Full |
|11.9|13.1|3/4 Waning |
|24.4|25.6|1/2 Waning |
|36.9|38.1|1/4 Waning |
|49.4|50.6| No Moon |
|61.9|63.1|1/4 Waxing |
|74.4|63.1|1/2 Waxing |
|86.9|88.1|3/4 Waxing |
|99.4|100 | Full |
以上数据以A1
开头,您的输出数据以F1
开头看起来像下面的示例,下面的公式在G2
中。
公式:
=IF(COUNTIFS(A:A,"<="&F2,B:B,">="&F2)=1,INDEX(C:C,MATCH(F2,A:A,1)),"")
输出数据:
F G
1|Value|Result |
+-----+----------+
| 0 |Full |
|0.6 |Full |
|0.7 | |
|11.8 | |
|11.9 |3/4 Waning|
|13.1 |3/4 Waning|
|13.2 | |
|24.3 | |
|24.4 |1/2 Waning|
|25.6 |1/2 Waning|
|25.7 | |
|99.3 | |
|99.4 |Full |
|100 |Full |
|110 | |
公式说明:
=IF(COUNTIFS(A:A,"<="&F2,B:B,">="&F2)=1,INDEX(C:C,MATCH(F2,A:A,1)),"")
F2
并且“最大”列表中的任何值都大于或等于F2
F2
”的“ Phase”(这是在计算的MATCH
部分中完成的) INDEX(MATCH())
公式,将匹配类型设置为“ 1:小于”)