如果一个产品可以有另一种产品作为成分,如何列出产品的成分

好的,这里是我简单的表格, P1-P4 = ProductIx = Ingredient

 +---------------------+ | ABCD | +---------------------+ | 1 P1 I1 I2 I3 | | 2 P2 I4 I5 I6 | | 3 P3 I7 I8 P4 | | 4 P4 I10 I11 | +---------------------+ 

现在我要完成的是,我可以列出所有的成分,例如P3,所以我会得到一个类似的列表

 I7 I8 I10 I11 

这甚至可以通过Excel中的公式而不使用VBA? 提前致谢

这是一个recursion的UDF,可以做你想做的事情。 我不相信一个公式就能做到。

 Dim cnt as long Function viceversa(lkup As Variant, rng As Range, nmbr As Long, Optional rec As Boolean) As String Dim rngArr Dim temp as string If rec = False Then cnt = 1 rngArr = rng.Value For i = LBound(rngArr, 1) To UBound(rngArr, 1) If rngArr(i, 1) = lkup Then For j = LBound(rngArr, 2) + 1 To UBound(rngArr, 2) If Left(rngArr(i, j), 1) <> "P" Then If cnt = nmbr Then viceversa = rngArr(i, j) Exit Function Else cnt = cnt + 1 End If Else temp = viceversa(rngArr(i, j), rng, nmbr, True) If temp <> "" Then viceversa = temp Exit Function End If End If Next j End If Next i viceversa = "" End Function 

把它放在工作簿中的一个模块中。 cnt is a public variable and the Dim cnt as Long`需要位于模块的顶部。

那么你可以这样称呼它:

 =viceversa($A$3,$A$1:$D$4,1) 

$ A $ 3是产品,$ A $ 1:$ D $ 4是包括第一列产品的范围。 1是第一个成分。 我用一个数字帮手列:

在这里输入图像描述

如果你有一个或多个产品作为成分,它将继续下去,直到所有的产品都被占。

注意

有一件事情需要改变,就是testing它是不是产品。 所以改变这一行If Left(rngArr(i, j), 1) <> "P" Then到的东西,表明被testing的成分实际上是一个产品。