好的,这是我的简单表P1-P4 = Product
,Ix = 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? 提前致谢
答案 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
是第一个成分。我使用了带数字的辅助列:
如果您有一种或多种产品作为成分,它将继续下去,直到所有产品都被记录下来并不重要。
注意强>
需要改变的一件事是测试它是否是产品。因此,将此行If Left(rngArr(i, j), 1) <> "P" Then
更改为可以表示被测试的成分实际上是产品的内容。