我尝试使用各种函数组合,但似乎没有特定的函数可以返回未搜索/匹配的值。由于我需要整理大量数据,因此手动执行此操作需要几天时间。
我希望 MS excel 2003 根据列表 B 提取列表 A 的余数。
*列表 A 包含 2000 件物品,列表 B 最多仅包含 10-30 件物品
列表 A
编号 1----1 2 3 4 5 6(每个数字放在 1 个单元格中,始终为 6 位数字)
编号 2----1 1 2 3 4 5(每个数字放在 1 个单元格中,始终为 6 位数字)
编号 3----1 3 4 5 6 7(每个数字放在 1 个单元格中,始终为 6 位数字)
列表 B
编号 1----1 2 3(每个数字放在 1 个单元格中,始终为 3 位数字)
编号 2----1 1 4(每个数字放在 1 个单元格中,始终为 3 位数字)
编号 3----2 3 5(每个数字放在 1 个单元格中,始终为 3 位数字)
例如:
在列表 A 中,根据列表 B 的输入查找匹配项(如果有),并将剩余项作为输出返回。如果未找到匹配项,则无需输出。
列表 A
编号 1----1 2 3 4 5 6(每个数字放在 1 个单元格中,始终为 6 位数字)
根据列表 B,
1 号----1 2 3(找到匹配项(1&2&3 存在),然后我手动选择余数 # # # 4 5 6 或 = 456)
2 号----1 1 4(未找到匹配项(1&1&4 不存在),无输出)
3 号----2 3 5(找到匹配项(2&3&5 存在),然后我选择 1 # # 4 # 6 或输出 = 146)
我认为我使用 COUNT 函数来计算列表 A 中每个项目中每个数字 0-9 的频率,然后使用 IF 和 AND 函数(指定每个数字需要哪些以及多少个才有资格匹配)来告诉我列表 B 中的哪些项目与列表 A 匹配。
因此,对于列表 A 中的每个项目,我需要 Excel 遍历整个列表 B,并且输出范围可以从无输出到最多 3 个输出。
我还希望能够更改列表 B 中的值而不改变用于搜索的公式,以便我可以轻松地重复使用同一张工作表。
到目前为止,我尝试使用其他函数都无法以我想要的方式提取余数。如果您有任何建议,请教我。
答案1
好的,这是一个可行的解决方案,但在设置它时可能会让您脑损伤。我一步一步地建立它,计算一组东西,然后用于下一次计算。一旦我有了工作模型,我就会反向工作,用实际公式替换单元格引用,以便所有公式都只引用您的实际列表而不是中间计算。公式如雨后春笋般涌现。事实上,第一次尝试产生的公式超出了单元格容量。我将其分成两个表,第一个表为第二个表提供数据。这些表非常大,如果您试图让所有单元格引用指向正确的位置以在整个表格中以两个方向填充公式,那您肯定会发疯的。所以我添加了一些间接引用,这样公式就可以简单地复制和粘贴,并且无需手动清理即可工作。不幸的是,这产生了一些相当大的公式。
我将以位于电子表格特定位置的示例来解释这一点。如果您需要将部分内容放在其他地方,请编辑第一个单元格中的所有行和列引用,然后复制并粘贴以填充表格。为了您自己的理智,请设置一些已知的示例,以便在填充整个表格之前验证每个表格中的前几行和前几列是否正常工作。服用几片预防性阿司匹林,我们就开始吧。
这是基于您的列表 A 在 A 到 F 列中,数据从第 1 行开始(2,000 行)。列表 B 在 H 到 J 列中,数据从第 1 行开始(30 行)。
第一个表从 L1 开始。此表创建了列表 B 条目在列表 A 记录中的位置列表。例如:
Position: 1 2 3 4 5 6
So if a List A record contains: 1 3 3 5 7 9
and a List B record contains: 1 3 7
the entry in this table will be: 1 2 5 (stored as a single number: 125)
如果列表 B 记录与列表 A 记录不匹配,则单元格中将显示 #N/A。此表的布局如下:
[L] [M] [N] [O]
[1] <=======List B Row========>
[2] List A Row 1 2 3 ...
[3] 1
[4] 2
[5] 3
...
您实际上需要将行号作为列标题放在 M 列至 AP 列的第 2 行中,并将行标签放在 L 列中。这些是公式用作指针的内容。共有 30 个数据列,每个数据列对应 B 列表条目的每行,您将有 2,000 行,表示 A 列表中的条目,从第 3 行开始。表格的每个单元格都反映了 B 列表条目与 A 列表条目的关系。这是 M3 的公式:
=MATCH(INDIRECT("H"&M$2),$A1:$F1,0)&MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
+MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)&MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
+MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)
+MATCH(INDIRECT("J"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
+MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)+1, , )&":$F"&$L3),0)
我在这里将公式拆分开来,使其更易读,但其实都是一个公式。使用一些示例数据验证它在 M3 到 N4 中是否有效,然后复制并粘贴以填充表格。
第二张表从 AR1 开始。该表的结构相同:
[AR] [AS] [AT] [AU]
[1] <=======List B Row========>
[2] List A Row 1 2 3 ...
[3] 1
[4] 2
[5] 3
...
该表与第一个表类似 - 每个单元格代表列表 B 记录与列表 A 记录的结果。该表包含您的余数。因此,在我给出的第一个表的示例中,余数为 359:
So if a List A record contains: 1 3 3 5 7 9
and a List B record contains: 1 3 7
the remainder is: 3 5 9
单元格 AS3 中的公式为:
=IF(ISNA(M3),"",IF(ISERROR(FIND(COLUMN(INDIRECT("a"&$AR3)),M3)),INDIRECT("a"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("b"&$AR3)),M3)),INDIRECT("b"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("c"&$AR3)),M3)),INDIRECT("c"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("d"&$AR3)),M3)),INDIRECT("d"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("e"&$AR3)),M3)),INDIRECT("e"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("f"&$AR3)),M3)),INDIRECT("f"&$AR3),""))
如果没有匹配,则此表中的每个单元格将包含余数或空字符。
您希望获取每个列表 A 记录的结果摘要。由于表格的每一行代表一个列表 A 记录,因此摘要可以放在表格每一行的末尾。表格的 30 列以 BV 列结束,因此结果位于 BW 列中。BW3 的公式为:
=AS3&IF(ISBLANK(AS3),""," ")&AT3&IF(ISBLANK(AT3),""," ")& ... &BV3&IF(ISBLANK(BV3),""," ")
这里不会显示所有 30 个词,而是只显示前两个和最后一个。按照相同的模式添加其余的词。它通过连接每个匹配的结果来构建结果字符串。如果单元格中有值,它会在下一个值之前添加一个空格。如果您想要不同的分隔符,请将空格更改为其他内容,例如逗号空格。将此公式复制到所有行的 BW 列。
这可能不是结果最有用的地方。一旦一切正常,您就可以移动东西。实际上,如果您移动任何东西,您可能需要大量清理单元格引用。更有意义的是,只需在另一个位置创建您想要的输出,并使用单元格引用来引用已经设置的内容。