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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:27:09