我想创建范围内所有“x”字符串出现的列表。这是我的表:
我想搜索所有出现并列出它们并给出正确的名称: 例如对于G2,我想要“Beret Gray”字符串作为结果。我认为我需要使用数组公式或类似的东西。
答案 0 :(得分:1)
首先让我先说明vba会更强大,但是这个公式会让你在那里。它可能很慢,因为它是一个数组类型公式,并且正在进行大量计算。这些计算只是随着它们中包含它们的细胞数量的增加呈指数地表达:
=IFERROR(INDEX(A:A,AGGREGATE(15,6,ROW($B$2:$G$7)/($B$2:$G$7="x"),ROW(1:1))) & " " & INDEX($1:$1,AGGREGATE(15,6,COLUMN(INDEX(A:G,AGGREGATE(15,6,ROW($B$2:$G$7)/($B$2:$G$7="x"),ROW(1:1)),0))/(INDEX(A:G,AGGREGATE(15,6,ROW($B$2:$G$7)/($B$2:$G$7="x"),ROW(1:1)),0)="x"),ROW(1:1)-COUNTIF($B$1:INDEX(G:G,AGGREGATE(15,6,ROW($B$2:$G$7)/($B$2:$G$7="x"),ROW(1:1)) -1),"x"))),"")
您需要将范围扩展到您需要的范围。将所有$B$2:$G$7
更改为$B$2:$N$29
。不要在我使用的那些之外使用完整的列引用。它会杀死Excel。
另请注意什么是相对引用,什么不是相对引用,它们需要保持不变,否则在拖动/复制公式时会出现错误。
用简单的UDF做你想做的事:
Function findMatch(rng As Range, crit As String, inst As Long) As String
Dim rngArr() As Variant
rngArr = rng.Value
Dim i&, j&, k&
k = 0
If k > Application.WorksheetFunction.CountIf(rng, crit) Then
findMatch = ""
Exit Function
End If
For i = LBound(rngArr, 1) + 1 To UBound(rngArr, 1)
For j = LBound(rngArr, 2) + 1 To UBound(rngArr, 2)
If rngArr(i, j) = crit Then
k = k + 1
If k = inst Then
findMatch = rngArr(i, 1) & " " & rngArr(1, j)
Exit Function
End If
End If
Next j
Next i
然后你会这样称呼它:
=findMatch($A$1:$G$7,"x",ROW(1:1))
然后拖动/复制。