按多个条件对列数据进行sorting/查找

我有成千上万的logging,这里显示了四列数据(下面加粗的logging):


AccountNo …..产品types…. AmountPaid ….订阅date
1001 …………….木……………….. 912.34 ……….. 2016年3月1日
1002 …………….木……………….. 987.21 ……….. 2015年6月1日
1003个…………….钻石…………. 500.24 ……….. 2015年4月1日
1001 …………….煤…………………. 125.32 ……… ..04 / 01/2014
1003 …………….木……………….. 789.25 ……….. 2015年9月1日
1543 …………….煤炭…………………. 147.25 ……… ..07 / 01/2015
1001 …………….木……………….. 958.25 ……….. 2016年3月1日
1003 …………….钢………………… 658.51 ………. 0.03 / 01/2016
1008 …………….木……………….. 587.95 ……….. 2015年2月1日
1001 …………….钢………………… 458.58 ………. 0.06 / 01/2015
1232 …………….木……………….. 951.21 ……….. 2015年6月1日


我想要做的是找出最新的 “订阅date”中为“帐号” 所有types的产品支付的总金额。

所以例如我可以确认帐户号码。 “1001”每1870.59的最新订阅date为2016年3月1日。

我想知道这每个帐号。 我已经尝试了索引/匹配的多重标准,但我不知道如何拉取订阅date字段中的最新date。 然后,我做了一个数据透视表,并按最大datesorting,但由于产品和付款金额不同,无法确定如何提取其余数据。

谁能帮我? 我认为这是一个非常简单的事情,但我完全难住。

好的,我从这里拉另一个代码。 它没有使用date,所以我不得不稍微调整一下。 与Excel中内置的SUMIF类似,此用户定义函数将MAXIMUM从必须满足条件的范围中拉出。

Public Function MAXIF(ByVal rgeCriteria As Range, _ ByVal sCriteria As String, _ ByVal rgeMaxRange As Range) As Single Dim iconditioncolno As Integer Dim inumberscolno As Integer Dim lrowno As Long Dim sngmax As Variant Dim vcellvalue As Variant iconditioncolno = rgeCriteria.Column inumberscolno = rgeMaxRange.Column For lrowno = 1 To rgeCriteria.Rows.Count vcellvalue = rgeCriteria.Parent.Cells(rgeCriteria.Row + lrowno - 1, inumberscolno).Value If rgeCriteria.Parent.Cells(rgeCriteria.Row + lrowno - 1, iconditioncolno).Value = sCriteria And (IsNumeric(vcellvalue) = True Or IsDate(vcellvalue) = True) Then 'I had to add the IsDate and OR to the above check to make it work with dates If sngmax = 0 Then sngmax = vcellvalue If vcellvalue > sngmax Then sngmax = vcellvalue End If If sngmax <> 0 And IsEmpty(vcellvalue) = True Then Exit For Next lrowno For lrowno = 1 To rgeCriteria.Rows.Count vcellvalue = rgeCriteria.Parent.Cells(rgeCriteria.Row + lrowno - 1, inumberscolno).Value If rgeCriteria.Parent.Cells(rgeCriteria.Row + lrowno - 1, iconditioncolno).Value = sCriteria And _ IsNumeric(vcellvalue) = True Then If rgeCriteria.Parent.Cells(rgeCriteria.Row + lrowno - 1, inumberscolno).Value > sngmax Then sngmax = rgeCriteria.Parent.Cells(rgeCriteria.Row + lrowno - 1, inumberscolno).Value End If End If If sngmax <> 0 And IsEmpty(vcellvalue) = True Then Exit For Next lrowno MAXIF = sngmax End Function 

我把代码放在模块部分。 然后,我将新的UDF与内置的SUMIFS结合起来生成这个公式:

 =SUMIFS(C2:C12,A2:A12,F2,D2:D12,MAXIF(A2:A12,F2,D2:D12)) 

现在,因为你有一千行数据,你可能不期待定义所有这些范围。 如果您查看整个列(所有1048576行)都可以,则可以执行以下操作:

 =SUMIFS(C:C,A:A,F2,D:D,MAXIF(A:A,F2,D:D)) 

或者你可以用OFFSET和COUNT来做,但是它会变得难看难读。

示例结果

UPDATE

作为另一种select,如果您也有兴趣知道最近的date是与您询问的帐号相邻的,那么您可以自行设置MAXIF()公式:

MAXIF(A2:A12,F2,D2:D12)

然后在旁边的列中,你可以做一个sumproduct而不是一个sumifs。

 =sumproduct(($A$2:$A$12=F2)*($D$2:$D$12=G2)*($C$2:$C$12)) 

不知道它是否比使用sumifs更好,但它是另一种select。 这种方法的好处之一是,如果你有一个特定的date,你想要search你只要input它,并用特定的datereplaceMAXIF公式。

使用下面的公式来得到你的结果。

 =SUMIFS(C:C,A:A,"1001",D:D,"03/01/2016") 

如果你想要所有的数据在一个镜头。 你可以去VBA