为何VBA过程仅在指定工作表运行?动态范围报错求助
VBA运行时错误'1004'排查与修复
问题根源
你遇到的运行时错误'1004',核心原因是未明确指定Cells对象所属的工作表:
- 在标准模块中,
Cells默认指向当前活动工作表,而非你要操作的wsPOMOC。当执行wsPOMOC.Range(Cells(3, 1), Cells(ilewierszy + 2, 1))时,相当于试图用活动工作表的单元格去定义wsPOMOC的范围,两个工作表不匹配就会触发错误。 - 而在
wsPOMOC的工作表模块中,Cells默认归属该工作表,所以代码能正常运行。
修复方案
给所有Cells对象加上wsPOMOC.前缀,明确指定其归属的工作表;同时修正代码中屏幕更新的收尾错误:
Sub FilrtrowanieUnikatowychDanych() Application.ScreenUpdating = False Dim wyraz As Range Dim Ciagpolaczony As String Dim ilewierszy As Integer Dim zakres As Range wsPOMOC.Range("A3").CurrentRegion.Clear Arkusz1.Range("Tabela1").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Arkusz1.Range("Tabela1[Kolumna1]"), CopyToRange:= _ wsPOMOC.Range("A3"), Unique:=True ilewierszy = wsPOMOC.Range("A3").CurrentRegion.Rows.Count ' 明确指定Cells属于wsPOMOC工作表 Set zakres = wsPOMOC.Range(wsPOMOC.Cells(3, 1), wsPOMOC.Cells(ilewierszy + 2, 1)) Arkusz1.Range("B3").Clear For Each wyraz In zakres Ciagpolaczony = Ciagpolaczony & wyraz & ",!" Next wyraz Arkusz1.Range("B3").Value = "!" & Trim(Ciagpolaczony) ' 恢复屏幕更新(原代码此处错误设置为False) Application.ScreenUpdating = True End Sub
额外优化建议
可以直接用CurrentRegion获取完整的筛选结果范围,避免手动计算行数,让代码更简洁可靠:
' 替换原有的行数计算和范围定义代码 Set zakres = wsPOMOC.Range("A3").CurrentRegion ' 如果不需要包含表头,可调整为: ' Set zakres = wsPOMOC.Range("A3").CurrentRegion.Offset(1).Resize(wsPOMOC.Range("A3").CurrentRegion.Rows.Count - 1)
内容的提问来源于stack exchange,提问作者Grzegorz
相关产品推荐
相关产品推荐

