我有以下示例数据,其中包含四个列 类, ID ,类型和代码:
Class ID Type Code
Class1 ID1 Code1
Class1 ID1 Type1
Class1 ID1 Type2
Class1 ID1
Class1 ID1 Code1
Class1 ID1
Class1 ID1 Type1
Class1 ID1 Code1
Class1 ID1 Type2
Class1 ID1
Class1 ID1 Code1
Class1 ID1
Class1 ID1 Type2
Class1 ID1 Type1
Class1 ID1 Code1
Class1 ID1 Type2
Class1 ID1 Type2
Class1 ID1 Type2
我有以下公式:
=COUNTIFS($A:$A;"Class1";$B:$B;"ID1";$D:$D;"code1")
但我希望获得一个附加条件的countifs
公式:
仅计算那些code1
作为 TYPE 列中的下一个出现type1
的{{1}}
所以我会:
通过在公式中保持上述条件并添加附加条件:
代码1 的count
type1 作为下一次出现将 2 。同样地,count
中类型2 的TYPE column
类型2 将是 3 。
修改 其实我知道如何找到我的第n场比赛:
SMALL(IF($C$1:$C$51="type1";ROW($C$1:$C$51);"");1)
但我不知道如何合并这两个公式。
Acually,我已经找到了我的code1
,然后相对于其单元格引用,在下一行一行中找到我的type1
,但并不总是如此下面一排,有时是两排或三排或更多。
=OFFSET(INDEX($D:$D;MATCH(1;(D:D="code1")*(A:A="class1");0);1);1;-1;1;1)
我觉得它与sumproduct
和offset
或index/match
有关,但我找不到自己的方式。
** P.S。 **我也试过以下,但仍然没有结果:
=MMULT(($A:$A="Class1")*($B:$B="ID1")*($D:$D="code1");N(OFFSET(INDEX($D:$D;MATCH(1;(D:D="code1")*(A:A="class1");0);1);1;-1;1;1)="type1"))
由于实现这一点似乎有点问题,我正在添加此更新以了解如何使用UDF实现此目的?
答案 0 :(得分:2)
过于复杂的数组公式快速地咀嚼计算资源,并且在偏移范围中查找第一个非空白条目属于此类别。有时,引入一个帮助列可以更容易地获得一些必要的信息来获得一个权宜的结果。
在右侧未使用的列中,在第2行中使用此标准公式。
=IF(LEN($D2), INDEX($C2:$C$999, MATCH("*", $C2:$C$999, 0)), "")
如果您需要更多行,请编辑 999 结束行。如果你少了,可以单独留下。作为标准配方,这是正常输入的。根据需要填写以获取所有回报。
MATCH("*", $C2:$C$999, 0)
也可能是MATCH("Type*", $C2:$C$999, 0)
,您需要更具体的查找。
现在,您可以使用传统(且高效)COUNTIFS function来实现结果。
附录: UDF替代
UDF的代码是:
Function udf_CountIf_Next_Item(rR1 As Range, sS1 As String, _
rR2 As Range, sS2 As String, rR3 As Range, sS3 As String, _
rR4 As Range, sS4 As String, Optional sS5 As String = "")
Dim rw As Long, rws As Long, n As Long
With Intersect(rR1.Parent.UsedRange, rR1)
rws = .Rows.Count
End With
For rw = 1 To rws
If LCase(rR1(rw).Value2) = LCase(sS1) Then
If LCase(rR2(rw).Value2) = LCase(sS2) Then
If LCase(rR3(rw).Value2) = LCase(sS3) Then
If Not IsError(Application.Match(sS5 & Chr(42), rR4(rw).Resize(999, 1), 0)) Then
If LCase(Application.Index(rR4(rw).Resize(999, 1), _
Application.Match(sS5 & Chr(42), rR4(rw).Resize(999, 1), 0))) = LCase(sS4) Then
n = n + 1
End If
End If
End If
End If
End If
Next rw
udf_CountIf_Next_Item = n
End Function
语法:
udf_CountIf_Next_Item(&lt; 1 st 列&gt;,&lt; 1 st 标准&gt;,&lt; 2 < sup> nd 列&gt;,&lt; 2 nd 标准&gt;,&lt; 3 rd 列&gt;,&lt; 3 rd 标准&gt ;,&lt;特殊浮动列&gt;,&lt; 4 th 标准&gt;,[可选]&lt;部分浮动标准&gt; )
上述样本图像的J7中的公式为:
=udf_CountIf_Next_Item($A:$A, $F7,$B:$B, $G7,$D:$D, $I7,$C:$C, $H7, "Type")
完整列引用不应该是一个问题,因为UDF会将它们截断到工作表的UsedRange属性的边界。仍然可以使用像A2:A99这样的部分列引用。
答案 1 :(得分:-1)
我不是Excel的专家,但我认为你可以用INDEX()来解决这个问题。
或者如果你进入Range.FindNext方法
https://msdn.microsoft.com/en-us/library/office/ff196143.aspx
希望有人能帮到你。
编辑:抱歉。我错了。但学到了很多。