Excel动态范围累积求和占比公式转VBA实现问题求助
问题原因
- 原代码里的
constSum仅在初始化时读取了A2单元格的固定值,循环过程中没有更新累计值,且Application.Sum(constSum, ws.Cells(i, 1))仅会对两个独立值求和,无法实现$A$2:Ai的区间求和逻辑 - 分母的固定区间求和重复放在循环里计算,属于冗余运算,可提前一次性算出
- 部分单元格对象没有绑定工作表对象
ws,如果运行时当前激活的不是目标工作表,会出现取值错误
修正后完整代码
Sub testCumulPerc() Dim ws As Worksheet Dim wb As Workbook Dim firstRow As Integer, lastRow As Integer Dim totalSum As Double ' 提前存储分母的固定总和,用Double避免整数溢出 Dim cumulativeSum As Double ' 存储逐行累计和 Dim i As Integer Set wb = Application.ActiveWorkbook Set ws = wb.Sheets(1) firstRow = ws.Range("A2").Row lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' 提前计算分母:A2到最后一行的总和,只计算一次 totalSum = Application.Sum(ws.Range(ws.Cells(firstRow, 1), ws.Cells(lastRow, 1))) cumulativeSum = 0 ' 初始化累计和为0 For i = firstRow To lastRow ' 逐行累加当前行A列值,得到A2到Ai的总和 cumulativeSum = cumulativeSum + ws.Cells(i, 1).Value ' 计算百分比写入B列 ws.Cells(i, 2).Value = cumulativeSum / totalSum Next i End Sub
如果你想要和Excel公式逻辑完全对应、直接用区间求和实现,也可以替换循环内的逻辑为:
ws.Cells(i, 2).Value = Application.Sum(ws.Range(ws.Cells(firstRow, 1), ws.Cells(i, 1))) / totalSum
该写法和你原工作表公式逻辑完全一致,仅在数据量较大时运算效率比累加变量的方案稍低。
内容的提问来源于stack exchange,提问作者lifeofthenoobie
相关产品推荐
相关产品推荐

