VBA ClearContents delete两者的区别

使用了ClearContents清除单元格内容时,有时再统计单元格有内容的行数,会发现刚清除了的单元格也会列入统计之中,造成统计结果不对,而delete就不会了!

Sub CompareAndCopyData() Dim wbSource As Workbook ' Excel1工作簿 Dim wbTarget As Workbook ' Excel2工作簿 Dim wsSource As Worksheet ' Excel1的工作表 Dim wsTarget As Worksheet ' Excel2的工作表 Dim lastRowSource As Long ' Excel1的最后行 Dim lastRowTarget As Long ' Excel2的最后行 Dim sourceValue As Variant Dim targetCell As Range Dim sheetIndex As Integer Dim i As Long Dim blankRows As Range ' 新增:用于收集空白行 Dim coveredRows As Object ' 用于记录已被覆盖的行号 ' 创建字典存储已覆盖行号 Set coveredRows = CreateObject("Scripting.Dictionary") ' 设置目标工作簿工作表 Set wbTarget = ThisWorkbook ' 当前工作簿(Excel2) Set wsTarget = wbTarget.Sheets(1) ' 假设Excel2的数据在第一个Sheet Application.ScreenUpdating = False ' 关闭屏幕刷新提高性能 ' === 删除Excel2中为空白的行 === lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row + 1 ' +1处理最后一行情况 Set blankRows = Nothing ' 初始化空白行集合 ' 遍历所有行收集空白行 For i = 1 To lastRowTarget ' 检查整行是否空白:CountA统计非空单元格数 If Application.WorksheetFunction.CountA(wsTarget.Rows(i)) = 0 Then If blankRows Is Nothing Then Set blankRows = wsTarget.Rows(i) Else Set blankRows = Union(blankRows, wsTarget.Rows(i)) End If End If Next i ' 一次性删除所有空白行(高效处理) If Not blankRows Is Nothing Then blankRows.Delete ' === 删除Excel2中C列含有/NC的行 === lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).Row ' 从最后一行向上遍历(避免删除行后索引错乱) For i = lastRowTarget To 1 Step -1 ' 检查是否包含/NC(不区分大小写) If InStr(1, wsTarget.Cells(i, "C").Value, "/NC", vbTextCompare) > 0 Then wsTarget.Rows(i).Delete Shift:=xlUp ' 删除整行 End If Next i ' === 删除Excel2中A列含有_____的行 === lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row ' 从最后一行向上遍历(避免删除行后索引错乱) For i = lastRowTarget To 1 Step -1 ' 检查是否包含/NC(不区分大小写) If InStr(1, wsTarget.Cells(i, "A").Value, "_____", vbTextCompare) > 0 Then wsTarget.Rows(i).Delete Shift:=xlUp ' 删除整行 End If Next i ' === 删除Excel2中A列含有Bill Of Materials的行 === lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row ' 从最后一行向上遍历(避免删除行后索引错乱) For i = lastRowTarget To 1 Step -1 ' 检查是否包含/NC(不区分大小写) If InStr(1, wsTarget.Cells(i, "A").Value, "Bill Of Materials", vbTextCompare) > 0 Then wsTarget.Rows(i).Delete Shift:=xlUp ' 删除整行 End If Next i ' 重新获取删除后的最后一行 lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).Row ' 打开源工作簿(Excel1) Set wbSource = Workbooks.Open("C:\Users\HKWli\Desktop\副本material list 20250526-----LMY.xlsx") ' 修改为实际路径 ' 获取Excel2的C列最后一行 ' lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).Row ' 循环处理Excel1的7个Sheet For sheetIndex = 1 To 7 Set wsSource = wbSource.Sheets(sheetIndex) ' 获取当前Sheet的C列最后一行 lastRowSource = wsSource.Cells(wsSource.Rows.Count, "C").End(xlUp).Row ' 遍历Excel1当前Sheet的每一行 For i = 4 To lastRowSource sourceValue = wsSource.Cells(i, "C").Value ' 获取C列值 ' 在Excel2中查找匹配的C列值 Set targetCell = wsTarget.Range("C4:C" & lastRowTarget).Find( _ What:=sourceValue, _ LookIn:=xlValues, _ LookAt:=xlWhole) ' 如果找到匹配项 If Not targetCell Is Nothing Then Dim matchRow As Long matchRow = targetCell.Row ' 记录已覆盖行号 coveredRows(matchRow) = True ' 复制B-D列 wsSource.Range("B" & i & ":D" & i).Copy wsTarget.Range("B" & matchRow).PasteSpecial xlPasteValues ' 复制E-H列 wsSource.Range("E" & i & ":H" & i).Copy wsTarget.Range("G" & matchRow).PasteSpecial xlPasteValues End If Next i Next sheetIndex ' === 标记未被覆盖的行 === Dim rowIndex As Long For rowIndex = 4 To lastRowTarget If Not coveredRows.exists(rowIndex) Then wsTarget.Rows(rowIndex).Interior.Color = vbYellow ' 黄色填充 Else wsTarget.Rows(rowIndex).Interior.Pattern = xlNone ' 清除原有填充 End If Next rowIndex ' 清理资源 Application.ScreenUpdating = True ' 恢复屏幕刷新 Application.CutCopyMode = False wbSource.Close SaveChanges:=False Set wsSource = Nothing Set wsTarget = Nothing Set wbSource = Nothing Set wbTarget = Nothing MsgBox "数据对比与覆盖完成!" End Sub 增加一个功能,把EXCEL2中C列中相同的行的E列内容合并,F列相加(除EF列别的列内容都相同),两行合并为一行
最新发布
09-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值