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
相关产品推荐
相关产品推荐

