案例函数在Excel中等效

Nic*_*Nic 49 excel worksheet-function

我有一个有趣的挑战 - 我需要在Excel中检查以下数据:

|   A  -   B  -   C  -  D   |
|------|------|------|------|
|  36  |   0  |   0  |   x  |
|   0  |  600 |  700 |   x  |
|___________________________|
Run Code Online (Sandbox Code Playgroud)

你必须原谅我糟糕的ASCII艺术.所以我需要D列(x)对相邻的单元格进行检查,然后在必要时转换值.这是标准:

如果B栏大于0,一切都很好,我可以喝咖啡.如果它不符合该要求,那么我需要根据表格转换A1 - 例如,32 = 1420并放入D.不幸的是,A和它需要转换的内容之间没有任何关系,因此创建计算是不可能的.

在这种情况下,case或switch语句是完美的,但我不认为它是Excel中的本机函数.我也认为把一堆=IF()陈述连在一起会有点疯狂,在做出决定这是一个坏主意(我的生活故事)之前,我做了大约四次.

Blo*_*ard 57

听起来像VLOOKUP的工作!

您可以将32 - > 1420类型映射放在某个位置的几列中,然后使用VLOOKUP函数执行查找.

  • 只是想更新,让你知道我现在使用这个宗教.再次感谢,这是一个很棒的解决方案. (4认同)

tob*_*and 21

在没有参考原始问题的情况下(我怀疑它早已解决),我最近发现了一个巧妙的技巧,使得Choose函数的工作方式与select case语句完全相同,而无需修改数据.只有一个问题:在任何时候,只有一个选择条件可以为真.

语法如下:

CHOOSE( 
    (1 * (CONDITION_1)) + (2 * (CONDITION_2)) + ... + (N * (CONDITION_N)),
    RESULT_1, RESULT_2, ... , RESULT_N
)
Run Code Online (Sandbox Code Playgroud)

假设条件1到N中只有一个为真,其他一切都为0,这意味着数值将对应于适当的结果.

如果您不是100%确定所有条件都是互斥的,您可能更喜欢以下内容:

CHOOSE(
    (1 * TEST1) + (2 * TEST2) + (4 * TEST3) + (8 * TEST4) ... (2^N * TESTN)
    OUT1, OUT2, , OUT3, , , , OUT4 , , <LOTS OF COMMAS> , OUT5
)
Run Code Online (Sandbox Code Playgroud)

也就是说,如果Excel对函数可以采用的参数数量有一个上限,那么你很快就会遇到它.

老实说,不敢相信我需要花费数年的时间来解决这个问题,但我之前没有见过它,所以我想把它留在这里帮助别人.

编辑:以下来自@aTrusty的评论:通过使用以下形式的公式,可以消除愚蠢的逗号数量(因此,选择语句最多可用于254个案例):

CHOOSE(
    1 + LOG(1 + (2*TEST1) + (4*TEST2) + (8*TEST3) + (16*TEST4),2), 
    OTHERWISE, RESULT1, RESULT2, RESULT3, RESULT4
)
Run Code Online (Sandbox Code Playgroud)

注意该LOG子句的第二个参数,它将它放在基数2中并使整个事情起作用.

编辑:根据大卫的回答,现在有一个实际的转换声明,如果你有幸在2016年的办公室工作.除了阅读困难,这也意味着你获得切换效率,而不仅仅是行为!

  • 编辑的公式不起作用.我不得不把它改成CHOOSE(LOG((2*TEST1)+(4*TEST2)+(8*TEST3),2),RESULT1,RESULT2,RESULT3)是正确的吗?LOG(8*TEST3,2)= LOG(8,2)= 3表示第3位置?或者,我认为括号对于"其他"样式选项是错误的 - 评论中的彼得括号是不同的. (2认同)

dav*_*vid 14

Switch功能现已在Excel 2016/Office 365中提供

SWITCH(表达式,value1,result1,[default或value2,result2],... [default或value3,result3])

example:
=SWITCH(A1,0,"FALSE",-1,"TRUE","Maybe")
Run Code Online (Sandbox Code Playgroud)

微软 - 办公室支持


BKi*_*mel 8

试试这个;

=IF(B1>=0, B1, OFFSET($X$1, MATCH(B1, $X:$X, Z) - 1, Y)
Run Code Online (Sandbox Code Playgroud)

WHERE
X =您要索引到的列
Y = 索引列的左侧(-Y)或右侧(Y)的列数,以获取您要查找的值
Z = 0如果完全匹配(如果需要)处理错误)

  • 是否缺少`)`? (3认同)