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

VBA代码问题:如何复制错误行的A、B列至目标工作表而非错误单元格?

修正VBA代码:提取公式错误行的A、B列值到目标表

原代码问题分析

  • 取值范围错误:cell.Resize(1,2)是从错误单元格(如K85)开始取1行2列,得到的是K85:L85,而非目标的A85:B85
  • 逻辑判断冗余错误:If IsError(Range("F:F")) = False完全无效,因为rng已经筛选出F列的公式错误单元格,这个判断会导致正确的行被跳过
  • 未限定工作表:Range("F:F")未指定源工作表,可能误引用当前活动表

修正后的代码

Sub Copy_NA_Values()
    Dim rng As Range
    Dim firstBlank As Range
    Dim shtSource As Worksheet
    Dim shtDestination As Worksheet
    Dim cell As Range ' 补充声明未定义的cell变量

    Set shtSource = ThisWorkbook.Sheets("JE Royalty detail")
    Set shtDestination = ThisWorkbook.Sheets("DB")

    ' 处理F列无错误单元格的情况,避免运行时报错
    On Error Resume Next
    Set rng = shtSource.Range("F:F").SpecialCells(xlCellTypeFormulas, xlErrors)
    On Error GoTo 0

    ' 确认存在错误单元格再执行后续操作
    If Not rng Is Nothing Then
        For Each cell In rng
            ' 定位目标表K列的第一个空行
            Set firstBlank = shtDestination.Range("K" & shtDestination.Rows.Count).End(xlUp).Offset(1, 0)
            
            ' 方式1:使用复制粘贴(可选择粘贴值/格式等)
            shtSource.Cells(cell.Row, "A").Resize(1, 2).Copy
            firstBlank.PasteSpecial xlPasteValues ' 仅粘贴值,如需保留格式可删除此行直接用Copy firstBlank
            
            ' 方式2:直接赋值(效率更高,无需剪贴板)
            ' firstBlank.Resize(1, 2).Value = shtSource.Cells(cell.Row, "A").Resize(1, 2).Value
        Next cell
        Application.CutCopyMode = False ' 清除剪贴板状态
    End If
End Sub

关键修改说明

  • 明确指定取值范围:用shtSource.Cells(cell.Row, "A").Resize(1,2)定位错误行的A、B列
  • 添加错误防护:处理F列无错误单元格的场景,避免代码崩溃
  • 规范变量声明:补充cell变量声明,符合VBA编程规范
  • 提供两种取值方式:复制粘贴(支持格式保留)或直接赋值(运行更快)

内容的提问来源于stack exchange,提问作者Gonçalo Rocha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:02:03