VBA实现工作簿多工作表A列员工编号单表去重问题求助
解决Excel VBA循环遍历工作表去重失效的问题
我来帮你分析两段测试代码里的问题,再给出能正常运行的修正版本:
先拆解两段代码的错误点
Test1 的问题
- 语法错误:
ws.lRow.RemoveDuplicates是完全错误的写法——lRow是你定义的行号变量,必须用ws.Range("A1:A" & lRow)来指定要去重的A列范围,不能直接调用ws.lRow。 - 多余的循环:
RemoveDuplicates函数本身就能一次性处理整个范围的重复值,嵌套For iCntr = lRow To 1 Step -1逐行循环完全没必要,反而会打乱逻辑。 - 工作表引用不精准:
For Each ws In ThisWorkbook.Worksheets会遍历当前代码所在的工作簿,但你已经指定目标是wkbk1 = Workbooks("3rd Party.xlsm"),应该改成For Each ws In wkbk1.Worksheets,避免当前激活工作簿不是目标文件时出错。
Test2 的问题
- 工作表引用缺失前缀:在
With wkbk1代码块里,With Worksheets(w)没有加.,会默认引用当前激活工作簿的工作表,而非wkbk1里的,要改成With .Worksheets(w)。 - 范围选择不精准:
UsedRange.RemoveDuplicates会对整个已使用区域的第一列去重,如果工作表的UsedRange不是从A1开始,或者包含无关列,会导致去重范围错误,最好明确指定A列的有效范围。
修正后的可用代码
这里提供两种实现方式,你可以根据习惯选择:
方式一:For Each 遍历工作表
Sub deleteDuplicate() Dim ws As Worksheet Dim wkbk1 As Workbook Dim lRow As Long ' 明确指定目标工作簿 Set wkbk1 = Workbooks("3rd Party.xlsm") ' 遍历目标工作簿的所有工作表 For Each ws In wkbk1.Worksheets ' 找到A列最后一行的行号 lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row ' 对A列从表头到最后一行的范围去重 ws.Range("A1:A" & lRow).RemoveDuplicates Columns:=1, Header:=xlYes Next ws End Sub
方式二:按索引遍历工作表
Sub deleteDuplicate() Dim wkbk1 As Workbook Dim w As Long Dim lRow As Long Set wkbk1 = Workbooks("3rd Party.xlsm") With wkbk1 ' 按索引遍历每个工作表 For w = 1 To .Worksheets.Count With .Worksheets(w) lRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("A1:A" & lRow).RemoveDuplicates Columns:=1, Header:=xlYes End With Next w End With End Sub
额外注意事项
- 确保
3rd Party.xlsm已经打开,否则代码会报错。如果需要更严谨,可以在开头加判断:If Not WorkbookExists("3rd Party.xlsm") Then MsgBox "目标工作簿未打开": Exit Sub,再补充一个判断工作簿是否存在的辅助函数。 Header:=xlYes要对应每个工作表的实际情况,如果有的表没有表头,要改成Header:=xlNo。- 因为A列已经排序,
RemoveDuplicates会保留第一个出现的员工编号,删除后续重复项,符合你单表内唯一的需求。
内容的提问来源于stack exchange,提问作者TurboCoder
相关产品推荐
相关产品推荐

