我有一个零件编号及其所用程序的列表。如下所示:
Part #s. Programs. Results
A A 3
A B
A C
B A 1
C A 1
D A 1
我如何获取结果来显示有多少个程序使用了该部分?
答案1
答案2
所显示的数据为我提出的问题比它解答的还多,但我将深入研究我所看到的最复杂的解释,因为几乎所有其他解释都有简单的答案,因此为什么有人会问呢?
在我看来,您实际上想要知道第 1 列和第 2 列有多少种独特的组合。例如,AA、AB 和 AC 似乎产生了程序对“部件 # A”的三种使用。如果还有另一行 AB,则不会添加到该行,因为程序 B 已经被计算过一次。
因此,将每行上的两个单元格(AA、AB 等)配对,然后从这些配对中取出一组唯一配对出现次数的方法将消除多余行的数据。然后,可以通过计算给定部分的所有唯一出现次数(在我的情况下是使用总和)来用所需的总和填充第 3 列的单元格,并通过隔离任一单元格的数据(例如第 1 列)并检查其内容是否出现在其上方(因为如果这是真的,则该部分的结果将已被记录)来决定在哪些单元格中不显示任何内容。
因此有以下公式。我承认,可能有更优雅的方法,但它确实有效……
=IFERROR(1/(1/SUM((LEFT(UNIQUE($A$2:$A$7&$B$2:$B$7),1)=IF(ISERROR(VLOOKUP(A2,$A$1:A1,1,FALSE)),A2,IF(VLOOKUP(A2,$A$1:A1,1,FALSE)=A2,0,A2)))*1)),"")
UNIQUE($A$2:$A$7&$B$2:$B$7)
构建对,然后制作唯一对的列表。LEFT()
获取第 1 列的贡献(它们必须配对才能获得唯一对,否则就只能从第 1 列的数据开始)。
然后将其与正在检查的行上方单元格中的内容进行比较。范围$A$1:A1
随着列向下扩展,始终是从标题单元格到您正在检查的行上方单元格的范围。执行查找以查看单元格的内容是否已经出现。存在三种可能性:错误、真和假。由于 Excel 中处理错误的方式,必须首先检查这一点。IFERROR()
如果失败,则不能使用,因为人们不希望输出正在查找的内容。如果不是错误,则再次测试它以匹配单元格的内容是 TRUE 还是 FALSE。如果是 TRUE,则它存在于该行上方,并且需要“无输出”结果。如果是 FALSE,那么与错误可能性一样,人们希望输出单元格的内容。
如果需要输出,则需要单元格的内容,因为它们将LEFT()
与我们开始的输出进行比较。这将生成 TRUE 或 FALSE,最后*1
变为 1 和 0。因此,以该行第 1 列内容开头的所有唯一对将生成 1,其余为 0。SUM()
然后将它们相加,得到您想要的计数。
但是……如果在这里停止,那么在您明确想要空白单元格的地方就会出现 0。因此,IFERROR()
如果它是该单元格内容第 1 列中第一次出现,或者""
它是第二次或更晚出现,则可以使用它来给出上面计算的结果。这是通过实现到目前为止的计算来实现的,当不想要空白输出时,计算会生成一些非零值,而当想要空白时,计算会生成 0。如果用结果除以该结果,那些 0 就会出错。当然,3 次使用会给出 1/3 作为结果,这是不好的,所以将其包装在 中()
并用 1 除以它。错误仍然会发生,所以IFERROR()
仍然可以返回,""
但现在那些 1/3 等等又返回到整数。
所以,虽然有很多繁琐的工作,但还是有用。到目前为止,我还不能让它使用 SPILL 功能,所以需要将公式从 D2 复制到 Dxxx。