You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:01:47