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

时间:2015-12-22 19:20:41

标签: excel excel-formula

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

+---------------------+
|   A    B    C    D  |
+---------------------+
| 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? 提前致谢

1 个答案:

答案 0 :(得分:0)

这是一个递归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为Long`需要位于模块的顶部。

然后你可以这样称呼它:

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

$ A $ 3是产品,$ A $ 1:$ D $ 4是Range,包括第一列产品。 1是第一个成分。我使用了带数字的辅助列:

enter image description here

如果您有一种或多种产品作为成分,它将继续下去,直到所有产品都被记录下来并不重要。

注意

需要改变的一件事是测试它是否是产品。因此,将此行If Left(rngArr(i, j), 1) <> "P" Then更改为可以表示被测试的成分实际上是产品的内容。