按多个条件排序/查找数据,并从

时间:2016-04-18 03:46:22

标签: excel excel-vba vba

我有数千条记录,其中显示了四列数据(下面加粗记录):

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。

我想知道每个帐号。我已经尝试了多个条件的索引/匹配,但我无法弄清楚如何在订阅日期字段中为获取最新日期。然后我制作了一个数据透视表并按最大日期排序,但由于不同类型的产品和支付金额,无法弄清楚如何提取其余数据。

任何人都可以帮助我吗?我认为这是一件非常简单的事情,但我完全被难过了。

2 个答案:

答案 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来做,但它变得难看并且难以快速阅读。

Example results

更新

作为替代方案,如果您有兴趣了解最新日期与您所查询的帐号相对应,您可以自行设置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