访问function将多个标准匹配到多个输出(或Excel)

我想知道是否有一个简单的function,将能够匹配一定的标准,以各种产出。 很难形容,但我想要的是这样的:

=function([criteria],[output],[criteria],[output],......) 

举个例子:

 =function([SiteID]=1,"Global",[SiteID]=2,"IT",[SiteID]=3,"DE",[SiteID]=4,"NL",[SiteID]=5,"AU") 

我知道我可以使用If语句,但它使它看起来很复杂,希望有一个简单的函数,但很难search复杂的标准。

这最好是Access,但在Excel中也是非常有用的。

假设你不太关心我的第一个产品,这里有一个不同的方法:

在SQL的完整实现中,您可以访问CASE语句,这些语句允许更接近您真正想要的东西。 我认为,对嵌套的IFIIF陈述的真正投诉是他们阅读和维护的难度。 但是,您可以使用IF以一种非常规的方式,您可能会发现更容易阅读,例如

 =If(<condition1>,"Output 1","") & If(<condition2>,"Output 2","") & If(<condition3>,"Output 3","") 

但是,如果满足多个条件,您将获得在同一个单元格/字段中返回的所有输出,使用嵌套的IF方法,您只会得到符合最早条件的输出。 一个方法可以得到(可能会更好)是使所有的输出标准的长度(填充他们的空间),然后包装整个东西像

 =TRIM(LEFT(TRIM(<output from concatenated ifs as above>),<standardised length>)) 

“精确”匹配的原始答案

在Excel中,实现这一点的自然方法是使用VLOOKUP函数。 在Access中,您将join到表格中。 在这两种情况下,您都需要一个表格或范围来存储翻译:

 +--------+----------+ | SiteID | SiteName | +--------+----------+ | 1 | Global | | 2 | IT | | 3 | DE | | 4 | NL | | 5 | AU | +--------+----------+ 

在Excel中

 =VLOOKUP( arg1, arg2, arg3, arg4) 

arg1 :包含您希望翻译的值的单元格

arg2 :保存查找表的范围

arg3 :您希望从查找表中返回的列号。 在这种情况下2。

arg4 :匹配types。 你想在这里find一个精确的匹配(或者是零)

在Access中

在数据库中创build一个名为Sites的新表,并添加相关的详细信息。 现在在你的查询窗口中,引入包含要查找的值的源表和新的Site表。 单击并将主表中的“SiteID”字段拖到新Site Site表上的匹配字段中。 您现在可以将列SiteName添加到您的查询。

编辑:间隔比赛,而不是完全匹配

在Excel中

在Excel中,您仍然可以使用VLOOKUP 。 在这里,我在想像这样一张桌子:

 +--------+------------------------------+ | Salary | CompanyCar | +--------+------------------------------+ | 0 | No company car | | 20000 | Access to shared company car | | 50000 | Own company car - basic | | 100000 | Own company car - executive | +--------+------------------------------+ 

第一列中的数字是为了作为门槛,当员工工资达到门槛时,他们可以获得相关的利益。 此列中的第一个表格必须按“升序”sorting。

现在使用VLOOKUP作为上面的参数4:

arg4 :匹配types。 这不是一个确切的匹配(不知道该怎么称呼它),所以在这里指定真(或1)

在Access中

在表中添加一个额外的列:

 +--------+------------------------------+------------+ | Salary | CompanyCar | UpperBound | +--------+------------------------------+------------+ | 0 | No company car | 20000 | | 20000 | Access to shared company car | 50000 | | 50000 | Own company car | 100000 | | 100000 | Executive level company car | NULL | +--------+------------------------------+------------+ 

现在不用连接两个表格,只需在查询窗口中分别“浮动”即可。 这创build了所谓的CROSS JOIN 。 我们需要使用WHERE子句将匹配限制为相关的行。

在标准的网格中添加Salary和UpperBound。 所有以下标准:

 +---------------------+-------------------------------+ | Salary | UpperBound | +---------------------+-------------------------------+ | <= [EmployeeSalary] | > [EmployeeSalary] or is null | +---------------------+-------------------------------+ 

在SQL视图中,这相当于:

 WHERE Salary <=[EmployeeSalary] and (UpperBound > [EmployeeSalary] or UpperBound is null) 

我只是偶然find了一个更好的答案。 自从我停止使用MS Access以来,他们引入了一个新的内置函数。 它的工作原理几乎和我在这个答案的原始版本中创build的完全一样。 它仅被称为SWTICH访问(*)。 它是这样工作的:

 Switch ( <condition1>, <output1> [,<condition2>, <output2> ... ] ) 

如果没有条件满足,它将返回NULL 。 如果你想要一个默认的(比如ELSE ),只需要设置最后的条件/输出对TRUE, <default output>

在写这篇文章的时候,这个function的微软支持页面就在这里 。

(*)Excel确实有一个名为SWITCH的function,但它还有其他的function。

我的原始答案 – Excel仍然相关

通常我会更新我以前的答案,但在这种情况下,我的答案彼此非常不同,使得这看起来不合适。

无论如何,不​​想被这个问题打败,我决定我会尝试编写自己的VBA函数来完成你所要求的function。 我不会说这是完美的,但它对我来说很好。 将以下内容粘贴到VBA模块中:

 Function MULTI_IF(ParamArray Inputs()) As Variant Dim Output As Variant Output = False 'This is the output when no conditions are met For x = 0 To UBound(Inputs) - 1 Step 2 On Error GoTo ErrorStep '<-- Added to prevent errors being thown for NULLs and other bad input If CBool(Inputs(x)) = True Then Output = Inputs(x + 1) Exit For End If Next x MULTI_IF = Output Exit Function ErrorStep: Inputs(x) = False '<-- Assume condition is false where it can't be converted to Boolean Resume End Function 

你应该能够完全按照你所描述的从Excel中使用它。 在Access中进行试用之后,我添加了一些error handling(请参阅上面的注释),并将它们包含在此处的编辑中。

如果没有条件满足,它将输出False 。 你可以在代码中改变它,或者当你使用函数实现一个Else条件,通过使最终条件/输出对...,TRUE,"Default Here")