Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 按多个条件和列中的最新日期对数据进行排序/查找_Excel_Vba - Fatal编程技术网

Excel 按多个条件和列中的最新日期对数据进行排序/查找

Excel 按多个条件和列中的最新日期对数据进行排序/查找,excel,vba,Excel,Vba,我有数千条记录,其中有四列数据,如下所示(粗体记录): 账户编号….产品类型….支付金额….订阅日期 1001…………木材…………912.34…………2016年1月3日 1002木材987.21 2015年1月6日 1003……….钻石……….500.24……….04/01/2015 1001…………煤炭…………125.32…………2014年1月4日 1003木材789.25 2015年1月9日 1543…………煤炭…………147.25…………07/01/2015 1001…………木材…………

我有数千条记录,其中有四列数据,如下所示(粗体记录):


账户编号….产品类型….支付金额….订阅日期
1001…………木材…………912.34…………2016年1月3日
1002木材987.21 2015年1月6日
1003……….钻石……….500.24……….04/01/2015
1001…………煤炭…………125.32…………2014年1月4日
1003木材789.25 2015年1月9日
1543…………煤炭…………147.25…………07/01/2015
1001…………木材…………958.25…………2016年1月3日
1003……….钢材……….658.51……….03/01/2016
1008…………木材…………587.95…………2015年1月2日
1001………..钢……….458.58……….06/01/2015
1232木材951.21 2015年1月6日


我想做的是找出属于“AccountNo”的最新“SubscribeDate”的所有类型产品的总支付金额

例如,我可以确认账号“1001”在2016年1月3日的最新认购日期支付了1870.59英镑

我想知道每个帐号的这个。我尝试了对多个条件进行索引/匹配,但我不知道如何在subscribe date字段中仅提取最新日期。然后我制作了一个数据透视表,并按max date排序,但由于产品类型和支付金额不同,我无法确定如何提取其余数据


有人能帮我吗?我认为这是一件非常简单的事情,但我完全被难住了。

好的,我从另一个代码中提取了这段代码。它与日期无关,所以我不得不稍微调整一下。与Excel内置的SUMIF类似,此用户定义函数从必须满足标准的范围中提取最大值

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
现在,由于您有大约1000行数据,您可能不希望定义所有这些范围。如果可以查看整个列(所有1048576行),则可以执行以下操作:

=SUMIFS(C:C,A:A,F2,D:D,MAXIF(A:A,F2,D:D))
或者你可以用偏移量和计数来做,但它会变得难看而且很难快速读取

更新 如果您还想知道最近的日期与您要查询的账号相邻,您可以自行使用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更好,但这是另一种选择。这种方法的一个好处是,如果您有一个要搜索的特定日期,您只需键入它并用特定日期替换MAXIF公式。

使用以下公式即可获得结果

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

如果你想在一次拍摄中获得所有数据。您可能会选择VBA

前几天遇到了一个与此非常类似的问题,VBA是否可以接受?是否有人想给您一个答案?辅助单元格或附加列是否可以接受?VBA可以!我只需要一个解决方案:(哈哈,谢谢你的回复。我现在会查出来的。是的……是间隔。这些是传统excel单元格中的。日期字段也是数字。@MiguelM以前的答案对你不起作用,因为它只适用于每个客户帐户的唯一日期。所以我删除了该代码,并从另一个站点引入了该代码,并对其进行了轻微修改调整一下,瞧,这是一个希望对你有效的解决方案。我给你提供了一个屏幕截图,显示它与你的示例数据相加。转发。这非常有效。但有一个缺点。我不想逐个查找。我想对每个“AccountNo”执行此操作在第一列中。在我的原始文件中,我可能有75k条记录。有没有一种方法可以让我使用这个(出色的)脚本快速运行所有AccountNo,根据他们最新的“Subscribedate”提取他们所有的“AmountPaid”?所以我所做的就是提取唯一的“AccountNo”进入F列,然后向下拖动公式。但是,对于75k,这将在计时10行处理后大约需要29小时。有没有更快的方法?这将是一个稍微不同的问题。您想生成一个新的唯一数字列表,或者通常称为“从列中删除重复项”。看看这个问题,因为它已经被问了很多次。如果你能找到答案,就把这个公式复制到你的列表旁边。是的,我已经过滤掉了重复项,并将唯一的Accountno放在F列。但是,当我向下拖动第二列时,需要一段时间来呈现信息(这是可以的)只是想知道是否有更快的方法。您如何知道2016年1月3日是1k左右记录的最新日期?@ForwardEd。问得好。但我们需要将日期和账号解析为参数
=SUMIFS(C:C,A:A,"1001",D:D,"03/01/2016")