给定一列数值,是否可以对值求和,直到总数达到特定阈值,然后重置总和并继续?例如
Val Sum
103
52 155
47
60
103 210
100
76 176
163 163
169 169
87
103 190
84
31
59 174
87
49
67 203
这将数组相加,直到值超过 150,然后重置计数器。
给定一列数值,是否可以对值求和,直到总数达到特定阈值,然后重置总和并继续?例如
Val Sum
103
52 155
47
60
103 210
100
76 176
163 163
169 169
87
103 190
84
31
59 174
87
49
67 203
这将数组相加,直到值超过 150,然后重置计数器。
我将更多地发布概念证明而不是真正的答案,或者我可以改进它的情况(Issun 也可能有一个想法)。
就是这样:假设你的 Val 是 incolumn A
并且 Sum incolumn B
和 Titles 是 in row 1
。
在column C
中,我们将设置一个公式,该公式将告诉您总结它的“最后一个”单元格 > 在 cell 中C3
,输入:
{=MAX(IF($B$2:B2=0;0;ROW($B$2:B2)))}
这是一个数组公式,您必须使用CtrlShiftEnter.
在 cellB3
中,您必须输入第一个值(在您的示例中为 155),抱歉,我没有找到合适的解决方法。
在单元格B4
中,输入:
=IF(SUM($A$1:A4)-SUM(INDIRECT("$B$1:"&ADDRESS(C4;2)))>150;SUM($A$1:A4)-SUM(INDIRECT("$B$1:"&ADDRESS(C4;2)));0)
然后将公式拖放到值的末尾。
[编辑]实际上,您可以将其全部放在单元格中的单个公式中B2
:
{=IF(SUM($A$1:A2)-SUM(INDIRECT("$B$1:"&ADDRESS(MAX(IF($B$1:B1=0;0;ROW($B$1:B1)));2)))>150;SUM($A$1:A2)-SUM(INDIRECT("$B$1:"&ADDRESS(MAX(IF($B$1:B1=0;0;ROW($B$1:B1)));2)));0)}
并将其拖放到值的末尾。似乎也可以工作。
这是 VBA 中的一个解决方案(对不起,我知道你想要一个论坛)。显然,您可以将范围调整为您需要的范围。请注意,我使用 LONG 作为数据类型(并且我将其转换为 long 以避免一些错误),但如果您有任何浮点数,则需要使用 DOUBLE。
Sub SumIt()
Dim cell As range
Dim currentCount As Long
For Each cell In range("A2:A100")
currentCount = currentCount + CLng(cell.Value)
If currentCount > 150 Then
cell.Offset(0, 1).Value = currentCount
currentCount = 0
End If
Next
End Sub
它是如何工作的:我遍历范围内的每个单元格并将值添加到一个名为 currentCount 的变量中。然后我检查它是否超过 150,如果是,我将 currentCount 粘贴到 B 列(同一行)并重置计数并移动到下一个单元格。简单的!
最简单的方法(不需要数组公式,更不用说 VBA):
在 B2 中,键入=IF(B1<150,B1+A2,A2)
并向下拖动。这将相加直到达到 150 或更多,然后从零重新开始。当然,中间的总和(即接近 150)也会显示出来。如果这让您感到困扰,那么您会想到几个选择:
=IF(B2>=150,B2,"")
C2 并向下拖动,然后隐藏 B 列。