【问题标题】:Prevent Partial Duplicates in Excel防止 Excel 中的部分重复
【发布时间】:2015-05-11 14:01:46
【问题描述】:

我有一个包含产品的工作表,我办公室的人可以在其中添加新职位。我们遇到的问题是产品有规格,但不是每个人都输入(或输入错误)。

示例: “酷品14C”

有没有办法转换数据评估选项,以便它现在警告我,以防我输入“非常酷的产品 14B”或包含已经存在的字符串(例如,超过 4 个)的任何内容,例如“cool produKt 14C”还有“好产品15”之类的?

我知道我可以使用 COUNTIF 防止 100% 匹配,并使用 LEFT/RIGHT 以相同的方式发现开始/结束的单词,但我还需要在条目中发现部分匹配。

非常感谢!

【问题讨论】:

  • 单独使用公式是不可能的。
  • 可以使用 VBA 吗?如果是这样,我必须成为 VBA 用户的高级程度?

标签: excel duplicates multiple-entries


【解决方案1】:

如果您想涵盖拼写错误、自动换行、图形排列等。也许SOUNDEX 算法会适合您的问题。这是implementation for Excel ...

因此,如果您将其作为用户定义的函数插入,并为每个产品行创建一个列 =SOUNDEX(A1),则在输入新产品名称后,您可以过滤具有相同 SOUNDEX 值的所有产品行。您可以通过让用户首先在对话框表单中输入新名称、进行验证、向他们显示可能重复的组合框下拉菜单等来进一步自动化此操作。等等。

编辑:

一个小函数,用于查找在一个范围内以空格结尾的部分字符串(回答您的评论)

Function FindSplit(Arg As Range, LookRange As Range) As String
Dim LookFor() As String, LookCell As Range
Dim Idx As Long

    LookFor = Split(Arg)
    FindSplit = ""

    For Idx = 0 To UBound(LookFor)

        For Each LookCell In LookRange.Cells
            If InStr(1, LookCell, LookFor(Idx)) <> 0 Then
                If FindSplit <> "" Then FindSplit = FindSplit & ", "
                FindSplit = FindSplit & LookFor(Idx) & ":" & LookCell.Row
            End If
        Next LookCell
    Next Idx

    If FindSplit = "" Then FindSplit = "Cool entry!"
End Function

这有点粗略……但它的作用如下

  • 将单个单元格参数分成几部分并将其放入数组中--> split()
  • 处理每一块 --> For Idx = ...
  • 在另一个范围内搜索包含该片段的字符串 --> For Each ...
  • 将找到它的单元格的片数和行号添加到结果字符串中

您可以在每个单元格输入旁边输入/复制此公式,并立即知道您是否输入了很酷的输入。

单元格 D8 的值为 [asd:3, wer:4]

注意在查找范围开始时使用绝对寻址;这样你就可以很好地复制公式了。

2015 年 3 月 17 日编辑

进一步评论 Joanna 2015 年 3 月 17 日,如果搜索参数是您正在扫描的范围的一部分,例如=FINDSPLIT(C5; C1:C12) 如果LookCell 和LookFor(Idx) 确实是同一个单元格,您要确保If Instr(...) 不会命中,因为这会产生误报。因此,您将语句重写为

...
    ...
        If InStr(1, LookCell, LookFor(Idx)) <> 0 And _
           Not (LookCell.Row = Arg.Row And LookCell.Column = Arg.Column) _
        Then

提示

不要使用完整的列(例如 $C:$C)作为第二个参数,因为如果没有进一步的预防措施,函数会变得非常慢

【讨论】:

  • 错别字是最小的问题。我需要更多的是程序发出信号,表明输入的单词之一已经在此列中输入过。
  • @Joanna see edit ... 仅适用于字符串和子字符串 ... 没有发现拼写错误 ;-) (例如 product 与 produkt
  • 这很有帮助!谢谢,@Mike :)
  • @Joanna 很高兴...我希望这能让你开始并提供足够的灵感来开发你的梦想功能;-)
  • 这个功能就像一个魅力!我改变的一件事是产品也将被添加到两者之间,所以我有 =findsplit(C8;$C:C$) 的函数来将它与整个列进行比较。有没有办法从 $C:$C 中排除 C8?我似乎找不到正确的方法来做到这一点。我希望与此列中的所有单元格进行比较,除了我正在写的那个。
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多