基于单元格值跨工作表复制数据的Excel VBA需求及问题
修正VBA代码实现需求逻辑
原代码的核心问题是目标行的计算逻辑错误:用i - 638定位Report的A列行号,会导致符合条件的行之间出现空行(当WIP表N列存在不满足条件的行时),且无法保证从A3开始连续填充数据。
场景1:每次运行清空旧数据,从A3重新写入
Sub CopyWIPToReport() Dim wip As Worksheet, report As Worksheet Dim lastRowWIP As Long, reportRow As Long Dim i As Long ' 指定目标工作表 Set wip = ThisWorkbook.Sheets("WIP") Set report = ThisWorkbook.Sheets("Report") ' 获取WIP表N列最后一行行号 lastRowWIP = wip.Cells(wip.Rows.Count, "N").End(xlUp).Row ' 初始化Report的写入起始行(A3) reportRow = 3 ' 清空Report中A3及以下的旧数据(按需保留) report.Range("A" & reportRow & ":A" & report.Cells(report.Rows.Count, "A").End(xlUp).Row).ClearContents ' 遍历WIP表N列641行至最后一行 For i = 641 To lastRowWIP ' 判断N列单元格是否为需求指定的"text" If wip.Cells(i, "N").Value = "text" Then ' 复制对应A列值到Report的当前行 report.Cells(reportRow, "A").Value = wip.Cells(i, "A").Value ' 移动到下一个写入行 reportRow = reportRow + 1 End If Next i ' 释放对象资源 Set wip = Nothing Set report = Nothing End Sub
场景2:追加数据到现有内容末尾(不清空旧数据)
如果需要保留Report中已有的数据,新数据从A列最后一行的下一行开始写入,只需修改reportRow的初始化逻辑:
' 找到Report表A列最后一行,下一行作为起始写入行 reportRow = report.Cells(report.Rows.Count, "A").End(xlUp).Row + 1 ' 若A列无数据(首次运行),则从A3开始 If reportRow < 3 Then reportRow = 3
关键修正说明
- 新增
reportRow变量专门跟踪写入位置,确保符合条件的数据连续填充,不会出现空行。 - 明确使用
ThisWorkbook限定工作表所属工作簿,避免引用错误。 - 修正了条件判断的文本:原代码写的是
"test",需与需求的"text"保持一致。 - 可选择清空旧数据或追加数据,适配不同使用场景。
内容的提问来源于stack exchange,提问作者user9396610
相关产品推荐
相关产品推荐

