Excel中的Case函数等效
Excel中的Case函数等效
我有一个有趣的挑战——我需要在Excel中对以下数据进行检查:
| A - B - C - D |
|------|------|------|------|
| 36 | 0 | 0 | x |
| 0 | 600 | 700 | x |
|___________________________|
请原谅我糟糕的ASCII艺术。所以我需要对D列(x)进行与相邻单元格的检查,然后根据需要转换数值。以下是要求:
如果B列大于0,一切都很好,我可以喝咖啡。如果不满足此要求,那么我需要根据一个表将A1转换成另一个值,例如,将32转换为1420并放入D中。不幸的是,A和它需要转换成的值之间没有关联,因此无法创建计算公式。
在这种情况下,使用case或switch语句会非常完美,但我认为它不是Excel的原生函数。我也觉得将一堆=IF()语句链接在一起有点疯狂,我尝试了四次才决定这是个坏主意(这就是我的生活故事)。
在Excel 2016 / Office 365中现在可以使用Switch函数。
Switch函数的语法如下:
SWITCH(expression, value1, result1, [default or value2, result2],…[default or value3, result3])
示例:
=SWITCH(A1,0,"FALSE",-1,"TRUE","Maybe")
微软官方支持页面提供了关于Switch函数的文档,但是现在已经更新为只记录Excel 2019的行为。为了查看2016年版本的页面,可以使用Wayback Machine工具。
从最受欢迎的回答来看,创建映射似乎不是问题的最合适答案。但这个方法是合适的。
终于有了!这也解决了我之前回答中的缺点,即条件不会短路 - 对于Excel来说通常不是问题,但它应该比现在更重要!
看起来微软将该功能从Excel 2016中删除了。现在它只在Excel 2019和Office 365中可用。
我讨厌对微软进行严厉批评,但是 - 永远不要相信微软关于当前版本的任何陈述都适用于以前的版本...
问题的出现原因:文章中提到了一个“VLOOKUP”函数,它被用来处理32到1420类型的映射。作者称这个函数是一个很棒的解决方案,并且表示自己已经开始“宗教般地”使用它。可以推断出,作者之前遇到了处理这种类型映射的问题,而VLOOKUP函数帮助解决了这个问题。
解决方法:根据文章中的描述,可以得知解决方法是使用Excel中的VLOOKUP函数。该函数可以在某些列中设置32到1420的映射关系,并使用VLOOKUP函数进行查找。具体的实现方法没有提及,但可以推测出可以使用VLOOKUP函数的参数设置来完成这个映射过程。
文章整理如下:
在这个问题中,作者提到了一个名为“VLOOKUP”的函数,这个函数似乎很适合解决问题。可以在某些列中设置32到1420的映射关系,然后使用VLOOKUP函数进行查找。作者表示已经开始“宗教般地”使用这个函数,并将其称为一个很棒的解决方案。尽管具体的实现方法没有提及,但可以推测出可以通过VLOOKUP函数的参数设置来完成这个映射过程。
在没有提及原始问题的情况下(我怀疑问题早已解决),最近我发现了一个很好的技巧,它使Choose函数与一个select case
语句完全相同,而无需修改数据。唯一的问题是:在任何时候只能有一个Choose条件为真。
语法如下:
CHOOSE( (1 * (CONDITION_1)) + (2 * (CONDITION_2)) + ... + (N * (CONDITION_N)), RESULT_1, RESULT_2, ... , RESULT_N )
假设条件1到N只有一个为真,其他所有条件都为0,这意味着数值将对应于相应的结果。
如果您不能百分之百确定所有条件是互斥的,您可能更喜欢这样的写法:
CHOOSE(
(1 * TEST1) + (2 * TEST2) + (4 * TEST3) + (8 * TEST4) ... (2^N * TESTN)
OUT1, OUT2, , OUT3, , , , OUT4 , , <LOTS OF COMMAS> , OUT5
)
话虽如此,如果Excel对函数能接受的参数数量有上限,您会很快达到上限。
老实说,我简直不敢相信我花了几年时间才明白这个问题,但我以前没见过,所以我想把它留在这里帮助其他人。
编辑:根据下面的评论:
通过使用以下形式的公式,可以消除大量逗号(因此,选择语句可以适用于多达254个情况):
CHOOSE( 1 + LOG(1 + (2*TEST1) + (4*TEST2) + (8*TEST3) + (16*TEST4),2), OTHERWISE, RESULT1, RESULT2, RESULT3, RESULT4 )
请注意LOG
子句的第二个参数,它将其转换为2进制并使整个过程起作用。
编辑:根据David的回答,如果你很幸运地在Office 2016上工作,现在有一个实际的switch语句了。除了阅读困难之外,这还意味着您不仅可以获得switch的效率,还可以获得switch的行为!
我能解释一下CASE OTHERWISE能够在这里出现的原因吗?这里我们处理当没有测试为真时的情况:choose(1+log(2*Test1+4*Test2,2),OtherwiseResult,Result1,Result2)
很好的发现 - 我以前没有想过这个!
编辑后的公式不起作用。我必须将其更改为CHOOSE(LOG( (2*TEST1) + (4*TEST2) + (8*TEST3), 2), RESULT1, RESULT2, RESULT3) 这样对吗? LOG(8*TEST3,2) = LOG(8, 2) = 3 代表第三个位置?另外,我认为“Otherwise”样式选项的括号不对 - 评论中彼得的括号不同。
对不起,丹尼尔,我的“OTHERWISE”逻辑错了。它应该是:choose(1+log(1+2*Test1+4*Test2+8*Test3+16*Test4+32*Test5,2),"Otherwise","Result1","Result2","Result3","Result4","Result5")。这次括号应该是对的。
上面的答案已根据此进行了更新 - 很好地发现 :)。还应该澄清如果多个测试被通过时会发生什么。想象一下,测试3和测试4是有效的。您会得到LOG(8 + 16,2) = 4.5...
,然后CHOOSE
将其视为4
,即使您可能认为它可能会四舍五入。可以通过CHOOSE(1+LOG(8+16,2),1,2,3,4,5,6)
轻松验证。只有当总数超过下一个索引时,才会选择下一个索引。
谢谢你的详细解释。它有效!还有一个问题 - 如果有2个结果与条件匹配怎么办?当前会报错。我们能够包含检查,以确保选择第一个匹配的条件吗?