Microsoft VBA Excel 单元格 重复元素 去重

问题场景

简述:

单元格显示:N/A,A54,N/A,B12,R6,A55,去掉重复的元素。

参考:excel表格同一单元格里剔除重复词怎么做?


代码描述

第一步:
在较旧的 Excel 版本中,没有直接的函数可以用来去除字符串中的重复元素。一种解决办法是使用 VBA 来创建一个自定义函数,该函数可以接受一个字符串并返回一个去除了重复项的字符串。

Function UniqueList(inputStr As String, delimiter As String) As String
    Dim dictionary As Object
    Set dictionary = CreateObject("Scripting.Dictionary")
    Dim part As Variant
    Dim parts() As String
    
    parts = Split(inputStr, delimiter)
    
    For Each part In parts
        If Trim(part) <> "" And Not dictionary.Exists(Trim(part)) Then
            dictionary.Add Trim(part), Trim(part)
        End If
    Next part
    
    UniqueList = Join(dictionary.Items, delimiter)
End Function

例如,如果想要处理单元格 A1 中的字符串 N/A,A54,N/A,B12,R6,A55,可以在另一个单元格中使用以下公式:

=UniqueList(A1, ",")

这将返回 N/A,A54,B12,R6,A55

第二步:
通过这个函数,我们得到的单元格值可能为"1,2,3"、“5,1,3”、“A33,9”,也就是会存在数字乱序、数字和字母乱序,我们想得到"1,2,3"、“1,3,5”、“9,A33”,也就是数字从小到大排列,数字排在字母前面。

首先是修改 UniqueList 函数以返回一个数组而不是字符串。然后,创建一个新的函数来对这个数组进行排序。

首先是更新后的 UniqueList 函数:

Function UniqueList(inputStr As String, delimiter As String) As Variant
    Dim dictionary As Object
    Set dictionary = CreateObject("Scripting.Dictionary")
    Dim part As Variant
    Dim parts() As String
    
    parts = Split(inputStr, delimiter)
    
    For Each part In parts
        If Trim(part) <> "" And Not dictionary.Exists(Trim(part)) Then
            dictionary.Add Trim(part), Trim(part)
        End If
    Next part
    
    UniqueList = dictionary.Items ' 返回数组而非字符串
End Function

接下来是自定义排序函数,创建一个 SortMixedData 函数来处理数字和字母的混合数组:

Function SortMixedData(arr As Variant) As String
    Dim i As Long, j As Long
    Dim temp As String
    
    ' 数字和字母分开排序
    For i = LBound(arr) To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If IsNumeric(arr(i)) And IsNumeric(arr(j)) Then
                If Val(arr(i)) > Val(arr(j)) Then
                    temp = arr(i)
                    arr(i) = arr(j)
                    arr(j) = temp
                End If
            ElseIf IsNumeric(arr(i)) And Not IsNumeric(arr(j)) Then
                ' 保持数字在字母前
            ElseIf Not IsNumeric(arr(i)) And IsNumeric(arr(j)) Then
                temp = arr(i)
                arr(i) = arr(j)
                arr(j) = temp
            ElseIf StrComp(arr(i), arr(j), vbTextCompare) > 0 Then
                temp = arr(i)
                arr(i) = arr(j)
                arr(j) = temp
            End If
        Next j
    Next i
    
    ' 将排序后的数组转换回字符串
    SortMixedData = Join(arr, ",")
End Function

在 Excel 单元格中使用这两个函数来获取排序后的唯一值列表:

=SortMixedData(UniqueList(A1, ","))
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴为您解答,可以使用VBA函数来去除Excel单元格重复的数据。首先,打开VBA编辑器,在模块中添加以下代码:Sub Remove_Dupes()Dim Lrow As Long, Dic As Object, K As VariantSet Dic = CreateObject("Scripting.Dictionary")With Sheets("Sheet1")Lrow = .Cells(Rows.Count, "A").End(xlUp).RowFor i = 2 To LrowK = .Cells(i, 1).ValueIf Not Dic.exists(K) ThenDic.Add K, NothingElse.Cells(i, 1).ClearContentsEnd IfNext iEnd WithEnd Sub然后运行该函数,即可完成去重操作。 ### 回答2: 使用VBA可以轻松地进行Excel工作表中同一单元格内容的去重操作。下面是一种实现方法: 1. 首先,打开Excel工作表,按下`ALT + F11`进入VBA编辑器。 2. 在VBA编辑器中,选择当前工作簿的VBA项目,在项目浏览器窗口中右击,选择"插入" -> "模块",在VBA项目中创建一个新的模块。 3. 在新建的模块中,输入以下代码: ```vba Sub 去重() Dim ws As Worksheet Dim rng As Range Dim cell As Range Set ws = ThisWorkbook.ActiveSheet Set rng = ws.UsedRange ' 范围可以根据具体需求修改 For Each cell In rng If cell.Value <> "" Then ' 确保单元格不为空 cell.Value = application.Trim(cell.Value) ' 去除字符串两边的空格 cell.Value = application.WorksheetFunction.Trim(cell.Value) ' 去除字符串中间的多余空格 End If Next cell rng.RemoveDuplicates Columns:=1, Header:=xlNo ' 去重操作 Set rng = Nothing Set ws = Nothing End Sub ``` 4. 运行完以上代码后,可以按下`F5`或点击运行按钮,即可执行去重操作。 以上代码实现的去重操作是针对选定的范围(在代码中的`rng`)进行的。可以根据具体需求修改范围。此外,代码中使用`Trim`函数去除字符串两边的空格,可以避免潜在的去重错误。 希望以上解答能对您有所帮助! ### 回答3: 使用VBA可以轻松将Excel中的同一单元格内容去重。下面是一种简单的方法: 1. 打开Excel并按下`ALT+F11`打开VBA编辑器。 2. 在VBA编辑器中,选择`插入`> `模块`以创建一个新模块。 3. 在新模块中输入以下代码: ``` Sub RemoveDuplicates() Dim rng As Range Dim cell As Range '选择需要去重单元格范围 Set rng = Range("A1:A10") '将"A1:A10"替换为你要去重单元格范围 '循环遍历选中的单元格范围 For Each cell In rng '使用RemoveDuplicates方法去重 cell.RemoveDuplicates Columns:=1, Header:=xlNo Next cell End Sub ``` 4. 替换代码中的范围`"A1:A10"`为你所需去重单元格范围。例如,如果要去重的是A列的所有单元格,则可以使用`"A:A"`。 5. 按下`F5`运行代码。 6. 单元格范围内的重复内容将被删除,只保留唯一值。 请记住保存你的更改并备份你的数据,以防止不必要的数据损失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值