在同一列中找到两个不同字符串的最早日期

时间:2016-01-25 14:04:02

标签: excel excel-formula

我有一列包含工单状态的数据,另一列表示工作单计划完成的日期。我需要找出工作订单的最早日期,其状态为“WCON'或者确认'

我使用这个公式

=SMALL(IF(OR('Raw PM Data'!$E$2:$E$999="WCON")*('Raw PM Data'!$E$2:$E$999="ACK"),'Raw PM Data'!$L$2:$L$999),1)

列E具有状态,列L具有日期。

如果数据集同时具有ACK和WCON条目,则它可以正常工作,但是如果数据集没有“确认”,则公式会中断并且“#NUM;#NUM;据报道。

有人可以指出我正确的方向来解决问题

由于

加里

3 个答案:

答案 0 :(得分:1)

尝试使用+而不是OR。数组公式不喜欢ORAND限定符:

=SMALL(IF(('Raw PM Data'!$E$2:$E$999="WCON")+('Raw PM Data'!$E$2:$E$999="ACK"),'Raw PM Data'!$L$2:$L$999),1)

这是一个数组公式,必须使用Ctrl-Shift-Enter确认。

这适用于任何具有“WCON”或“ACK”的行都将返回true; >那些行将用于查找最小的行。一个将为零,另一个为1.因此将它们加在一起得到1.如果它们都不会返回0.

由于你找到了第一个最小的,你也可以使用MIN:

=MIN(IF(('Raw PM Data'!$E$2:$E$999="WCON")+('Raw PM Data'!$E$2:$E$999="ACK"),'Raw PM Data'!$L$2:$L$999))

在需要*限定符时使用AND或多个IF语句。

只是为了证明它有效:

enter image description here

答案 1 :(得分:1)

我建议按照以下方式实施。添加了具有最大可能日期的新列(例如:31/12/9999中指定的F2

然后我使用了公式M2=IF(OR(E2="WCON",E2="ACK"),L2,$F$2),然后将此公式拖到M999即。M999=IF(OR(E999="WCON",E999="ACK"),L999,$F$2)。然后我使用公式=SMALL(M2:M999,1)来获得最小值。

Formula in M

Formula in O2

Scott Answer - 这个答案是对的。按ctrl+shift+enter

编辑:删除了有关Scott回答的截图。他的回答是正确的。

答案 2 :(得分:1)

我没有在单元格中编写复杂的公式,而是使用visual basic创建了一个公共函数,它可以用作个性化的工作表函数。

首先按“alt-F11”打开VB编辑器,这会打开一个这样的窗口:

VB editor

在此窗口中,您必须通过单击“插入”和“模块”添加模块,这将导致空代码模块,在那里您可以通过以下代码:

Option Explicit

Public Function SMALLIF(Criteria1 As Variant, Criteria2 As Variant, CriteriaRange As Range, DataRange As Range) As Variant
    Dim i As Long
    Dim arrDat() As Variant
    Dim arrRes() As Variant
    ReDim arrRes(0)
    arrDat = Union(CriteriaRange, DataRange)

    For i = LBound(arrDat, 1) To UBound(arrDat, 1)
        If arrDat(i, 1) = Criteria1 Or arrDat(i, 1) = Criteria2 Then
            If UBound(arrRes) = 0 Then
                ReDim arrRes(1 To 1)
                arrRes(1) = arrDat(i, 2)
            Else
                ReDim Preserve arrRes(1 To UBound(arrRes) + 1)
                arrRes(UBound(arrRes)) = arrDat(i, 2)
            End If
        End If
    Next i

    SMALLIF = arrRes(1)
    For i = LBound(arrRes) To UBound(arrRes)
        If arrRes(i) < SMALLIF Then
            SMALLIF = arrRes(i)
        End If
    Next i

End Function

所以看起来应该是这样的:

VB editor with code

现在您可以关闭VB编辑器,然后在单元格中编写以下内容:

=SMALLIF("WCON"; "ACK"; 'Raw PM Data'!$E$2:$E$999; 'Raw PM Data'!$L$2:$L$999)

现在应该返回状态为WCON和ACK的工单的最早日期。

(请记住,当我使用,参数分隔符时,您的Excel可能会使用;作为参数分隔符