我想在“不”中做一个VLOOKUP 获取值“201”,其中“购买”表中的“否”和“框”匹配
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
可以有另一个选项比VLOOKUP更好,这也没关系。谢谢!
答案 0 :(得分:0)
使用此数组公式。此公式将过滤您将放入I1
单元格的所有数据。
=IFERROR(INDEX($A$1:$E$25,SMALL(IF($A$1:$A$25=$I$1,ROW($A$1:$A$25)),ROWS($A$1:$A1)),COLUMNS($A$1:A$1)),"")
由于它是一个数组公式,按 CTRL + SHIFT + ENTER 来评估公式。
将公式放入G4
单元格后(如我的截图所示),根据需要向右下方拖动和填充。
答案 1 :(得分:0)
数组公式²和由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。
² {2010}引入了AGGREGATE function。它在早期版本中不可用。
³用户定义函数(又名UDF)被放入标准模块代码表中。点击 Alt + F11 ,当VBE打开时,立即使用下拉菜单插入►模块( Alt + 我,中号)。将功能代码粘贴到标题为 Book1 - Module1(Code)的新模块代码表中。点击 Alt + Q 返回工作表。