在两个范围之间查找
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
【讨论】:
以上是关于在两个范围之间查找的主要内容,如果未能解决你的问题,请参考以下文章