【问题标题】:How to index match a condition set in a cell如何索引匹配单元格中设置的条件
【发布时间】:2019-12-09 09:12:24
【问题描述】:

我试图通过索引匹配表来避免使用多个 if 公式,但是我需要匹配的是实际条件和字符串。

查找表:

+---+------------------+-------------------+-------+
|   |        A         |         B         |   C   |
+---+------------------+-------------------+-------+
| 1 | Current to Prior | Portfolio Comment | Error |
| 2 | =0               | ""                | 1     |
| 3 | <>0              | ""                | -1    |
| 4 | >0               | OK – Losses       | 0     |
| 5 | <0               | OK – Losses       | 1     |
| 6 | <0               | OK – New Sales    | 0     |
| 7 | >0               | OK – New Sales    | 1     |
+---+------------------+-------------------+-------+
  • A 列:查找条件
  • B 列:查找字符串
  • C 列:返回值

具有正确硬编码输出的数据示例(C 列):

+---+------------------+-------------------+-------+
|   |        A         |         B         |   C   |
+---+------------------+-------------------+-------+
| 1 | Current to Prior | Portfolio comment | Error |
| 2 | 0                |                   | 1     |
| 3 | -100             | OK – Losses       | 1     |
| 4 | 50               |                   | -1    |
| 5 | 200              | OK – Losses       | 0     |
| 6 | 0                |                   | 1     |
| 7 | -400             | OK – New Sales    | 0     |
| 8 | 0                |                   | 1     |
+---+------------------+-------------------+-------+
  • A 列:数据值
  • B 列:数据字符串
  • C 列:输出公式

我需要一个公式,将数据值与查找条件匹配,将数据字符串与查找字符串匹配并输出返回值。

【问题讨论】:

    标签: if-statement excel-formula match lookup-tables


    【解决方案1】:

    我知道您不一定要求 VBA 解决方案,但我自己(和许多其他人)更喜欢使用 UDF,因为在我看来,它使阅读公式更容易和更清晰 - 而且您可以不使用辅助单元格。

    我们通过创建 Select Case 语句来启动您的 UDF。对于案例,我们可以选择使用数值或字符串。我决定使用字符串。

    在每种情况下,您将比较提供给lngCondition 参数的数值,该参数最终会将值返回给函数。

    由于您没有任何情况下文本值可能具有lngCondition = 0,因此我让它返回工作表错误代码#VALUE,就像您对任何其他 Excel 公式所期望的那样。这就是 UDF 具有变体返回类型的原因。

    Public Function ReturnErrorCode(lngCondition As Long, strComment As String) As Variant
    
        Select Case strComment
        Case ""
            If lngCondition = 0 Then
                ReturnErrorCode = 1
            Else
                ReturnErrorCode = -1
            End If
    
        Case "OK - Losses"
            If lngCondition > 0 Then
                ReturnErrorCode = 0
            ElseIf lngCondition < 0 Then
                ReturnErrorCode = 1
            Else
                ' Your conditions don't specify that 'OK - Losses'
                '     can have a 0 value
                ReturnErrorCode = CVErr(xlErrValue)
            End If
    
        Case "OK - New Sales"
            If lngCondition < 0 Then
                ReturnErrorCode = 0
            ElseIf lngCondition > 0 Then
                ReturnErrorCode = 1
            Else
                ' Your conditions don't specify that 'OK - New Sales'
                '     can have a 0 value
                ReturnErrorCode = CVErr(xlErrValue)
            End If
    
        Case Else
            ReturnErrorCode = CVErr(xlErrValue)
    
        End Select
    
    End Function
    

    然后您将在工作表中使用此公式:

    =ReturnErrorCode(A1, B1)
    


    太棒了!但是我对VBA一无所知,也不知道如何添加UDF。

    • 首先,您需要打开 VBA 编辑器。您可以通过同时按 Alt + F11 来执行此操作。
    • 接下来,您需要创建一个标准代码模块。在 VBE 中,点击 Insert,然后选择 Module (不是 Class 模块!)
    • 然后复制上面的代码,并将其粘贴到刚刚创建的新代码模块中。
    • 由于您现在已将 VBA 代码添加到工作簿中,因此您现在需要在下次保存时将其另存为启用宏的工作簿

    【讨论】:

    • 很有帮助,完美解决了我的问题。出于好奇,是否可以通过excel定义的公式来做到这一点?
    • 可以通过普通的工作表公式来完成吗? 绝对可以,但这不符合我的要求。我非常精通 VBA,但对工作表公式不太了解。不过,这里有很多人可以使用 Excel 公式发挥作用
    • 如果您仍然需要这种类型的解决方案,我建议您取消将我的答案标记为您接受的答案。这让其他人知道您仍在寻找替代解决方案。你不会伤害我的感情 :-)
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多