查找包含多行和多列的范围内最频繁出现的文本

时间:2018-11-07 10:41:47

标签: excel

我的问题与以下主题密切相关:

我想检索在我的范围内最频繁出现的文本。问题在于该范围由多个行和/或列组成。对于单行/单列,Excel公式为

=INDEX(D2:D9,MODE(MATCH(D2:D9,D2:D9,0)))

我知道这个公式是正确的,因为我在单元格N2中得到“ Inter”作为输出。如果我想要最常用的 Range(“ D2:D9”) ,这确实是正确的输出。

enter image description here

但是,我想找到 Range(“ D2:E3”)的术语#1。在公式中包含此范围会产生错误。请参阅附件。

enter image description here

总结一下,正确的Excel公式是什么,该公式显示出由多个列和行组成的区域中最频繁出现的文本? 谢谢

2 个答案:

答案 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

工作表中