AutoFilter.Range.Copy报错:对象变量或With块变量未设置
解决AutoFilter.Range.Copy的"Object Variable or With Block Variable Not Set"错误
首先,这个错误的核心原因是当你的AutoFilter没有筛选出任何匹配数据时,AutoFilter.Range会返回Nothing,这时候尝试调用它的Copy方法自然会触发报错。另外你的代码还有几个潜在的小问题,我一起帮你排查修复:
主要问题排查与修复
- 先验证筛选结果是否存在:在调用
Copy之前,先判断是否有除表头外的可见行。可以通过捕获可见区域的方式来避免空对象调用。 - 显式声明变量类型:你的
WS1、cl等变量没有声明具体类型,虽然VBA会默认使用变体类型,但显式声明能避免很多潜在问题,也符合良好的编码习惯。 - 安全调用ShowAllData:如果当前工作表没有处于筛选状态,直接调用
.ShowAllData会报错,所以要先判断.FilterMode是否为True再执行。 - 确保CurrentRegion范围准确:
CurrentRegion会选中从A1开始的连续数据区域,要确保你的数据没有空行导致范围识别错误,否则可能影响筛选和排序的结果。
修改后的完整代码
Sub Macro_CreateNewSheet() Application.ScreenUpdating = False Dim report As Workbook Set report = ActiveWorkbook Dim NowMonth As String, Nowday As Integer NowMonth = MonthName(Month(Now), True) Nowday = Day(Now) Dim rp As Worksheet Set rp = report.Sheets.Add(After:=Worksheets(Worksheets.Count), Type:=xlWorksheet) rp.Name = NowMonth & " " & (Nowday - 6) & "-" & Nowday Dim origin As Workbook Set origin = Workbooks.Open("My Directory") ' 记得替换成你的实际文件路径 Dim StartDate As String, EndDate As String EndDate = Format(Date, "mm/dd/yy") StartDate = Format(DateAdd("d", -6, Date), "mm/dd/yy") ' 直接用Date替代EndDate,逻辑更清晰 Dim WS1 As Worksheet, cl As Worksheet Set WS1 = origin.Worksheets("ABS") Set cl = report.Worksheets("Calculation") With WS1 ' 先清除可能存在的筛选状态 If .FilterMode Then .ShowAllData ' 对数据进行排序 .Range("A1").CurrentRegion.Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes ' 应用日期范围筛选 .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=">=" & StartDate, Operator:=xlAnd, Criteria2:="<=" & EndDate ' 捕获筛选后的可见区域,处理无结果的情况 On Error Resume Next Dim filteredRange As Range Set filteredRange = .AutoFilter.Range.SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not filteredRange Is Nothing Then ' 复制筛选到目标工作表 filteredRange.Copy cl.Cells(1, 1) Else ' 无匹配数据时的提示(可选) MsgBox "没有找到符合日期范围的数据!", vbInformation End If ' 安全清除筛选 If .FilterMode Then .ShowAllData End With Application.ScreenUpdating = True End Sub
关键修改点说明
- 筛选结果检查:通过
SpecialCells(xlCellTypeVisible)获取可见区域,并用错误捕获处理无结果的场景,避免AutoFilter.Range为空时的调用错误。 - 变量类型规范:给所有变量指定了具体类型(比如
Dim WS1 As Worksheet),让代码更稳定、易读。 - 筛选状态安全处理:在排序前和操作结束后都检查
.FilterMode,确保ShowAllData只在有筛选时执行,避免额外报错。 - 日期计算优化:把
DateAdd("d", -6, EndDate)改成DateAdd("d", -6, Date),逻辑更直接,因为EndDate就是当前日期的格式化结果。
这样修改后,你的代码就能妥善处理没有筛选结果的情况,也避免了其他潜在的错误。
内容的提问来源于stack exchange,提问作者Joseph Lin
相关产品推荐
相关产品推荐

