【发布时间】:2016-02-17 16:32:21
【问题描述】:
我想在“否”中做一个 VLOOKUP 获取值 no“201”,其中 Purchases 表中的“no”和“box”匹配
=IFERROR(INDEX($B2:$B100,MATCH(1,($A2:$A100=$H1)*($E2:$E100=I$1),0),3),"NONO")
可以有比 VLOOKUP 更好的选择,这也很好。谢谢!
【问题讨论】:
我想在“否”中做一个 VLOOKUP 获取值 no“201”,其中 Purchases 表中的“no”和“box”匹配
=IFERROR(INDEX($B2:$B100,MATCH(1,($A2:$A100=$H1)*($E2:$E100=I$1),0),3),"NONO")
可以有比 VLOOKUP 更好的选择,这也很好。谢谢!
【问题讨论】:
【讨论】:
Ctrl+Shift+Enter?
数组公式² 和 AGGREGATE¹ function 等函数产生的循环处理会产生计算滞后。它们引用的范围应保持最少的行数。在接收频繁添加和删除的数据上维护最少数量的相关行非常耗时。
以下公式看起来要复杂得多,但它会动态跟踪INDEX function 的数组 中的确切行数。为了简化公式,我允许增加一行;这是包含列标题标签的第 1 行。
以I10为标准公式,
=INDEX(B:B, AGGREGATE(15, 6, ROW($A$1:INDEX($A:$A, MATCH(1E+99,$A:$A )))/($A$1:INDEX($A:$A, MATCH(1E+99,$A:$A ))=$H10), ROW(1:1)))
向右和向下填充。
用于您的字符串连接。我从one of my previous answers 中提取了这个 VBA 用户定义函数³(又名 UDF)来解决类似的问题。
Public Function conditional_concat_strs(rSTRs As Range, rCRITs As Range, rCRIT As Range, Optional sDELIM As String = ", ")
Dim c As Long, sTMP As String
Set rSTRs = Intersect(rSTRs, rSTRs.Parent.UsedRange)
Set rCRITs = Intersect(rCRITs, rCRITs.Parent.UsedRange)
Set rSTRs = rSTRs.Cells(1, 1).Resize(rCRITs.Rows.Count, rCRITs.Columns.Count)
For c = 1 To rCRITs.Cells.Count
If rCRITs(c).Value2 = rCRIT Then _
sTMP = sTMP & rSTRs(c).Value & sDELIM
Next c
conditional_concat_strs = Left(sTMP, Application.Max(Len(sTMP) - Len(sDELIM), 0))
End Function
在 I2 中,
=conditional_concat_strs(E:E,A:A, I1)
完整的列引用在Worksheet.UsedRange property 的范围内被截断。使用它们没有计算惩罚。
¹ 数组公式需要使用 Ctrl+Shift+Enter↵ 完成。一旦正确输入第一个单元格,它们就可以像任何其他公式一样被填充或向下或向右复制。尝试将全列引用减少到更接近代表实际数据范围的范围。数组公式以对数方式消耗计算周期,因此最好将引用范围缩小到最小值。更多信息请参见Guidelines and examples of array formulas。
² AGGREGATE function 是在 Excel 2010 中引入的。它在早期版本中不可用。
³ 用户定义函数(又名 UDF)被放入标准模块代码表中。点击Alt+F11,当VBE打开时,立即使用下拉菜单插入►模块(Alt+I,M)。将功能代码粘贴到标题为 Book1 - Module1 (Code) 的新模块代码表中。点击 Alt+Q 返回您的工作表。
【讨论】: