我的问题与以下主题密切相关:
我想检索在我的范围内最频繁出现的文本。问题在于该范围由多个行和/或列组成。对于单行/单列,Excel公式为
=INDEX(D2:D9,MODE(MATCH(D2:D9,D2:D9,0)))
我知道这个公式是正确的,因为我在单元格N2中得到“ Inter”作为输出。如果我想要最常用的 Range(“ D2:D9”) ,这确实是正确的输出。
但是,我想找到 Range(“ D2:E3”)的术语#1。在公式中包含此范围会产生错误。请参阅附件。
总结一下,正确的Excel公式是什么,该公式显示出由多个列和行组成的区域中最频繁出现的文本? 谢谢
答案 0 :(得分:3)
=INDIRECT(TEXT(MMULT(CHOOSE({1,2},ROW(MyRange),COLUMN(MyRange))+MOD(ROUNDUP(MATCH(1,0/FREQUENCY(0,1/(1+COUNTIF(MyRange,MyRange))))/COLUMNS(MyRange)^{1,0},0)-1,COLUMNS(MyRange)*ROWS(MyRange)^{1,0}),10^{5;0}),"R0C00000"),0)
根据需要替换MyRange
。
请注意,如果您未使用英语版本的Excel,则上述部分内容可能需要修改(数组常量中的分隔符-{1,2}
,{1,0}
和{{1} }-{5;0}
部分就是两个这样的示例。
编辑:以上内容为过大;我们可以简单地使用它(通过CTRL + SHIFT + ENTER):
"R0C00000"
致谢
答案 1 :(得分:1)
您可以尝试使用UDF。这将返回单个值或逗号分隔的列表,具体取决于有多少关系。如果需要,我可以更新2列以上。
Option Explicit
Public Sub Test()
Dim rng As Range
Set rng = [D2:E7]
Debug.Print MaxRepeating(rng)
End Sub
Public Function MaxRepeating(ByVal rng As Range) As String
Dim arr(), outputArr(), i As Long, counter As Long, dict As Object, maxValue As Long
Set dict = CreateObject("Scripting.Dictionary")
counter = 1
arr = rng.Value
ReDim outputArr(1 To UBound(arr, 1) + UBound(arr, 2))
For i = LBound(arr, 1) To UBound(arr, 1)
dict(arr(i, 1)) = dict(arr(i, 1)) + 1
dict(arr(i, 2)) = dict(arr(i, 2)) + 1
Next
For i = LBound(arr, 1) To UBound(arr, 1)
If dict(arr(i, 1)) > maxValue Then maxValue = dict(arr(i, 1))
If dict(arr(i, 2)) > maxValue Then maxValue = dict(arr(i, 2))
Next
For i = LBound(arr, 1) To UBound(arr, 1)
If dict(arr(i, 1)) = maxValue Then
If IsError(Application.Match(arr(i, 1), outputArr, 0)) Then
outputArr(counter) = arr(i, 1)
counter = counter + 1
End If
End If
If dict(arr(i, 2)) = maxValue Then
If IsError(Application.Match(arr(i, 2), outputArr, 0)) Then
outputArr(counter) = arr(i, 2)
counter = counter + 1
End If
End If
Next
ReDim Preserve outputArr(1 To counter - 1)
Select Case UBound(outputArr)
Case 1
MaxRepeating = outputArr(1)
Case Else
MaxRepeating = Join(outputArr, ",")
End Select
End Function
工作表中: