Excel for Mac运行VBA宏报错1004:该操作无法在多重选区执行如何解决
报错根本原因
你遇到的1004报错本质是Mac版Excel的兼容性问题+代码隐含的不规范写法触发的,有两个核心诱因:
- 你是先复制筛选后的不连续可见区域,再执行新建工作表操作,Mac版Excel的剪切板对多区域选中的内容支持性极差,新建工作表的操作会中断剪切板的多区域内容识别,触发多选区操作报错;
- 代码里的
Range("BB1")没有指定所属工作表,如果运行代码时当前激活的不是MTI Data工作表,会导致筛选的唯一值写入错误位置,同时x的取值异常,也会触发新建工作表名称非法报错。
修复步骤
- 调整操作顺序:先新建并重命名工作表,再执行复制粘贴操作,避免剪切板内容在操作切换时失效
- 所有Range对象明确绑定所属工作表,避免当前活动页变动导致的取值错误
- 新增工作表名称合法性校验,避免重名、带特殊字符的名称触发报错
修正后的代码
Sub SegregateData() '--按团队拆分数据并删除最后一列公式列 Dim x As Range Dim rng As Range Dim last As Long Dim sht As String Dim newSht As Worksheet Application.ScreenUpdating = False '指定数据源工作表 sht = "MTI Data" With Sheets(sht) '获取数据源最后行号 last = .Cells(.Rows.Count, "A").End(xlUp).Row Set rng = .Range("A1:Q" & last) '提取Q列唯一值到BB列,明确指定写入位置为当前工作表 .Range("Q1:Q" & last).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("BB1"), Unique:=True '遍历所有唯一值 For Each x In .Range(.Range("BB2"), .Cells(.Rows.Count, "BB").End(xlUp)) '先校验工作表是否已存在,避免重名报错 On Error Resume Next Set newSht = Sheets(x.Value) On Error GoTo 0 If Not newSht Is Nothing Then '如果工作表已存在先删除,也可以根据需求改成跳过 Application.DisplayAlerts = False newSht.Delete Application.DisplayAlerts = True End If '先新建工作表 Set newSht = Sheets.Add(After:=Sheets(Sheets.Count)) newSht.Name = x.Value '再执行筛选复制粘贴 rng.AutoFilter Field:=17, Criteria1:=x.Value rng.SpecialCells(xlCellTypeVisible).Copy Destination:=newSht.Range("A1") '删除Q列 newSht.Range("Q:Q").Delete Set newSht = Nothing Next x '关闭筛选 .AutoFilterMode = False '清空辅助列BB .Range("BB:BB").ClearContents End With '重置应用设置 With Application .CutCopyMode = False .ScreenUpdating = True End With End Sub
其他注意事项
如果修改后还是报错,可以检查Q列的唯一值是否包含/ \ ? * [ ]这些Excel工作表名称禁止的特殊字符,或者名称长度超过31个字符,调整对应名称即可。
内容的提问来源于stack exchange,提问作者AKIRA
相关产品推荐
相关产品推荐

