夜雨聆风学习资料网

ARTICLE · 1251335

Excel-VBA数据太脏不用手改!一键全自动清洗:去空格、清乱码、统一日期、多条件去重

Excel-VBA数据太脏不用手改!一键全自动清洗:去空格、清乱码、统一日期、多条件去重
做表格最浪费时间的根本不是录入,是脏数据清洗!

很多表格从系统导出、别人转发、复制网页内容,自带一堆隐形问题:

- 单元格前后肉眼看不见的空格
- 看不见的空白乱码、特殊字符
- 日期格式乱七八糟:文本日期、斜杠、横杠、不规范时间
- 大量重复冗余行,手工删半天
- 数据参差不齐,VLOOKUP匹配不到、汇总对不上

以前我清洗一张几千行的表,最少十几分钟。
今天给大家分享数组版一键数据清洗VBA,全程内存运算、不卡顿、不卡表格。

所有脏数据问题:一键全部搞定。

一、这一个宏,能干完80%的数据清洗工作

✅ 自动去除:所有首尾空格 + 中间多余空格
✅ 清除:所有不可见乱码、隐形特殊字符
✅ 统一:全表日期格式标准化
✅ 智能:多条件组合去重(支持1列/2列/多列去重)
✅ 保留:第一条数据,删除重复冗余行
✅ 数组运行:几万行数据秒处理,不卡顿、不崩溃

真正的:导出表 → 一键变标准规范台账

二、实战演示场景

系统导出的数据常见问题:

1. 编号后面带空格,导致匹配失败
2. 名称里有隐形字符,筛选筛不出来
3. 日期有的是文本、有的是时间格式
4. 同一单号多条重复记录,需要去重

运行宏之后:
全表统一规整、干净、可直接用于汇总、匹配、台账存档。

三、完整实战VBA代码(数组高性能、无冗余、商用级别)

vba    
Sub 一键全表数据清洗_多条件去重()
    Dim arr, arrResult
    Dim dict As Object
    Dim lastRow As Long, lastCol As Long
    Dim i As Long, j As Long, resRow As Long
    Dim cleanStr As String
    Dim keyStr As String

    '====================【可自定义参数区】====================
    '去重条件列:支持单列、双列、多列去重
    Dim uniqueColArr As Variant
    uniqueColArr = Array(1, 2) '示例:A+B列组合去重

    Dim dateColArr As Variant
    dateColArr = Array(4) '需要统一日期格式的列(D列)
    '=========================================================

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = vbTextCompare

    '获取数据范围
    lastRow = ActiveSheet.UsedRange.Rows.Count
    lastCol = ActiveSheet.UsedRange.Columns.Count

    If lastRow < 2 Then
        MsgBox "表格暂无有效数据!", vbInformation
        GoTo EndSub
    End If

    '读取全表数据到数组
    arr = ActiveSheet.Range("A1").Resize(lastRow, lastCol).Value

    '初始化结果数组
    ReDim arrResult(1 To lastRow, 1 To lastCol)
    resRow = 1

    '先保留表头
    For j = 1 To lastCol
        arrResult(1, j) = arr(1, j)
    Next j
    resRow = 2

    '遍历清洗每一行数据
    For i = 2 To lastRow
        keyStr = ""

        '=========1、清洗整行:去空格、清不可见字符=========
        For j = 1 To lastCol
            If Not IsEmpty(arr(i, j)) Then
                cleanStr = CStr(arr(i, j))

                '去除首尾空格
                cleanStr = Trim(cleanStr)
                '清除所有不可见控制字符
                cleanStr = CleanAllChar(cleanStr)
                '多个空格合并为单个空格
                cleanStr = Replace(cleanStr, "  ", " ")

                arr(i, j) = cleanStr
            End If
        Next j

        '=========2、多条件拼接去重KEY=========
        For j = LBound(uniqueColArr) To UBound(uniqueColArr)
            keyStr = keyStr & "||" & arr(i, uniqueColArr(j))
        Next j

        '=========3、日期列统一标准化=========
        For j = LBound(dateColArr) To UBound(dateColArr)
            Dim dCol As Long
            dCol = dateColArr(j)
            If IsDate(arr(i, dCol)) Then
                arr(i, dCol) = Format(CDate(arr(i, dCol)), "yyyy-mm-dd")
            End If
        Next j

        '=========4、多条件去重:只保留第一条=========
        If Not dict.Exists(keyStr) Then
            dict(keyStr) = True
            '写入清洗后的数据
            For j = 1 To lastCol
                arrResult(resRow, j) = arr(i, j)
            Next j
            resRow = resRow + 1
        End If
    Next i

    '一次性回写全表
    ActiveSheet.Range("A1").Resize(lastRow, lastCol).ClearContents
    ActiveSheet.Range("A1").Resize(resRow - 1, lastCol).Value = arrResult

    MsgBox "✅数据清洗完成!" & vbCrLf & _
           "原始行数:" & lastRow - 1 & vbCrLf & _
           "清洗保留行数:" & resRow - 1, vbInformation

EndSub:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Set dict = Nothing
End Sub

'【核心清洗函数】清除所有不可见乱码、控制字符
Private Function CleanAllChar(ByVal s As String) As String
    Dim i As Long
    For i = 0 To 31
        s = Replace(s, Chr(i), "")
    Next i
    CleanAllChar = s
End Function


四、修改内容一看就懂:

全部修改只改上方【参数区】,不动底层代码

1. 修改去重条件(万能)

- 单列去重(只按A列)
 uniqueColArr = Array(1) 
- 双条件去重(A+B组合)
 uniqueColArr = Array(1,2) 
- 三条件去重(A+B+C)
 uniqueColArr = Array(1,2,3) 

2. 修改需要统一日期的列

- 只统一D列日期: dateColArr = Array(4) 
- 统一C、D、E多列日期: dateColArr = Array(3,4,5) 

3. 不想去重怎么办?

直接把条件改成永远不重复:
 uniqueColArr = Array(99) 

五、这组代码强在哪?

1. 纯数组运行,不用循环单元格,10万行不卡
2. CleanAllChar专属清洗:清除所有制表符、换行、隐形乱码
3. 多重空格压缩:避免名称中间多个空格
4. 智能日期标准化:所有乱七八糟日期统一 yyyy-mm-dd
5. 多条件精准去重,不会误删有效数据
6. 保留表头、不乱格式、不丢数据
7. 重复只留第一条,符合99%职场台账逻辑

六、真实职场适用场景

- 系统导出ERP、进销存、考勤、库存脏数据
- 别人发来的不规范表格
- 网页复制数据、台账汇总数据
- 需要VLOOKUP匹配、透视表汇总、归档报表

清洗完的数据:规整、干净、可直接交付领导!

七、总结

普通小白:
清洗表格半小时,删空格、改日期、去重、清乱码,还改错行。

会这个VBA:
一秒全自动清洗,表格直接变标准台账。
 专业vba开发,收藏分享不迷路
Excel VBA|多个文件,批量合并数据导入到当前表
VBA一键按条件自动提取数据(文员、生产统计专用)
VBA递归遍历读取多层文件夹,一键合并所有Excel(普通vba做不到)
Excel VBA 双向台账:按A列匹配,有则更新、无则新增(数组高速版)

相关学习资料