我正在创建文本生成的 Excel 电子表格。
我有一个电子表格看起来像这样:
0 1 2
A; text1; text2;
B; text3; text4;
C; text5; text6;
我需要实现的目标:
Input: str(A,B) with index 1
Output: text1text3 (concatenated / joined strings)
我尝试过 VLOOKUP 和 FILTER =FILTER(Data!B3:C10, SPLIT(C5, ",")=Data!A3:A10)
,但是它不起作用,并且需要一行(FILTER RANGE REQUIRES SINGLE COLUMN OR ROW)
答案1
由于我无法发表评论,因此有很多事情我无法询问,但是这里有一个基本方法:
=CONCAT( VLOOKUP( FILTERXML("<group><element>" & SUBSTITUTE(E2, ",", "</element><element>") & "</element></group>","/*/*"), A1:C4, MATCH(F2,A1:C1,0), FALSE) )
我假设输入位于单元格 E2 和 F2 中,表格显示在 A1:C4 中。我还假设;
是试图在此处为问题创建表格的产物。如果 是;
有意为之,您只需将字符串操作添加到 以将FILTERXML()
它们添加到它将创建的输入片段中,方法是;
在 中的字符串前添加SUBSTITUTE()
,在 之后添加关闭 XML 表达式的字符串,SUBSTITUTE()
并使用字符串操作将它们从 返回的“textXXX”片段中删除VLOOKUP()
。但它们看起来确实像是产物,所以我在编写上面的内容时将它们取出。
这个FILTERXML()
技巧现在已经过时了,它基本上就是将输入字符串拆开(str(A,B)
)。有很多方法可以做到这一点,但这个FILTERXML()
技巧的好处是,您不必费心弄清楚如何处理该字符串中不同数量的部分,因为它会为您完成。
将其放入VLOOKUP()
意味着VLOOKUP()
查找值参数具有一对二到多对多的输入。意味着它将查找所有输入,而您不必考虑要提供多少输入。然而,因为VLOOKUP()
只会接受一个解析为“数组常量”的输入(在此示例中,FILTERXML()
创建数组常量{"A";"B"}
),所以第二个输入(1
在此示例中)不能是创建多个输入的东西。
更严厉地说,它不会导致错误……Excel 只是忽略了它只取这种返回的第一个元素的想法并给出该结果。所以你可能很长一段时间都没有注意到公式确实失败了。但由于你使用只有 A 列中查找值的多个输入来询问,所以它是 A-OK。但不像你想象的那样可扩展。
您也不必担心查找数组是作为列创建的({"A";"B"}
注意;
分隔它们...如果它为返回创建了一行,它将用{"A","B"}
分隔,
元素)还是作为一行创建,因为您将只返回一行/列向量,并且将它们连接起来将以任何方式将元素作为单个项目返回。很高兴没有提供细节。
然后我习惯CONCAT()
加入它们,因为这种用法非常简单。通常我会去,但既然这个技巧很容易做到,TEXTJOIN()
为什么要添加额外的东西呢?CONCAT()
请注意使用MATCH()
第二个输入来搜索与其匹配的数据范围中的列。通过从 A1 而不是 B1 开始,它返回的值将与数据范围中的“第 X”列数字匹配,就像VLOOKUP()
要求的那样,它自己返回,因此无需添加+1
或类似的东西,因为它会直接获取它。这在这里似乎很明显,因为您的索引编号从 A 列开始,但许多像这样的表格不会这样做,而是将 A1 留空并从 B1 开始对这些索引值进行编号。从 B1 开始意味着返回需要进行MATCH()
调整(+1
在本例中)以返回正确的表格列号,这样VLOOKUP()
就不会返回错误的列。
在这种情况下,MATCH()
(或XMATCH()
)是完美的,可以完美地满足您的需求。但在许多情况下,HLOOKUP()
对于其他情况所需的类似任务,使用它可能是合适的。这并不是说标题是数字而不是文本,只是您将其输入到VLOOKUP()
需要简单数字而不是正式列号(如COLUMN()
用于查找)的地方。不过,将返回值输入到不同的函数中,您可能需要记住HLOOKUP()
。
如果您确实需要在索引输入中容纳多个值,那么INDEX()
在这里强制使用可能更容易,尽管FILTERXML()
可以重新调整技巧以具有第二个“组/元素”级别,并且可以使其产生对的返回,然后这些对本身需要分开,然后才能以任何顺序将各个部分合并为最终结果。然而,其中的第二和第三个 XML 分组需要一些思考,因为它们总是依赖于输入的确切布局/来源、数据的实际物理布局方式以及最终必须如何组合在一起。