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列匹配,有则更新、无则新增(数组高速版)
很多表格从系统导出、别人转发、复制网页内容,自带一堆隐形问题:
- 单元格前后肉眼看不见的空格
- 看不见的空白乱码、特殊字符
- 日期格式乱七八糟:文本日期、斜杠、横杠、不规范时间
- 大量重复冗余行,手工删半天
- 数据参差不齐,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开发,收藏分享不迷路















































































