2017-04-30 43 views
-4

我想创建范围内所有“x”字符串出现的列表。这是我的表:查找范围中所有确切字符串的出现次数并列出它

enter image description here

我要搜索所有出现,并列出他们,并给予适当的名称: 例如,对于G2,我想“灰色贝雷帽”的字符串作为结果。我认为我需要使用数组公式或类似的东西。

+1

如果您正在使用[谷歌表(按照下面的评论),那么为什么地球上,你会标记这个问题[EXCEL]和[Excel的公式]没有提到实际的平台,你是工作?不要把垃圾扔到墙上看看有什么棒。轻微投票,轻微投票。 – Jeeped

+0

但是我认为excel和谷歌表真的非常相似,但现在我发现我错了... – Jackenmen

回答

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"))),"") 

enter image description here

您将需要扩大范围到你所需要的。将所有$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)) 

并拖动/复制下来。

enter image description here

+0

你好,你能告诉我有没有其他方法可以忽略错误值而不是像你这样的AGGREGATE公式做?因为我正在做这些在谷歌床单上的所有内容,并且AGGREGATE公式不存在:/或者您知道如何将您的VBA转换为GAS(Google Appscript)? – Jackenmen

+1

这不是你问的。这已经回答了你问的问题。如果你想要一个新的/不同的答案,问一个新的/不同的问题。 @Jackenmen –

+0

好吧,只是想知道,如果你知道如何做到这一点:) – Jackenmen

相关问题