我的一个朋友经常就他在Excel 中处理数据时面临的一些现实问题与我联系。
很多时候,我将他的查询转换为该站点上的Excel 教程,因为它也可能对我的其他读者有所帮助。
这也是一个这样的教程。
我的朋友上周打电话给我,提出以下问题:
Excel 中的列中有地址数据,我想识别/过滤地址中包含重复文本字符串(单词)的单元格。
这是他想要过滤其中包含重复文本字符串的单元格(带有红色箭头的单元格)的类似数据集:
现在让这变得困难的是,这些数据没有一致性。由于这是由销售代表手动创建的数据集的汇编,因此数据集中可能存在差异。
考虑一下:
- 任何文本字符串都可以在此数据集中重复。例如,它可以是地区名称或城市名称,或两者兼而有之。
- 单词之间用空格字符隔开,城市名称是在六个字之后还是八个字之后,并没有一致性。
- 有成千上万条这样的记录,需要过滤那些有任何重复文本字符串的记录。
在考虑了许多选项(例如文本到列和公式)之后,我最终决定使用VBA 来完成这项工作。
因此,我创建了一个自定义VBA 函数('IdDuplicate')来分析这些单元格,如果文本字符串中有重复的单词,则给我TRUE,如果没有重复,则给我FALSE(如下所示):
此自定义函数分析文本字符串中的每个单词并检查它在文本中出现的次数。如果计数大于1,则返回TRUE;否则返回FALSE。
此外,它被创建为仅计算超过三个字符的单词。
一旦有了TRUE/FALSE 数据,我就可以轻松过滤所有为TRUE 的记录。
现在让我向您展示如何在Excel 中执行此操作。
自定义函数的VBA 代码
这是通过在VBA 中创建自定义函数来完成的。然后,此函数可用作Excel 中的任何其他工作表函数。
这是它的VBA代码:
Function IdDuplicates(rng As Range) As String Dim StringtoAnalyze As Variant Dim i As Integer Dim j As Integer Const minWordLen As Integer = 4 StringtoAnalyze = Split(UCase(rng.Value), " ") For i = UBound(StringtoAnalyze) To 0 Step -1 If Len(StringtoAnalyze(i)) < minWordLen Then GoTo SkipA For j = 0 To i - 1 If StringtoAnalyze(j) = StringtoAnalyze(i) Then IdDuplicates = "TRUE" GoTo SkipB End If Next j SkipA: Next i IdDuplicates = "FALSE" SkipB: End Function
如何使用此VBA 代码
现在您有了VBA 代码,您需要将它放在Excel 的后端,以便它可以作为常规工作表函数工作。
以下是将VBA 代码放在后端的步骤:
- 转到开发人员选项卡。
- 单击Visual Basic(您也可以使用键盘快捷键ALT + F11)
- 在打开的VB 编辑器后端中,右键单击任何工作簿对象。
- 转到“插入”并单击“模块”。这将插入工作簿的模块对象。
- 在模块代码窗口中,复制并粘贴上面提到的VBA 代码。
一旦您在后端获得了VBA 代码,您就可以将函数– 'IdDuplicates' 用作任何其他常规工作表函数。
此函数采用一个参数,即您拥有文本的单元格的单元格引用。
该函数的结果是TRUE(如果其中有重复的单词)或FALSE(如果没有重复)。一旦你有了这个TRUE/FALSE 列表,你可以过滤那些带有TRUE 的列表,以获取其中包含重复文本字符串的所有单元格。
注意:我创建的代码只是为了考虑那些长度超过三个字符的单词。这可确保如果文本字符串中有1、2 或3 个字符长的单词(例如12 A、KGM 或LDA),则在计算重复项时会忽略这些单词。如果需要,您可以在代码中轻松更改此设置。
此功能仅在您复制模块中代码的工作簿中可用。如果您希望此代码在其他工作簿中也可用,则需要将此代码复制并粘贴到这些工作簿中。或者,您也可以创建一个加载项(启用这将使该功能在您系统上的所有工作簿中都可用)。
另外,请记住将此工作簿保存为.xlsm 扩展名(因为其中包含宏代码)。