VBA代码异常排查:Excel非重复行跨工作表剪切分发错误
数据分发VBA代码错误分析与修复
问题背景
需求要求将RawData工作表的原始数据按规则分发:
- 若J列值与现有工作表名称匹配,将该行移动至目标工作表的首可用行;
- J列无匹配工作表时,该行保留在RawData中;
- 同时检查目标工作表B列的唯一值,若已存在相同值,则直接删除RawData中的该行,不移动。
实际运行中出现问题:J列无匹配工作表名称的行,被错误移动到了之前匹配过的工作表中。
错误处理代码的问题
你提到的这段错误处理代码确实是问题根源:
On Error Resume Next Set targetSheet = ThisWorkbook.Worksheets(valueToMatch) On Error GoTo 0
核心问题是**targetSheet变量未在每次循环中重置**:
- 当某一行J列匹配到工作表时,
targetSheet会被赋值为该工作表的引用; - 下一行J列无匹配时,
Set targetSheet = ...会触发错误,但On Error Resume Next会跳过错误,此时targetSheet仍然保留着上一次循环的引用,不会变为Nothing; - 后续的
If Not targetSheet Is Nothing Then条件会错误成立,导致当前行被移动到上一次的目标工作表中。
修复方案
1. 重置targetSheet变量
每次循环开始时,先将targetSheet重置为Nothing,确保每次判断都基于当前行的J列值:
For i = 2 to lastRow Step 1 ' Loop through the rows valueToMatch = .Cells(i, "J").Value uniqueNumber = .Cells(i, "B").Value duplicateFound = False Set targetSheet = Nothing ' 重置变量,清除上一次的引用 On Error Resume Next Set targetSheet = ThisWorkbook.Worksheets(valueToMatch) On Error GoTo 0 ' 后续逻辑保持不变 If Not targetSheet Is Nothing Then ' ... 检查重复与移动/删除逻辑 End If Next i
2. 修正遍历方向(额外优化)
原代码从上往下遍历行,当删除某一行后,后续行的索引会自动前移,导致循环跳过下一行。建议改为从下往上遍历:
lastRow = .Cells(.Rows.Count, "J").End(xlUp).Row ' 从最后一行向上遍历,避免删除行后跳过数据 For i = lastRow To 2 Step -1 valueToMatch = .Cells(i, "J").Value uniqueNumber = .Cells(i, "B").Value duplicateFound = False Set targetSheet = Nothing On Error Resume Next Set targetSheet = ThisWorkbook.Worksheets(valueToMatch) On Error GoTo 0 If Not targetSheet Is Nothing Then ' 检查目标表B列是否存在重复值 duplicateFound = False For targetRow = 2 To targetSheet.Cells(targetSheet.Rows.Count, "B").End(xlUp).Row If targetSheet.Cells(targetRow, "B").Value = uniqueNumber Then duplicateFound = True Exit For End If Next targetRow If Not duplicateFound Then ' 移动行到目标表 .Rows(i).Copy targetSheet.Cells(targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).Row + 1, 1).PasteSpecial xlPasteValues .Rows(i).Delete Else ' 删除重复行 .Rows(i).Delete End If End If Next i
内容的提问来源于stack exchange,提问作者Vario84
相关产品推荐
相关产品推荐

