ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VBA 数据清洗:从 ERP、CRM、网页后台导出的 Excel,一招删除空行、去重、格式统一

VBA 数据清洗:从 ERP、CRM、网页后台导出的 Excel,一招删除空行、去重、格式统一 VBA 数据清洗删除空行、去重、格式统一适用Excel 2016 / 2019 / 2021 / Microsoft 365 / WPSVBA 通用核心删空行 去重 去空格/文本转数值 一键把从系统导出的脏表整理成干净表痛点从系统导出的数据真的是惨不忍睹做报表的都懂从 ERP、CRM、网页后台导出的 Excel永远带着一堆惊喜——中间夹杂几十行完全空白的行同一笔数据因为反复导出了重复行数字前面有看不见的空格导致 VLOOKUP 对不上明明是数字存成了文本求和全是 0日期格式五花八门2026.8.12026/8/108-01混在一起。手动一条条删、一个个改5000 行能改到眼瞎。其实用 VBA 写一个小清洗宏点一下10 秒把脏表变干净。这一步也是前面几篇发邮件、生成合同的前置——数据源不干净后面全白搭。效果预览清洗前节选清洗后空行没了、重复行第 2 个张三删了、工资列的空格和文本格式都统一成纯数字。可以直接拿去做 VLOOKUP 和求和。核心思路删空行从下往上遍历整行CountA0就删除必须倒着删否则会漏。去重用RemoveDuplicates以指定列为依据保留首次出现的行。格式统一逐格Trim去首尾空格如果是文本型数字用Val转成真数值。完整代码放进一个.xlsm模块的普通过程即可Alt F11→ 插入 → 模块。运行前先点中你要清洗的工作表。Option Explicit 一键清洗当前工作表删空行 去重 格式统一 Sub CleanSheet() Dim ws As Worksheet Dim lastRow As Long, lastCol As Long Set ws ActiveSheet lastRow ws.Cells(ws.Rows.Count, 1).End(xlUp).Row If lastRow 2 Then MsgBox 没有数据可清洗。, vbExclamation Exit Sub End If lastCol ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column Application.ScreenUpdating False ① 删除完全为空的行从下往上删避免漏删 Dim i As Long For i lastRow To 1 Step -1 If Application.WorksheetFunction.CountA(ws.Rows(i)) 0 Then ws.Rows(i).Delete End If Next i 重新计算行数删除后变了 lastRow ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ② 去重以第 1 列为依据有表头 ws.Range(A1).Resize(lastRow, lastCol).RemoveDuplicates _ Columns:1, Header:xlYes ③ 格式统一去首尾空格 文本数字转数值 Dim r As Long, c As Range For r 2 To lastRow For Each c In ws.Range(A r).Resize(1, lastCol) If Len(Trim(c.Value)) 0 Then c.Value Trim(c.Value) 去掉首尾空格 If IsNumeric(c.Value) Then 文本型数字 → 真数值 c.Value Val(c.Value) c.NumberFormat General End If End If Next c Next r Application.ScreenUpdating True MsgBox 清洗完成空行已删、重复已去、格式已统一。, vbInformation End Sub逐段看懂代码段作用Set ws ActiveSheet对当前选中的工作表操作灵活不写死表名。For i lastRow To 1 Step -1倒序遍历正序删行会跳过下一行倒序才稳妥。CountA(ws.Rows(i)) 0整行一个非空单元格都没有才算空行。RemoveDuplicates Columns:1以第 1 列值为准去重多列判重用Array(1,2)。Trim(c.Value)去掉单元格首尾空格中间空格不去。Val(c.Value)把文本型数字转成可计算的真数值。Application.ScreenUpdating关掉屏幕刷新几千行清洗不卡顿结束再打开。进阶多列去重、批量处理、日期统一多列同时判重只有当第 1 列和第 2 列都相同才算重复传数组即可ws.Range(A1).Resize(lastRow, lastCol).RemoveDuplicates _ Columns:Array(1, 2), Header:xlYes批量清洗工作簿里所有表把清洗逻辑包进一个循环Dim sh As Worksheet For Each sh In ThisWorkbook.Worksheets 把上面的清洗代码对 sh 执行一遍 注意把代码里的 ws 改成 sh Next sh日期文本统一如果日期被存成 “2026.8.1” 这种文本先替换点号为斜杠再转日期If InStr(c.Value, .) 0 Then c.Value Replace(c.Value, ., /) c.Value CDate(c.Value) c.NumberFormat yyyy-mm-dd End If常见坑表坑现象解决用 SpecialCells 删空行SpecialCells(xlCellTypeBlanks).EntireRow.Delete会误删只有部分空格的行改用CountA0判整行空从下往上删。正序删行删完一行后面的行上移下一行被跳过漏删务必For i lastRow To 1 Step -1。去重只判一列两行第1列不同但其他列全同没被去重多列判重用Array(1, 2, ...)。前导零丢失工号00123被 Val 成 123工号/编码类列别转数值保留文本可加判断跳过。中间双空格Trim只去首尾中间多个空格还在用Application.WorksheetFunction.Clean或替换处理。忘了恢复刷新屏幕卡住不动确保结尾ScreenUpdating True。小结数据清洗是 Excel 自动化的地基删空行、去重、格式统一这三板斧几乎出现在每一个真实项目里。把它做成一键宏之后前面第 7 篇生成合同、第 8 篇发邮件的数据源就能稳稳接上。下一篇预告《VBA 自动合并多个工作簿把散落各处的文件一键汇成总表》。
返回列表