案例函数在Excel中等效

时间:2011-03-30 15:45:43

标签: excel worksheet-function

我有一个有趣的挑战 - 我需要在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()语句链接在一起会有点疯狂,在我决定这是一个坏主意(我的生活故事)之前,我做了大约四次。

12 个答案:

答案 0 :(得分:56)

听起来像是VLOOKUP的工作!

你可以把你的32 - >在某处的几列中有1420种类型映射,然后使用VLOOKUP函数执行查找。

答案 1 :(得分:21)

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

语法如下:

CHOOSE( 
    (1 * (CONDITION_1)) + (2 * (CONDITION_2)) + ... + (N * (CONDITION_N)),
    RESULT_1, RESULT_2, ... , RESULT_N
)

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

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

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

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

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

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

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

注意LOG子句的第二个参数,它将它放在基数2中并使整个过程发挥作用。

编辑:每David's answer,如果您有幸在2016年办公室工作,现在有一个实际的开关声明。除了阅读困难之外,这也意味着您可以获得切换效率,而不仅仅是行为!

答案 2 :(得分:14)

现在,Excel 2016 / Office 365中可以使用Switch功能

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

example:
=SWITCH(A1,0,"FALSE",-1,"TRUE","Maybe")

Microsoft -Office Support

答案 3 :(得分:8)

试试这个;

=IF(B1>=0, B1, OFFSET($X$1, MATCH(B1, $X:$X, Z) - 1, Y)

在哪里 X =您要编入索引的列 Y =索引列左侧(-Y)或右侧(Y)的列数,以获取您要查找的值
Z = 0如果完全匹配(如果你想处理错误)

答案 4 :(得分:2)

我使用此解决方案将单个字母颜色代码转换为其描述:

=CHOOSE(FIND(H5,"GYR"),"Good","OK","Bad")

您基本上会查找您在阵列中尝试解码的元素,然后使用CHOOSE()来选择相关项目。它比为VLOOKUP()构建表格更紧凑。

答案 5 :(得分:1)

我知道回答有点迟,但我认为这段简短的视频会对你有所帮助。

http://www.xlninja.com/2012/07/25/excel-choose-function-explained/

基本上它是使用选择功能。他在视频中解释得非常好,所以我会这样做,而不是打20页。

他的另一个视频解释了如何使用数据验证来填充您可以从有限范围内选择的下拉列表。

http://www.xlninja.com/2012/08/13/excel-data-validation-using-dependent-lists/

您可以将两者合并,并使用下拉列表中的值作为choose函数的索引。虽然他没有展示如何将它们结合起来,但我相信你可以把它弄清楚,因为他的视频很好。如果您遇到麻烦,请告诉我,我会更新我的回答给您看。

答案 6 :(得分:1)

我知道这是对旧帖子的回应

我喜欢结合Index()/ Match()的If()函数:

=IF(B2>0,"x",INDEX($H$2:$I$9,MATCH(A2,$H$2:$H$9,0),2))

if函数比较b列中的内容,如果它大于0,则返回x,如果不是,则使用由Index()函数标识并由Match()选择返回的数组(信息表) a对应的值。

索引数组的绝对位置设置为$H$2:$I$9(美元符号),因此它指向的位置不会随着公式的复制而改变。具有您想要返回的值的行由Match()函数标识。 Match()具有不需要排序列表来查看Vlookup()所需的附加值。 Match()可以找到一个值:1小于,0精确,-1大于。我在绝对Match()数组$H$2:$H$9之后放入零以找到完全匹配。对于列,输入要返回的Index()数组的值。我输入了2,因为在我的数组中,返回值在第二列中。我的索引数组下面看起来像这样:

32   1420

36   1650

40   1790

44   1860

55   2010

你&#39; a&#39;中的值列表中要搜索的列位于我的示例的第一列中,要返回的相应值位于右侧。查找/引用表可以位于工作簿中的任何选项卡上 - 甚至可以位于另一个文件中。 -Book2是文件名,Sheet2是&#39;其他选项卡&#39;名。

=IF(B2>0,"x",INDEX([Book2]Sheet2!$A$1:$B$8,MATCH(A2,[Book2]Sheet2!$A$1:$A$8,0),2))

如果你不希望当b的值大于零时返回x,则删除x为空白&#39; / null等效或者可以放0 - 不确定你想要什么。< / p>

下面是删除x的函数的开头。

=IF(B2>0,"",INDEX...

答案 7 :(得分:1)

如果您的Excel版本(Excel-2016之前的版本)中没有SWITCH语句,则可以使用以下VBA实现:

Public Function SWITCH(ParamArray args() As Variant) As Variant
    Dim i As Integer
    Dim val As Variant
    Dim tmp As Variant

    If ((UBound(args) - LBound(args)) = 0) Or (((UBound(args) - LBound(args)) Mod 2 = 0)) Then
        Error 450       'Invalid arguments
    Else
        val = args(LBound(args))
        i = LBound(args) + 1
        tmp = args(UBound(args))

        While (i < UBound(args))
            If val = args(i) Then
                tmp = args(i + 1)
            End If
            i = i + 2
        Wend
    End If

    SWITCH = tmp
End Function

它的工作原理与预期的完全一样,可以直接替换Google Spreadsheet的SWITCH函数。

语法:

=SWITCH(selector; [keyN; valueN;] ...  defaultvalue)

其中

  • 选择器是与键进行比较的任何表达式
  • key1,key2,...是与选择器进行比较的表达式
  • value1,value2,...是选择器等于相应键(仅)时选择的值
  • 如果没有键与选择器匹配,则使用默认值

示例:

=SWITCH("a";"?")                       returns "?"
=SWITCH("a";"a";"1";"?")               returns "1"
=SWITCH("x";"a";"1";"?")               returns "?"
=SWITCH("b";"a";"1";"b";TRUE;"?")      returns TRUE
=SWITCH(7;7;1;7;2;0)                   returns 2
=SWITCH("a";"a";"1")                   returns #VALUE!

要使用它,请打开Excel,转到“开发工具”选项卡,单击“ Visual Basic”,右键单击“ ThisWorkbook”,选择“插入”,然后选择“模块”,最后将代码复制到编辑器中。您必须另存为宏友好的Excel工作簿(xlsm)。

答案 8 :(得分:0)

即使年纪大了,这似乎也是一个很受欢迎的问题,所以我会发布另一个解决方案,我认为这个解决方案非常优雅:

http://fiveminutelessons.com/learn-microsoft-excel/using-multiple-if-statements-excel

它很优雅,因为它只使用IF功能。基本上,它归结为:

if( condition 选择/使用表中的值,if( condition 选择/使用其他值来自表 ...

等等

工作得很漂亮,甚至比HLOOKUP或VLOOOKUP更好

但是......请注意 - excel可以处理的嵌套if语句数量有限制。

答案 9 :(得分:0)

Microsoft仅将CHOOSE功能替换为SWITCH,IFS和IFVALUES。

=CHOOSE($L$1,"index_1","Index_2","Index_3")

答案 10 :(得分:0)

如果您使用的是Office 2019或Office 365,则有一个新功能类似于名为 IFS 的CASE功能。这是Microsoft文档中对该功能的描述:

  

IFS函数检查是否满足一个或多个条件,并返回与第一个TRUE条件相对应的值。 IFS可以代替多个嵌套的IF语句,并且在多个条件下更易于阅读。

用法示例如下:

=IFS(A2>89,"A",A2>79,"B",A2>69,"C",A2>59,"D",TRUE,"F")

您甚至可以指定默认结果:

  

要指定默认结果,请为最终的logical_test参数输入TRUE。如果不满足其他条件,则将返回相应的值。

默认结果功能包括在上面的示例中。

您可以在Microsoft's Support Documentation

上了解更多信息

答案 11 :(得分:0)

最近很不幸,我不得不再次使用Excel 2010一段时间,而我却错过了很多SWITCH功能。我想出以下方法来尽量减少痛苦:

=CHOOSE(SUM((A1={"a";"b";"c"})*ROW(INDIRECT(1&":"&3))),1,2,3)
CTRL+SHIFT+ENTER

A1是您的条件所在的位置(可以是公式,无论如何)。好处是,我们只需要提供一次条件(就像SWITCH一样),然后排序条件(在此示例中:a,b,c)和结果(在此示例中:1,2,3),这使得很容易推理。

这是它的工作方式:

  • Cond = {“ c1”;“ c2”; ...;“ cn”}返回TRUE或FALSE的N向量(行为类似于1s和0s)
  • ROW(INDIRECT(1&“:”&n))返回有序数字的N向量:1; 2; 3; ...; n
  • 两个向量的相乘将返回大量零和匹配条件的数字(位置)
  • SUM只是将带有零位和位置的向量转换为一个数字,然后可供选择使用
  • 如果要添加其他条件,请记住要增加INDIRECT中的最后一个数字
  • 如果要使用ELSE情况,只需将其包装在IFERROR公式中
  • 如果您多次提供相同的条件,则该公式将无法正常运行,但我想没人会愿意这样做