Excel VBA求助:按员工名循环复制C-F列数据到指定工作表
VBA代码修正方案
你原有代码无法满足需求的核心问题如下:
- 硬编码固定复制
RawData表的C2:F2区域,没有跟随循环到的员工行动态取对应行数据 - 粘贴位置固定为目标表C2:F2,所有数据会覆盖同一单元格区域,无法按行存储所有员工记录
- 未显式指定操作的工作表对象,依赖当前激活工作表执行逻辑,容易出现跨表操作错误
- 未提前清空目标表旧数据,无法实现覆盖所有员工历史记录的要求
修正后可直接运行的代码
Sub DiscrepFormReport() Dim cell As Range Dim targetRow As Long Dim sourceSht As Worksheet, targetSht As Worksheet Application.ScreenUpdating = False ' 绑定源表、目标表对象,避免依赖激活表导致的错误 Set sourceSht = ThisWorkbook.Sheets("RawData") Set targetSht = ThisWorkbook.Sheets("DiscrepencyForm") ' 清空目标表旧数据(保留第1行表头),实现覆盖要求 targetSht.Range("C2:F" & targetSht.Rows.Count).ClearContents targetRow = 2 ' 目标表数据写入起始行 ' 自动识别源表B列最后一条有数据的行,无需手动写死遍历范围 For Each cell In sourceSht.Range("B2:B" & sourceSht.Cells(sourceSht.Rows.Count, "B").End(xlUp).Row) If cell.Value <> "" Then ' 直接赋值替代复制粘贴,运行效率更高 targetSht.Range("C" & targetRow & ":F" & targetRow).Value = _ sourceSht.Range("C" & cell.Row & ":F" & cell.Row).Value targetRow = targetRow + 1 ' 写入行下移 End If Next cell Application.ScreenUpdating = True End Sub
关键优化点
- 遍历过程中通过循环单元格的
Row属性动态定位源表行号,准确取当前员工对应的C-F列数据 - 目标表写入行号逐行递增,所有员工记录按顺序逐行存储,不会出现覆盖问题
- 采用直接值赋值替代
Copy+PasteSpecial的写法,规避剪贴板占用问题,运行速度更快 - 自动计算源表数据最后一行位置,不需要手动固定遍历范围到B200,避免数据漏读或空行遍历
- 全程显式指定操作的工作表对象,不需要选中、激活单元格,兼容性更强
内容的提问来源于stack exchange,提问作者DaveASU
相关产品推荐
相关产品推荐

