【问题标题】:Identify Duplicates or COUNTIF > 255 characters (long text)识别重复项或 COUNTIF > 255 个字符(长文本)
【发布时间】:2018-08-04 19:17:47
【问题描述】:

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

我想对 A 列应用过滤器以选择两个键,这很好,然后我想识别 B 列中存在的任何重复项 - 仅应用于可见的字段,即结果列 A 上的过滤器。

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

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

【问题讨论】:

  • 因此,如果您在 B 列中有两个字符串值,每个长度为 550 个字符,并且具有相同的“键”,但一个以问号结尾,另一个以感叹号结尾,则它们不是重复的。但是,如果具有相同“键”的第三个相同字符串以问号结尾,则“已识别”两行。 (仍然不知道“已识别”到底是什么意思)
  • 那么用较短的字符串会成功吗?
  • B列有多少行数据?这可能是决定数组公式是否合适的一个因素?
  • 不完全是,我在 col A 中应用的过滤器将仅显示值 key1 和 key3。它是我需要突出显示重复的数据的结果子集。
  • 总共约500行

标签: excel excel-2010 conditional-formatting countif


【解决方案1】:

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

来自support.office.com
长字符串返回错误值。 当您使用 COUNTIF 函数匹配长度超过 255 个字符的字符串时,它会返回不正确的结果。

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

COUNTIFSBIGTXT function - 超过 255 个字符的标准字符串的 CountIfs 功能

将其放入公共模块代码表(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
    ' https://stackoverflow.com/questions/51688846#51689459
    '
    ' =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

Syntax:

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

Documentation

Sample data²

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

Example 1

简单的 COUNTIF 操作丢弃过滤/隐藏的行并且不区分大小写。

=COUNTIFSBIGTXT(0, B:B, B2)

Example 2

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

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


¹ 失败时逻辑流“短路”。使用多个字符串/条件对,您可以通过首先列出最不可能匹配的字符串范围/条件来提高性能
    。通过重新排序后三个“踢出”Exit For 语句以满足您的
    特殊要求,您可能会在特殊情况下看到类似的计算效率提高
    但我建议将检查工作表错误作为主要检查。
    例如,如果您有很多潜在的字符串匹配项,但可见行很少,则将可见单元格的检查
    移到字符串匹配检查上方会减少条件检查。

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

【讨论】:

  • 非常好。请问这个位是如何工作的? bIncludeHidden = CBool​​(1 And iOptions) 这是 1 的存在,这让我很困惑。
  • @QHarr,我提供的文档中至少有一半的答案。 VBA AND 运算符是按位的。给定 0、1、2、4、8,如果你提供 0 到 15 之间的数字,我可以确定其中哪些是真的。提供 9,我可以告诉你 1 和 8 是真的,其他都是假的。
  • @QHarr,考虑到 False 为零,所有不是 False 的都是真的。这在 VBA 中有效,直到您引入 AND 运算符,因为 (1 And 3) 为 True 但 (1 And 4) 为 False。发起聊天以获取更多信息。 (顺便说一句,这就是为什么我在 CBool​​(...) 中包含了很多我的标准。我被抓到多次躲避按位)
  • 出色的答案 - 感谢您为此付出的努力。效果很好。
  • 好吧,哦-key-doh-key。
【解决方案2】:

这么晚了,但如果它有助于其他人,将这个内置的解决方法发布到 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))

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2019-01-16
    • 2012-10-23
    • 1970-01-01
    • 2010-10-20
    • 2018-01-15
    • 1970-01-01
    • 2022-01-16
    • 2012-11-16
    相关资源
    最近更新 更多