Excel VBA:knxexport表标记行A-M列去重复制到Sheet2问题咨询
功能需求
- 通过在
knxexport工作表的L列填入「X」选中对应行,仅复制选中行的A到M列内容,粘贴到Sheet2的下一个空闲行 - 空闲行判定规则:仅校验A到M列是否无内容,即使M列之后的列已有填充内容也判定为空闲行,复制操作不得覆盖M列之后的已有内容
- M列存储每行唯一ID,若对应ID已存在于Sheet2中则跳过该行不新增,允许待复制行的部分列为空值
- 源表
knxexport的行数通过永远不为空的D列判断末尾位置
现有代码问题
原有代码存在以下几个不符合需求的问题:
- 直接使用
EntireRow.Copy复制整行,会覆盖Sheet2 M列之后的已有内容 - 没有增加M列唯一ID的重复校验逻辑,会插入重复ID的数据
- 空闲行计算逻辑依赖
UsedRange,如果Sheet2 M列之后有内容会导致空闲行判断错误 - 源表末尾行获取代码错误,没有使用
End(xlUp)定位实际最后一行 - 行标色逻辑没有指定工作表,会错误修改当前激活工作表的单元格样式
调整后代码
Sub GAtoList() Dim srcSht As Worksheet, tgtSht As Worksheet Dim srcLastRow As Long, tgtLastRow As Long Dim i As Long, j As Long Dim idExists As Boolean ' 绑定工作表对象 Set srcSht = Worksheets("knxexport") Set tgtSht = Worksheets("Sheet2") ' 获取源表实际最后一行(通过非空D列判断) srcLastRow = srcSht.Range("D" & srcSht.Rows.Count).End(xlUp).Row ' 获取Sheet2 A-M列的实际最后一行,忽略M列之后的内容 On Error Resume Next tgtLastRow = tgtSht.Range("A:M").Find("*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row On Error GoTo 0 ' 处理Sheet2 A-M列全空的情况 If tgtLastRow = 0 Or (tgtLastRow = 1 And Application.WorksheetFunction.CountA(tgtSht.Range("A1:M1")) = 0) Then tgtLastRow = 0 End If Application.ScreenUpdating = False ' 遍历源表所有行校验L列选中标记 For i = 1 To srcLastRow If CStr(srcSht.Cells(i, "L").Value) = "X" Then ' 校验M列唯一ID是否已存在于Sheet2 idExists = False For j = 1 To tgtLastRow If CStr(tgtSht.Cells(j, "M").Value) = CStr(srcSht.Cells(i, "M").Value) Then idExists = True Exit For End If Next j ' ID不存在则执行复制操作 If Not idExists Then tgtLastRow = tgtLastRow + 1 ' 仅复制A-M列内容,不影响M列之后的数据 srcSht.Range("A" & i & ":M" & i).Copy Destination:=tgtSht.Range("A" & tgtLastRow) ' 源表已处理行标绿 srcSht.Rows(i).Interior.ColorIndex = 4 End If End If Next i ' 清除两表L列的选中标记X srcSht.Columns("L").ClearContents tgtSht.Columns("L").ClearContents Application.ScreenUpdating = True End Sub
内容的提问来源于stack exchange,提问作者ZacMo
相关产品推荐
相关产品推荐

