Excel宏报错求助:高级筛选提取唯一值后复制至新工作表失败
解决AdvancedFilter宏停止运行的问题
看起来你的宏在AdvancedFilter这行卡壳,大概率是目标区域没有指定正确的工作表导致的,我帮你拆解问题并修正代码:
核心问题:CopyToRange未绑定工作表
你的代码里CopyToRange:=Range("CA1")没有指定是哪个工作表的CA1单元格,VBA默认会用当前活动工作表,但你要操作的是名为"data"的工作表,这就导致AdvancedFilter找不到正确的目标位置,直接报错停止。
次要问题:行号计算不匹配
你用last = Sheets(sht).Cells(Rows.Count, "B").End(xlUp).Row取B列的最后一行,但你筛选的是A列,如果A列的行数和B列不一致,会导致筛选范围出错,应该改成取A列的最后一行。
优化与防护:避免Select + 处理重名工作表
原代码里用了很多Select和ActiveSheet,这很容易因为工作表切换出问题;另外如果A列有重复的唯一值(虽然AdvancedFilter会去重,但如果手动新增过同名工作表),新增工作表时会报错,需要加个判断。
修正后的完整代码
Private Sub CommandButton3_Click() Application.ScreenUpdating = False Dim x As Range Dim rng As Range Dim last As Long Dim sht As String Dim targetSht As Worksheet Dim uniqueRange As Range '指定存储数据的工作表名称 sht = "data" Set targetSht = ThisWorkbook.Sheets(sht) '取A列的最后一行(因为筛选的是A列) last = targetSht.Cells(Rows.Count, "A").End(xlUp).Row Set rng = targetSht.Range("A1:AY" & last) '设置数据范围 '关键修改:指定CopyToRange属于targetSht(data表) targetSht.Range("A1:A" & last).AdvancedFilter Action:=xlFilterCopy, _ CopyToRange:=targetSht.Range("CA1"), Unique:=True '遍历去重后的A列值(注意指定工作表) Set uniqueRange = targetSht.Range(targetSht.Range("CA2"), targetSht.Cells(Rows.Count, "CA").End(xlUp)) For Each x In uniqueRange '先判断是否已有同名工作表,避免报错 On Error Resume Next Dim newSht As Worksheet Set newSht = ThisWorkbook.Sheets(x.Value) If Err.Number <> 0 Then '没有同名表则新建 Set newSht = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) newSht.Name = x.Value End If On Error GoTo 0 '筛选并复制,避免使用Select rng.AutoFilter Field:=1, Criteria1:=x.Value rng.SpecialCells(xlCellTypeVisible).Copy Destination:=newSht.Range("A1") newSht.Columns("A:A").ColumnWidth = 15 '清除筛选 targetSht.AutoFilterMode = False Next x '清理临时的CA列数据(可选,根据需求保留) targetSht.Range("CA:CA").ClearContents With Application .CutCopyMode = False .ScreenUpdating = True End With End Sub
关键修改说明
- 把
Range("CA1")改成targetSht.Range("CA1"),明确指定目标区域在data工作表,这是解决宏停止的核心 - 用
targetSht变量绑定data表,避免重复写Sheets(sht),提升可读性和稳定性 - 行号
last改为取A列的最后一行,确保筛选范围和操作列匹配 - 新增了工作表重名判断,防止宏因为同名表崩溃
- 去掉了所有
Select和ActiveSheet操作,直接用对象引用,更可靠 - 可选清理临时的CA列数据(如果不需要保留去重后的结果)
内容的提问来源于stack exchange,提问作者txw
相关产品推荐
相关产品推荐

