访问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
语句,这些语句允许更接近您真正想要的东西。 我认为,对嵌套的IF
或IIF
陈述的真正投诉是他们阅读和维护的难度。 但是,您可以使用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")
。