【问题标题】:Most Frequent Word In A Range, Ignoring Blanks范围内最常见的单词,忽略空格
【发布时间】:2020-09-10 00:29:20
【问题描述】:

我目前使用以下公式来查找范围内最常见的单词或数字:

=INDEX(E9:E18,MODE(MATCH(E9:E18,E9:E18,0)))

但是,如果有任何空白单元格,则公式将返回空白单元格作为模式。如何修改它以找到最常见的单词/数字而忽略任何空白单元格?

非常感谢

【问题讨论】:

标签: excel formula mode


【解决方案1】:

试试下面的用户定义函数:

Public Function MostFreq(rIn As Range) As Variant
    Dim c As Collection, r As Range, N As Long, How()
    Dim cc As Long, wf As WorksheetFunction
    Dim i As Long, Biggest As Long
    Set c = New Collection
    Set wf = Application.WorksheetFunction

    On Error Resume Next
    For Each r In rIn
        v = r.Text
        If v <> "" Then
        c.Add v, CStr(v)
        End If
    Next r

    On Error GoTo 0
    cc = c.Count
    ReDim How(1 To cc)

    For i = 1 To cc
        How(i) = wf.CountIf(rIn, c.Item(i))
    Next i
    Biggest = wf.Max(How)
    For i = 1 To cc
        If How(i) = Biggest Then
            MostFreq = c.Item(i)
        End If
    Next i
End Function

为了避免VBA,选择一个单元格(比如A1)并输入数组公式:

=INDEX(E9:E18,MODE(IF((E9:E18<>"")*ISNA(MATCH(E9:E18,$B$1:$B1,0)),MATCH(E9:E18,E9:E18,0))))

数组公式必须使用 Ctrl + Shift + Enter 而不仅仅是 Enter 键。

这是一个例子:

【讨论】:

  • 感谢您的建议。有没有办法通过常规公式而不是 VBA 来做到这一点?
  • 谢谢。我对数组公式很熟悉,尽管我试图绕过你放在一起的那个。为什么你引用了 B1,或者你只是想引用任何空白单元格?
  • 我将该因子用于“向下复制”目的。如果将公式向下复制,则可以看到频率较低的值。
  • 抱歉,我不确定你的意思。公式是否需要 B1 才能起作用?还是您需要任何空白单元格?
【解决方案2】:

我有同样的问题,但我还有一个额外的问题是需要容纳可能有 0、1 或 2 个值的范围。 this other answer to this question 中的公式以及this related question 中的所有公式都会在少于三个值时导致#N/A 错误。

但是这个公式解决了这个问题:

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

Source。消息来源说它需要作为数组公式输入 control + shift + enter,但它也适用于我的范围,都是单列。

如果范围内没有值,上面的公式在我需要空格时会产生零,所以我修改如下:

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

上面的INDIRECT 公式生成单元格引用,因此该公式在区域所在的工作表之外不起作用。如果您想在范围位于 Sheet1 中时在 Sheet2 中使用它,则必须将引用添加回范围所在的工作表:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多