我有数千条记录,其中显示了四列数据(下面加粗记录):
AccountNo .....产品类型.... AmountPaid ....订阅日期
的 1001 ................木材.................... 912.34 ........ ... 2016年3月1日
1002 ................木.................... 987.21 ........... 2015年6月1日
1003个................钻石............. 500.24 ........... 2015年4月1日<无线电通信/>
的 1001 ................煤...................... 125.32 ...... ..... 2014年4月1日
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 ....... .... 2015年6月1日
1232 ................木.................... 951.21 ........... 2015年6月1日
我要做的是找出属于最新'SubscribeDate'的'AccountNo'的所有类型产品的总支付金额< / p>
例如,我可以确认帐号。 '1001'根据2016年1月1日最新订阅日期支付1870.59。
我想知道每个帐号。我已经尝试了多个条件的索引/匹配,但我无法弄清楚如何在订阅日期字段中为仅获取最新日期。然后我制作了一个数据透视表并按最大日期排序,但由于不同类型的产品和支付金额,无法弄清楚如何提取其余数据。
任何人都可以帮助我吗?我认为这是一件非常简单的事情,但我完全被难过了。
答案 0 :(得分:0)
好的,我从另一个here中提取了此代码。它没有使用日期,所以我不得不稍微调整一下。与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来做,但它变得难看并且难以快速阅读。
作为替代方案,如果您有兴趣了解最新日期与您所查询的帐号相对应,您可以自行设置MAXIF()公式:
MAXIF(A2:A12,F2,D2:D12)
然后在旁边的栏中你可以做一个sumproduct而不是sumifs。
=sumproduct(($A$2:$A$12=F2)*($D$2:$D$12=G2)*($C$2:$C$12))
不确定它是否比使用sumif更好,但它是另一种选择。这种方法的好处之一就是如果你想要搜索一个特定日期,你只需输入它并用特定日期替换MAXIF公式。
答案 1 :(得分:0)
使用以下公式获得结果。
=SUMIFS(C:C,A:A,"1001",D:D,"03/01/2016")
如果您想一次拍摄所有数据。你可以去VBA