访问功能以将多个条件与多个输出匹配(或Excel)

时间:2017-04-21 11:31:41

标签: excel function ms-access

我想知道是否有一个简单的功能可以将某些标准与各种输出相匹配。很难描述,但我想要的是:

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

例如:

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

我知道我可以使用If语句,但它看起来非常复杂,希望它有一个简单的功能,但很难搜索复杂的标准。

理想情况下,这适用于Access,但在 Excel 中也非常有用。

3 个答案:

答案 0 :(得分:1)

假设您不太关心我的第一次提供,这是一种不同的方法:

在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>))

答案 1 :(得分:0)

“精确匹配”的原始答案

在Excel中,实现此目的的自然方法是使用VLOOKUP函数。在Access中,您将加入表格。在这两种情况下,您都希望表或范围存储翻译:

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

在Excel中

=VLOOKUP( arg1, arg2, arg3, arg4)

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

arg2 :保存查找表的范围

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

arg4 :匹配类型。你想找到一个完全匹配,所以在这里指定FALSE(或零)

在Access

在数据库中创建一个名为Sites的新表,并添加相关详细信息。现在,在查询窗口中,引入包含要查找的值的源表和新的Site表。单击并将主表“SiteID”拖动到新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  |
+--------+------------------------------+

第一栏中的数字旨在作为阈值,当员工工资达到阈值时,他们可以获得相关的福利。此列中的第一个表必须按“升序”排序。

现在使用VLOOKUP,但参数4:

arg4 :匹配类型。这不是一个完全匹配(不知道该怎么称呼它),所以在这里指定TRUE(或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   |
+--------+------------------------------+------------+

现在不要加入这两个表,只需在查询窗口中单独“浮动”它们。这会产生所谓的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")条件。