我有一列包含工单状态的数据,另一列表示工作单计划完成的日期。我需要找出工作订单的最早日期,其状态为“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;据报道。
有人可以指出我正确的方向来解决问题
由于
加里
答案 0 :(得分:1)
尝试使用+而不是OR
。数组公式不喜欢OR
或AND
限定符:
=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语句。
只是为了证明它有效:
答案 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)
来获得最小值。
Scott Answer - 这个答案是对的。按ctrl+shift+enter
。
编辑:删除了有关Scott回答的截图。他的回答是正确的。
答案 2 :(得分:1)
我没有在单元格中编写复杂的公式,而是使用visual basic创建了一个公共函数,它可以用作个性化的工作表函数。
首先按“alt-F11”打开VB编辑器,这会打开一个这样的窗口:
在此窗口中,您必须通过单击“插入”和“模块”添加模块,这将导致空代码模块,在那里您可以通过以下代码:
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编辑器,然后在单元格中编写以下内容:
=SMALLIF("WCON"; "ACK"; 'Raw PM Data'!$E$2:$E$999; 'Raw PM Data'!$L$2:$L$999)
现在应该返回状态为WCON和ACK的工单的最早日期。
(请记住,当我使用,
参数分隔符时,您的Excel可能会使用;
作为参数分隔符