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

基于另一工作表数据将VBA公式填充至最后一行(不含表头)

问题分析与代码修正

问题根源

现有代码的核心问题是目标填充行计算错误:

  • Sheet2含表头共88行,有效数据行数为88-1=87
  • 代码直接用Sheet2的最后行号(88)作为Sheet1的填充结束行,导致Sheet1仅填充到第88行,数据行仅为88-4+1=85行,和需求的87行差2行
  • 同时存在变量定义错误(LastRow定义为String却未正确使用)、依赖Select/ActiveCell的不规范写法

修正后的代码

Sub AmendRows()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim ws2LastRow As Long, targetLastRow As Long
    
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    ' 绑定工作表对象(避免依赖选中状态,提升稳定性)
    Set ws1 = ThisWorkbook.Worksheets("Sheet1") ' 替换为你的Sheet1实际名称
    Set ws2 = ThisWorkbook.Worksheets("Sheet2") ' 替换为你的Sheet2实际名称
    
    Locktabs False
    
    ' 获取Sheet2最后行号,计算Sheet1需要填充到的目标行号
    ws2LastRow = ws2.Range("A" & ws2.Rows.Count).End(xlUp).Row
    targetLastRow = 3 + (ws2LastRow - 1) ' 3行表头 + Sheet2有效数据行数(排除表头)
    
    ' 清理Sheet1旧数据并填充公式
    With ws1
        .Rows("4:" & .Rows.Count).ClearContents
        .Rows("4:" & .Rows.Count).ClearFormats
        .Range("A4:V4").AutoFill Destination:=.Range("A4:V" & targetLastRow)
    End With
    
    Locktabs True
    
    ' ThisWorkbook.Worksheets("worksheetmain").Select ' 替换为你的主表实际名称
    MsgBox "Rows Amended!"
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

关键修正点

  • 目标行精准计算:用3 + (ws2LastRow - 1)直接得出Sheet1的最终填充结束行,确保3行表头+87行数据,总行数达到90行
  • 移除冗余操作:删除没用的LastRow变量和Select/ActiveCell操作,直接通过工作表对象操作,避免状态依赖错误
  • 变量类型修正:用Long存储行号(行号为数值类型,String会引发潜在计算错误)
  • 清理范围优化:直接清理第4行及以下的所有内容,确保旧数据完全被覆盖

内容的提问来源于stack exchange,提问作者Mabel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:40:27