Excel按钮宏求助:将F列值为Completed的行移至其他工作表
修正Excel宏:移动Completed行到指定工作表
错误根源
- 下标越界(Run-time error '9'):最可能是
"Main Sheet"或"Removed Items"工作表名称拼写与实际不符,或是Removed Items表为空时,Range("A1").End(xlDown)触发的范围溢出。 - 筛选列完全错误:需求是判断F列值,但原代码筛选区域为
$B$2:$AS$65336并设置Field:=40,完全偏离目标列。 - 依赖Select/ActiveSheet:这类操作极易因工作表切换出错导致异常,稳定性极差。
- 空表处理缺失:当目标表无数据时,
End(xlDown)会跳到Excel最后一行,后续Offset操作超出有效范围。
修正后的宏代码
Sub MoveCompletedRows() Dim wsMain As Worksheet Dim wsRemoved As Worksheet Dim lastRowMain As Long Dim lastRowRemoved As Long Dim filterRange As Range ' 绑定工作表(务必确保名称与Excel中完全一致) Set wsMain = ThisWorkbook.Worksheets("Main Sheet") Set wsRemoved = ThisWorkbook.Worksheets("Removed Items") ' 清除主表已有筛选 If wsMain.AutoFilterMode Then wsMain.AutoFilterMode = False ' 获取主表数据最后一行(基于A列) lastRowMain = wsMain.Cells(wsMain.Rows.Count, "A").End(xlUp).Row ' 定义筛选范围:A2到I列最后一行(匹配你的A-I列数据范围) Set filterRange = wsMain.Range("A2:I" & lastRowMain) ' 筛选F列(第6列)值为COMPLETED的行 filterRange.AutoFilter Field:=6, Criteria1:="COMPLETED" ' 处理无符合条件行的情况 On Error Resume Next filterRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy On Error GoTo 0 ' 定位目标表下一个空白行 lastRowRemoved = wsRemoved.Cells(wsRemoved.Rows.Count, "A").End(xlUp).Row ' 空表时从A2开始粘贴(避免覆盖表头) If lastRowRemoved < 2 Then lastRowRemoved = 1 ' 粘贴数据 wsRemoved.Cells(lastRowRemoved + 1, "A").PasteSpecial xlPasteAll ' 删除主表中已移动的行 Application.DisplayAlerts = False filterRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete Application.DisplayAlerts = True ' 关闭筛选 wsMain.AutoFilterMode = False ' 清理剪贴板 Application.CutCopyMode = False End Sub
核心优化点
- 稳定的工作表引用:直接通过
ThisWorkbook.Worksheets绑定工作表,彻底避免ActiveSheet的不确定性,同时强制要求工作表名称与实际一致。 - 精准筛选范围:以你实际使用的A-I列为筛选范围,F列为该区域第6列,确保筛选逻辑正确。
- 空表容错处理:判断目标表是否为空,避免
End(xlDown)导致的溢出错误。 - 移除Select操作:全程使用对象引用操作,消除人为操作或切换工作表带来的异常。
- 错误捕获:处理无符合条件行的场景,防止
SpecialCells触发额外错误。
内容的提问来源于stack exchange,提问作者user22809496
相关产品推荐
相关产品推荐

