我有一个列表和一个查找表。列表位于 A 列,查找表位于 C 和 D 列。C 列中的每个单元格都包含文本,并且是唯一的。D 列具有与 C 列的每个元素对应的值。A 列包含一个未排序的列表,其中包含 C 列中文本的重复项,但 C 列之外没有任何内容。下面显示了一个简单的示例
我最终想要的是一个包含从表中查找的 A 列的相应值的数组。所以在这个例子中,我想要
{1,2,1,2,2,2,1,1,2}
我知道这可以通过使用来实现
=vlookup(B9,$C$1:$D$2,2,FALSE)
在 B 列的每个单元格中,并将该列作为数组 {$B$1:$B$9} 抓取。但是,我需要跳过中间人并省略另一列中的任何内容,因为这需要在各种查找表上同时执行但不相连,即不是多重查找,我只需要查看不同对应值集 D 下的相同列表 A。
我完全不知所措,这看起来很简单,但我已经尝试了几个小时,却一无所获。我记得读到过你不能将 vlookup 输出到数组,而且我尝试使用 match 也没有多大运气。所以真的非常感谢任何帮助!谢谢!
答案1
如果没有宏就不可能实现这一点。
您无法避免使用,VLOOKUP
并且它无法将数组作为“查找值”参数进行管理。
我认为最好的选择是使用您已经描述过的辅助列。
答案2
您希望将其{1,2,1,2,2,2,1,1,2}
作为结果返回。或者也许您真的希望1,2,1,2,2,2,1,1,2
,只需放入括号 ( {}
) 即可使其看起来适合讨论。不确定哪种方式,所以我将同时展示这两种方式。
从我记事起,VLOOKUP()
我就愿意将一个范围或任何类型的数组(例如 {"a",4,"4"})用作查找值。可能需要使用{CSE}
entry( Ctrl-Shift-Enter
) 来返回所查找范围的所有成员,但这始终只是一件麻烦事,而不是向电子表格添加宏所带来的那种困难。
因此,使用数组/范围是可行的,但在 2016 年,我确信要获得结果所需的值不止第一个值{CSE}
。如果这里有人尝试使用数组/范围但没有使用{CSE}
,那可能就是结果不可接受的原因。
VLOOKUP()
但从 2021 年起,使用这种方式就不再必要了。
因此现在,当第二个答案发布时,AND IN 2018TEXTJOIN()
可以很好地获取查找返回的结果数组并将它们连接成一个漂亮的字符串。在 2016 年,人们会使用CONCAT()
。
CONCAT()
可以将范围/数组作为输入。Excel 会将范围作为“单个项目”处理,但您可以用括号将其括起来以确保它确实如此。因此,您可以在其中构建一个如下所示的字符串:
=CONCAT(B9:B17&",")
它获取范围单元格生成的每个返回值,并逐一向每个返回值添加逗号。然后它将每个中间字符串串成最终产品。因此,以下公式将生成基本字符串:
=CONCAT(VLOOKUP(A1:A9,C1:D2,2,FALSE)&",")
它以逗号结尾,因此,为了生成没有逗号的数组,您需要将其全部包装在一个SUBSTITUTE()
函数中,通过巧妙地指定“实例编号”来仅删除最后一个 0:
=SUBSTITUTE(CONCAT(VLOOKUP(A1:A9,C1:D2,2,FALSE)&","),",","",ROWS(A1:A9))
逗号的数量与结果的数量相同。结果的数量与给定范围内的单元格数量相同VLOOKUP()
。因此,如果您使用该ROWS()
函数并为其指定相同的范围,它将返回结果中的逗号总数,当然,这也是最后一个逗号的实例数。因此,SUBSTITUTE()
只删除该逗号,保留其余部分。
现在,除了花括号外,您已经拥有一个看起来像您想要的字符串的字符串。如果您想要进一步使用该字符串,请在此处停止。如果您想要花括号,请使用以下命令。但是,将它们添加上去不会使其成为数组:例如,不会使其成为“a real boy”。
要添加它们,只需...添加它们:
="{"&SUBSTITUTE(CONCAT(VLOOKUP(A1:A9,C1:D2,2,FALSE)&","),",","",ROWS(A1:A9))&"}"
此时,标准的“用各部分组成一个字符串”的内容。
如果您不想要字符串(带或不带括号),则需要进一步处理。现在我们可能会使用SUBSTITUTE()
和FILTERXML()
将此或任何文本字符串转换为真正的元素数组,而不是单个元素(您迄今为止创建的文本字符串)。
但是,在任何版本的 Excel 中,都可以使用原始公式及其返回的结果。今天,这将是一个无需特别努力的数组,并且可以在进一步的工作中轻松使用。然后,可能{CSE}
需要输入。这个想法是,您不会像有时那样获得字符串,而是自己制作字符串。因此,只需使用源信息,即原始查找,并且(现在)只需复制查找并将其放入,就可以将其用作其他公式中的数组,可以这么说,作为进一步公式的输入,或者(然后),嗯,本质上是一样的。
答案3
使用相当新的 Excel 函数,在单个单元格中使用单个公式即可实现TEXTJOIN
。这适用于 Excel 2016,但无法在 Excel 2010 中识别,因此#NAME?
我不了解 Excel 2013,希望有人可以测试一下。
有更好的方法来实现结果,但它们不符合您的限制,所以这不是该任务的最佳解决方案,但它是您想要的解决方案。
公式是:
="{"&SUBSTITUTE(SUBSTITUTE(TEXTJOIN(",",FALSE,A1:A9),"a",INDEX(D1:D2,MATCH("a",C1:C2,0))),"b",INDEX(D1:D2,MATCH("b",C1:C2,0)))&"}"
上述公式具有硬编码的查找值。这使得预测输出更加容易,但也使得公式编写和维护更加繁琐,并且比引用公式更弱。
下面的公式引用了单元格,因此不太容易预测输出,但灵活性更高。
="{"&SUBSTITUTE(SUBSTITUTE(TEXTJOIN(",",FALSE,A1:A9),C1,INDEX(D1:D2,MATCH(C1,C1:C2,0))),C2,INDEX(D1:D2,MATCH(C2,C1:C2,0)))&"}"
公式已使用包含 1,000 多行的列表进行了测试,没有任何问题,我认为它将一直工作在 Excel 的行限制范围内。公式的长度与查找表成线性比例,可以容纳 1,000 多行。并且复杂性保持不变。查找表上的每一行新行都需要SUBSTITUTE (
在公式前面添加一个,CELL, INDEX( RANGE (MATCH (CELL, RANGE, 0)))
在末尾添加一个。中间不需要更改任何内容。