识别重复项或 COUNTIF > 255 个字符(长文本)

Identify Duplicates or COUNTIF > 255 characters (long text)

我有一个奇怪的问题,我有一个包含两列的 excel 文档,A 列包含键,这不是唯一的,B 列包含不同长度的文本,通常超过 255 个字符。

我想将过滤器应用到 A 列到 select 两个键,这很好,然后我想识别 B 列中存在的任何重复项 - 仅适用于以下字段可见,即作为 A 列过滤器的结果。

这应该很简单;但是,条件格式无法识别重复项,我猜是因为它不喜欢文本的长度。

即使尝试这种 mandrolic 方式也会失败,因为搜索框似乎只能接受特定长度的搜索字符串。

COUNTIF function 的字符串条件限制为 255 个字符。

From support.office.com
Wrong value returned for long strings.      The COUNTIF function returns incorrect results when you use it to match strings longer than 255 characters.

support.office.com 在 COUNTIF 支持页面上提供了一个变通解决方案,但我无法让它工作,所以我编写了一个可以工作的用户定义函数并添加了 hidden/visible 和区分大小写的选项。

- 针对超过 255 个字符的标准字符串的 CountIfs 功能

将其放入 public 模块代码 sheet (alt+F11, Insert, Module)。

Option Explicit

Function COUNTIFSBIGTXT(iOptions As Long, ParamArray pairs()) As Long
    'COUNTIFSBIGTXT - CountIfs functionality for criteria strings longer than 255 characters
    ' 
    '
    ' =COUNTIFSBIGTXT(<options>, <string_range1>, <criteria1>, [string_range2], [criteria2], …)
    '        OPTIONS
    '      0 No options
    '     +1 Include hidden cells in <string_range1>, [string_range2], etc
    '     +2 Case sensitive comparison

    'throw error if string_range and criteria do not come in pairs
    If Not CBool(UBound(pairs) Mod 2) Then
        COUNTIFSBIGTXT = CVErr(xlErrValue)
        Exit Function
    End If

    'declare variables
    Dim i As Long, j As Long
    Dim bIncludeHidden As Boolean, bCaseSensitive As Boolean

    'set optional booleans
    bIncludeHidden = CBool(1 And iOptions)
    bCaseSensitive = CBool(2 And iOptions)

    'restrict full column references to the parent worksheet's UsedRange
    Set pairs(LBound(pairs)) = Intersect(pairs(LBound(pairs)), pairs(LBound(pairs)).Parent.UsedRange)

    'resize all <string_range> to the same dimensions
    With pairs(LBound(pairs))
        For i = LBound(pairs) + 2 To UBound(pairs) Step 2
            Set pairs(i) = pairs(i).Resize(.Rows.Count, .Columns.Count)
            'Debug.Print pairs(i).Address(0, 0)
        Next i
    End With

    'loop cell count in pairs(LBound(pairs)) for relative ordinal
    For i = 1 To pairs(LBound(pairs)).Cells.Count
        'loop through each pair of <string_range> and <criteria>
        For j = LBound(pairs) To UBound(pairs) Step 2
            'exit for if any argument pair does not meet criteria
            With pairs(j).Cells(i)
                'throw out worksheet error codes
                If IsError(.Value) Then Exit For
                'do the pair(s) meet a case insensitive match
                If LCase(.Value2) <> LCase(pairs(j + 1)) Then Exit For
                'do the pair(s) meet a case sensitive match with option
                If .Value2 <> pairs(j + 1) And LCase(.Value2) = LCase(pairs(j + 1)) And bCaseSensitive Then Exit For
                'are the cells visible or hidden with include option
                If (.EntireRow.Hidden Or .EntireColumn.Hidden) And Not bIncludeHidden Then Exit For
            End With
        Next j

        'determine if all argument pairs matched
        If j > UBound(pairs) Then _
            COUNTIFSBIGTXT = COUNTIFSBIGTXT + 1
    Next i

End Function

=COUNTIFSBIGTXT(<options>, <string_range1>, <criteria1>, [optional string_range2], [optional criteria2], …)

²

以下示例基于 9 行相同的 600 个字符串,其中三行强制为大写。

Example 1

简单的 COUNTIF 运算丢弃 filtered/hidden 行且不区分大小写。

=COUNTIFSBIGTXT(0, B:B, B2)

Example 2

扩展 COUNTIFS¹ 操作丢弃 filtered/hidden 行但区分大小写的字符串比较。 A:A 的次要条件等于 A2 中的值。

=COUNTIFSBIGTXT(2, B:B, B2, A:A, A2)


¹ 逻辑流程 'short-circuits' 失败。对于多个 string/criteria 对,您可以通过首先列出最不可能的 string_range/criteria 匹配来提高性能
。通过重新排序后三个 'kick-out' Exit For 语句,您可能会看到类似的计算
效率在特殊情况下的提高
特定要求,但我建议保留工作检查sheet 错误作为主要检查。
例如,如果您有很多潜在的字符串匹配但可见行很少,将可见单元格的检查
移动到字符串匹配检查上方会减少关于标准检查。

² 非常感谢 Lorem Ipsum Generator 提供示例字符串内容。

来晚了,但如果对其他人有帮助,请将此内置解决方法发布到 countif 限制为 255 个字符。您可以使用此替换选项搜索 REF_TO_CELL_WITH_VALUE 中给出的特定文本字符串并搜索 REF_TO_YOUR_LIST 中引用的列表。它的工作原理是尝试替换列表中每个项目中的文本字符串实例和

=SUMPRODUCT((LEN(REF_TO_YOUR_LIST)-LEN(SUBSTITUTE(REF_TO_YOUR_LIST,REF_TO_CELL_WITH_VALUE,"")))/LEN(REF_TO_CELL_WITH_VALUE))