VBA复制表格最后一行报错:ShowAllData方法执行失败求助
VBA代码修复:填写最后一行时ShowAllData报错及目标表空行问题
问题根源
- 依赖
Selection导致范围异常:原代码用Selection.End(xlDown)确定复制范围,当只有最后一行有备注时,会直接定位到工作表最后一行(如第1048576行),导致复制大量空行,粘贴后目标表被无意义扩展。 ShowAllData无筛选状态时报错:清空备注列后,筛选条件"<>"没有匹配行,AutoFilter可能自动取消筛选,此时调用ShowAllData会触发错误。
修复后的代码
Dim ws1 As Worksheet Dim ws2 As Worksheet Dim filteredRange As Range Dim lastRow As Long Set ws1 = Worksheets("Comments_database") Set ws2 = Worksheets("PO'sDailyMonitor") Application.ScreenUpdating = False ' 获取ws2中有数据的最后一行(避免定位到工作表末尾) lastRow = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row ' 应用筛选:第16列(P列)非空 ws2.Range("P9").AutoFilter Field:=16, Criteria1:="<>" On Error Resume Next ' 获取筛选后的可见数据范围(A10到Q列最后一行) Set filteredRange = ws2.Range("A10:Q" & lastRow).SpecialCells(xlCellTypeVisible) On Error GoTo 0 ' 仅当存在可见行时才复制粘贴 If Not filteredRange Is Nothing Then filteredRange.Copy ws1.Range("A" & ws1.Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues End If Application.CutCopyMode = False ' 先检查是否处于筛选状态,再执行ShowAllData If ws2.AutoFilterMode Then ws2.ShowAllData End If ' 清空备注列时仅清空有数据的行,而非固定范围 ws2.Range("P10:P" & lastRow).ClearContents Application.ScreenUpdating = True MsgBox "Database updated"
关键修改说明
- 明确数据范围:用
lastRow获取实际有数据的最后一行,避免复制空行。 - 安全获取筛选范围:用
On Error Resume Next处理无可见行的情况,防止代码崩溃。 - 筛选状态判断:执行
ShowAllData前先检查AutoFilterMode,避免无筛选时触发错误。 - 精准清空备注:仅清空有数据行的备注列,减少不必要的操作。
内容的提问来源于stack exchange,提问作者Hubert S
相关产品推荐
相关产品推荐

