VBA自定义求和函数报错求助:如何实现指定区域累加求和
你的VBA自定义函数错误分析与修正
咱们一步步拆解你代码里的问题,再给出能满足需求的修正版本:
代码里的核心错误
zelle变量未定义且无赋值:你代码里用了zelle.Offset(0, -2),但zelle既没定义(因为开了Option Explicit,编译时肯定会报错),也没有指向任何单元格。显然你应该是想用传入的函数参数column(也就是放置这个函数的D列单元格)来定位对应的B列单元格。- 自定义函数错误地直接修改单元格:你写了
column.Value = wf.Sum(rAbove),但自定义函数的本质是返回计算结果,不是直接修改单元格值。正确的做法是把结果赋值给函数名SumAboveV,这样单元格才能显示计算后的数值。 - 不必要的工作表激活操作:
Worksheets("Sheet16").Activate在自定义函数里完全多余,还可能导致上下文混乱。自定义函数应该直接通过对象引用来操作工作表,不用依赖激活状态。 - 求和范围逻辑不符合需求:你当前的代码是取当前B列单元格的上一行到B2,这和你要的“从B2到当前函数对应B列单元格”的范围不一致,应该调整为从B2到当前行的B列单元格。
- 未指定工作表的
Cells引用:Cells(2, r.column)没有明确所属工作表,默认会用当前激活的工作表,这在多工作表场景下很容易出错,应该绑定到参数所在的工作表。
修正后的代码
Option Explicit Function SumAboveV(currentCell As Range) As Double ' 获取当前单元格所在的工作表,避免依赖激活状态 Dim ws As Worksheet Set ws = currentCell.Parent ' 定位对应的B列单元格:当前单元格向左偏移2列(D列→B列) Dim targetBRange As Range Set targetBRange = currentCell.Offset(0, -2) ' 定义求和范围:从B2到当前对应的B列单元格 Dim sumRange As Range Set sumRange = ws.Range(ws.Cells(2, targetBRange.Column), targetBRange) ' 调用工作表函数求和 Dim wf As WorksheetFunction Set wf = Application.WorksheetFunction ' 处理特殊情况:比如当前单元格在D2时,求和范围就是B2;如果范围无数值则返回0 On Error Resume Next SumAboveV = wf.Sum(sumRange) If Err.Number <> 0 Then SumAboveV = 0 End If On Error GoTo 0 End Function
使用方法
在D列的单元格中输入=SumAboveV(D2)(比如D2单元格就输入这个公式),然后下拉填充即可:
- D2会返回B2的数值
- D3会返回B2+B3的总和
- 以此类推,完全符合你“对B列从B2到当前函数对应B列单元格求和,结果放到D列对应位置”的需求。
内容的提问来源于stack exchange,提问作者fnr
相关产品推荐
相关产品推荐

