如何用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
相关产品推荐
相关产品推荐

