经常使用UNIQUE函数对数据进行去重的朋友是不是遇到这个问题,源数据中存在空格时,使用UNIQUE函数进行去重返回的结果存在“0”的情况。虽说使用UNIQUE函数+TOCOL函数可以忽略空值,但是嵌套函数使用起来总归有点麻烦。今天给大家分享一个VBA 自定义函数SUNIQUE,兼容所有支持宏的 Excel/WPS,任意多行多列区域自动展平一维去重,可自由选择是否保留空白单元格,结果自动纵向溢出填充,替代官方 UNIQUE 更实用。一、函数核心功能详解
1、全域兼容去重:支持单行、单列、多行多列混合单元格区域,代码自动把二维区域展平为一维数据统一去重,不用手动拼接数据;2、空值双模式切换:两种处理逻辑自由切换,默认自动过滤空白,也可选择保留空白单元格;3、智能空白识别:精准识别真空单元格、空文本""、空单元格误显示 0 三类空白场景,不会把空白当成数字 0 参与计算;4、动态溢出输出:去重结果自动纵向单列溢出填充,输入公式后下拉自动铺满结果;二、函数语法与参数说明
函数语法:
SUNIQUE (单元格区域,[模式0忽略空值1保留空值])
| | |
| | |
| 输入0\省略不写:忽略所有空白单元格,只提取有效不重复内容(日常使用推荐);输入1:保留空白单元格,最终去重列表会包含1个空白行。 | |
Function SUNIQUE(单元格区域 As Range, Optional 模式0忽略空值1保留空值 As Integer = 0) As Variant Dim dict As Object Dim cell As Range Dim arr() As Variant Dim i As Long Dim val As Variant Dim hasEmpty As Boolean ' 创建字典对象用于去重 Set dict = CreateObject("Scripting.Dictionary") ' 遍历区域中的所有单元格(展平为一维) For Each cell In 单元格区域.Cells val = cell.value ' 判断空值:包括 Empty、""、以及单元格实际为空但显示为0的情况 Dim isEmptyVal As Boolean isEmptyVal = False If IsEmpty(val) Then isEmptyVal = True ElseIf val = "" Then isEmptyVal = True ElseIf IsNumeric(val) And val = 0 Then ' 额外检查:如果单元格实际为空,Excel有时会返回0 If cell.text = "" Then isEmptyVal = True End If End If ' 根据模式处理空值 If isEmptyVal Then If 模式0忽略空值1保留空值 = 1 Then ' 模式1:保留空值,只添加一次 If Not hasEmpty Then dict.Add "__EMPTY__", "" hasEmpty = True End If End If ' 模式0:忽略空值,不做任何处理 Else ' 非空值,添加到字典(自动去重) If Not dict.Exists(CStr(val)) Then dict.Add CStr(val), val End If End If Next cell ' 如果没有结果,返回 #N/A 错误 If dict.count = 0 Then SUNIQUE = CVErr(xlErrNA) Exit Function End If ' 将字典值转移到数组(纵向排列,一列多行) ReDim arr(1 To dict.count, 1 To 1) i = 1 Dim key As Variant For Each key In dict.Keys If key = "__EMPTY__" Then arr(i, 1) = "" ' 空值返回空字符串,不是0 Else arr(i, 1) = dict(key) End If i = i + 1 Next key SUNIQUE = arr ' 清理 Set dict = NothingEnd Function
- 打开 Excel,按
Alt+F11 打开 VBA 编辑器;
日常表格数据汇总、台账整理、分类统计经常需要提取不重复值,这款SUNIQUE自定义函数解决官方去重函数版本限制、空白处理不灵活、多列数据处理麻烦三大痛点,一段代码永久复用,大幅减少辅助列、筛选操作,提升数据处理效率。