在两个范围之间查找

Posted

技术标签:

【中文标题】在两个范围之间查找【英文标题】:Lookup between two ranges 【发布时间】:2017-06-08 16:23:43 【问题描述】:

下午,我正在处理两列数据 - 其中一列有作者姓名,第二列有发布日期时间值。我正在寻找建立一个UDF来获取这两个范围,在作者列中搜索特定字符串,如果找到则从发布列返回值。

数据看起来与此类似;

一旦找到我正在寻找的作者,我希望它查看发布时间并找到它的最小值。

例如,如果我在上面寻找作者 Ben,那么返回的值应该是 08/06/2014 17:15。

如果我使用的数据始终采用相同的格式,那么我将建立一个数组公式来创建一个 MINIF,但这些范围显示的列总是不同的,最简单的选择是最终用户的 UDF可以把这两个范围放进去。

提前感谢您的帮助。

干杯

【问题讨论】:

为什么不使用 Vlookup 或索引/匹配? 您需要在 UDF 中放入与使用 MINIFS() 相同数量的条件,因此让每个人都订阅 Office 365 Excel 并使用:=MINIFS(B:B,A:A"Ben") 或者您可以向我们展示什么您已经尝试过使用 vba 以及遇到问题的地方。 Stack Overflow 不是我网站的代码。 【参考方案1】:

您的 UDF 可能是这样的,不需要 Office 365 功能:

Function MinDateByAuthor(author As String, rngNames As Range, rngDates As Range) As Date
  MinDateByAuthor = Application.Evaluate("Aggregate(15, 6," & _
    rngDates.Address(External:=True) & "/(" & _
    rngNames.Address(External:=True) & "=""" & author & """),1)")
End Function

你可以像=MinDateByAuthor("Ben", A2:A100, B2:B100)一样使用它

您还可以放置一些单元格地址,而不是硬编码的"Ben"

TBH,您的 UDF 所做的只是简化了输入初始公式的过程。 您可能希望通过允许完整的列引用 (A:A, B:B) 使其更容易,而不会出现敏感的缓慢。在上面的 UDF 中,您可以 这样做,但正如 @ScottCraner 所建议的,我们可以让它更快地工作:

Function MinDateByAuthor2(author As String, ByVal rngNames As Range, ByVal rngDates As Range) As Date
  Set rngNames = Intersect(rngNames, rngNames.Parent.UsedRange)
  Set rngDates = Intersect(rngDates, rngDates.Parent.UsedRange)

  ' The rest is the same ...
  MinDateByAuthor2 = Application.Evaluate("Aggregate(15, 6," & _
    rngDates.Address(External:=True) & "/(" & _
    rngNames.Address(External:=True) & "=""" & author & """),1)")
End Function

在这里您会注意到=MinDateByAuthor2(A3,A:A,B:B) 的计算速度比=MinDateByAuthor(A3,A:A,B:B) 快。

【讨论】:

聚合!!!!!!好样的。尽管这是一个很有价值的问题,但我还是给了 +1 以供使用 AGGREGATE。希望 OP 使用 2010 或更高版本。 @ScottCraner 哈哈,谢谢,我知道这是你的面包和黄油,但我有点饿:P 我学到的一个技巧是我们可以允许使用完整的列引用是添加set rngNames = intersect(rngNames,rngnames.parent.usedrange) 这样用户可以使用完整的列而不会受到损害。 @ScottCraner 这是一个好主意......这是一个难题,为什么它没有在 Excel 中自动完成。好吧,我想如果是自动集成的话,这些家伙肯定发现了一些严重的缺陷。 我最初的评论(我删除的)是如果两个(截断)数组中的错位是由于使用范围中的错位造成的。但这是一个非常“理论”的边缘案例。然而,我相信这种可能性阻止了 MS 人员系统地进行这样的截断。【参考方案2】:

应该是这样的,只要改变这一行:

If Cells(x,1).Value="ben" Then 'or whatever name you chose

如果你想让它成为其他作者

 Dim x As Integer
 Dim y As Integer
 Dim a As Date

      Application.ScreenUpdating = False
      ' Set numrows = number of rows of data.
      NumRows1 = Range("A1", Range("A1").End(xlDown)).Rows.Count
      NumRows2 = Range("B1", Range("B1").End(xlDown)).Rows.Count

      Range("A1").Select

      For x = 1 To NumRows1
           If Cells(x,1).Value="ben" Then 'or whatever name you chose
             If IsEmpty(a) Then
                A = Cells(x,2)
             End If
             If DateValue(Cells(x,2))<A Then
                  A = Cells(x,2)    
             End If
           End If
      Next

【讨论】:

以上是关于在两个范围之间查找的主要内容,如果未能解决你的问题,请参考以下文章

查找两个整数范围之间的重叠区域

在spring mongodb中的两个字符串日期范围之间查找

Jquery - 在mysql中查找两个唯一ID之间的范围

mysql日期范围查找(两个日期之间的记录)

选择两个不同字段之间的范围包含给定数字的数据

选择两个不同字段之间的范围包含给定数字的数据