我想知道是否有一个简单的功能可以将某些标准与各种输出相匹配。很难描述,但我想要的是:
=function([criteria],[output],[criteria],[output],......)
例如:
=function([SiteID]=1,"Global",[SiteID]=2,"IT",[SiteID]=3,"DE",[SiteID]=4,"NL",[SiteID]=5,"AU")
我知道我可以使用If
语句,但它看起来非常复杂,希望它有一个简单的功能,但很难搜索复杂的标准。
理想情况下,这适用于Access,但在 Excel 中也非常有用。
答案 0 :(得分:1)
假设您不太关心我的第一次提供,这是一种不同的方法:
在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>))
答案 1 :(得分:0)
在Excel中,实现此目的的自然方法是使用VLOOKUP
函数。在Access中,您将加入表格。在这两种情况下,您都希望表或范围存储翻译:
+--------+----------+
| SiteID | SiteName |
+--------+----------+
| 1 | Global |
| 2 | IT |
| 3 | DE |
| 4 | NL |
| 5 | AU |
+--------+----------+
=VLOOKUP( arg1, arg2, arg3, arg4)
arg1 :包含您要翻译的值的单元格
arg2 :保存查找表的范围
arg3 :您希望从查找表返回的列号。在这种情况下2。
arg4 :匹配类型。你想找到一个完全匹配,所以在这里指定FALSE(或零)
在数据库中创建一个名为Sites的新表,并添加相关详细信息。现在,在查询窗口中,引入包含要查找的值的源表和新的Site表。单击并将主表“SiteID”拖动到新Site表上的匹配字段。您现在可以将列SiteName
添加到查询中。
在Excel中,您仍然可以使用VLOOKUP
。在这里,我想象一个这样的表:
+--------+------------------------------+
| Salary | CompanyCar |
+--------+------------------------------+
| 0 | No company car |
| 20000 | Access to shared company car |
| 50000 | Own company car - basic |
| 100000 | Own company car - executive |
+--------+------------------------------+
第一栏中的数字旨在作为阈值,当员工工资达到阈值时,他们可以获得相关的福利。此列中的第一个表必须按“升序”排序。
现在使用VLOOKUP
,但参数4:
arg4 :匹配类型。这不是一个完全匹配(不知道该怎么称呼它),所以在这里指定TRUE(或1)
在表格中添加一个额外的列:
+--------+------------------------------+------------+
| 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 |
+--------+------------------------------+------------+
现在不要加入这两个表,只需在查询窗口中单独“浮动”它们。这会产生所谓的CROSS JOIN
。我们需要使用WHERE
子句将匹配限制为仅相关的行。
在标准的网格中添加Salary和UpperBound。以下所有标准:
+---------------------+-------------------------------+
| Salary | UpperBound |
+---------------------+-------------------------------+
| <= [EmployeeSalary] | > [EmployeeSalary] or is null |
+---------------------+-------------------------------+
在SQL视图中,这相当于:
WHERE
Salary <=[EmployeeSalary] and
(UpperBound > [EmployeeSalary] or UpperBound is null)
答案 2 :(得分:0)
我偶然发现了一个更好的答案。自从我停止使用MS Access以来,他们引入了一种新的内置功能。它的工作方式几乎与我在本答案的原始版本中创建的一样。它被称为SWTICH
仅限访问(*)。它的工作原理如下:
Switch ( <condition1>, <output1> [,<condition2>, <output2> ... ] )
如果未满足条件,则返回NULL
。如果您想要默认值(例如ELSE
),只需设置最后一个条件/输出对TRUE, <default output>
。
在撰写本文时,此功能的Microsoft支持页面为here。
(*)Excel确实有一个名为SWITCH
的函数,但它还有其他功能。
我的原始答案 - 仍然与Excel相关
通常情况下,我会更新我以前的答案,但在这种情况下,我的答案彼此差异很大,这看起来不合适。
无论如何,不想被这个问题打败,我决定尝试编写自己的VBA函数来完全按照你的要求去做。我不会说它很完美,但它对我很有用。将以下内容粘贴到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中试用之后,我添加了一些错误处理(参见上面的注释)并将它们包含在这里的编辑中。
如果没有满足任何条件,则输出False
。您可以在代码中或在使用函数时通过创建最终条件/输出对Else
来实现...,TRUE,"Default Here")
条件。