【问题标题】:Find most frequently occuring text in range that consist of multiple rows and colums在包含多行和多列的范围内查找最常出现的文本
【发布时间】:2018-11-07 10:41:47
【问题描述】:

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

我想检索在我的范围内出现频率最高的文本。问题是该范围由多行和/或多列组成。在单行/单列的情况下,Excel公式为

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

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

但是,我想找到 Range("D2:E3") 的术语 #1。在公式中加入这个范围会产生错误。见附件。

总结一下,正确的 Excel 公式是什么,它显示了由多列和多行组成的范围中最常见的文本? 谢谢

【问题讨论】:

  • 不是一个完整的答案,但如果你只有一列文本名称,那么我认为数据透视表可以很容易地给出计数和最大计数。

标签: excel


【解决方案1】:

=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}{5;0} - 以及部分 @ 987654326@ 就是两个这样的例子)。

编辑:以上内容过于矫枉过正;我们可以简单地使用(使用 CTRL+SHIFT+ENTER):

=INDIRECT(TEXT(MIN(IF(COUNTIF(Rng,Rng)=MAX(COUNTIF(Rng,Rng)),10^5*ROW(Rng)+COLUMN(Rng))),"R0C00000"),0)

问候

【讨论】:

    【解决方案2】:

    您可以尝试使用 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
    

    在工作表中:

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多