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

如何用VBA实现跨工作表动态单元格引用及自动更新?

解决方案:动态构建公式实现自动更新

没问题,我来帮你搞定这个需求——既要能动态追踪「Current Billing」工作表的最后一行,又要保留Excel公式的自动更新特性,同时还能实现求和功能。核心思路是直接构建带动态行号的公式字符串,而不是把单元格的静态值赋值过去,这样当源数据变化时,Summary里的内容会自动刷新。

完整可用代码

Sub UpdateSummary()
    Dim wsBilling As Worksheet
    Dim wsSummary As Worksheet
    Dim lastRow As Long
    
    ' 初始化工作表变量(避免硬编码,更稳定)
    Set wsBilling = ThisWorkbook.Worksheets("Current Billing")
    Set wsSummary = ThisWorkbook.Worksheets("Summary")
    
    ' 获取「Current Billing」中B列的最后一行
    lastRow = wsBilling.Cells(wsBilling.Rows.Count, "B").End(xlUp).Row
    
    ' 给Summary!B1设置公式:引用Current Billing最后一行的B列单元格
    wsSummary.Range("B1").Formula = "='Current Billing'!B" & lastRow
    
    ' 给Summary!B2设置公式:求和Current Billing最后一行的E列和F列
    wsSummary.Range("B2").Formula = "=SUM('Current Billing'!E" & lastRow & ",'Current Billing'!F" & lastRow & ")"
End Sub

为什么你的之前代码会出错?

你尝试的那段报错代码,问题出在字符串拼接的语法错误:

  • VBA里字符串拼接要用&,但你把变量直接写在双引号里了,比如"= & ws5 & ! & LRowB3"这种写法是不对的;
  • 正确的做法是把固定的字符串部分和变量分开,用&连接,比如"='Current Billing'!B" & lastRow。

另外,你之前的代码是直接把单元格的值赋值给Summary的单元格(ws6.Cells(1, "B").Formula = LRowB3),这相当于把静态值写进去,自然不会自动更新——而我们直接设置公式,就和你手动在Excel里输入公式一样,源数据变了会自动计算。

额外的最佳实践

  • 始终用Set来初始化工作表变量,避免使用Activate/Select,这样代码更稳定,运行速度也更快;
  • 如果需要让这个更新自动触发(比如当「Current Billing」的数据变化时自动运行),可以把这段代码放到Worksheet_Change事件里,比如在「Current Billing」工作表的代码模块中添加:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' 只有当B/E/F列的数据变化时才更新Summary
    If Not Intersect(Target, Me.Range("B:B,E:E,F:F")) Is Nothing Then
        UpdateSummary
    End If
End Sub

这样只要源数据有变动,Summary就会自动更新啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:10