You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA复制表格最后一行报错:ShowAllData方法执行失败求助

VBA代码修复:填写最后一行时ShowAllData报错及目标表空行问题

问题根源

  1. 依赖Selection导致范围异常:原代码用Selection.End(xlDown)确定复制范围,当只有最后一行有备注时,会直接定位到工作表最后一行(如第1048576行),导致复制大量空行,粘贴后目标表被无意义扩展。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:05:20