假设我有下表可供使用:
project name total units
a 3
b 4
c 1
d 5
e 2
f 5
g 8
h 12
i 8
j 10
k 4
l 7
m 9
n 19
o 15
p 6
q 3
我希望将项目名称分组,例如总单位不超过20 因此,如果我将项目a添加到f,它将总共给出20个。因此,这组项目将被分组并由Excel提供唯一标识符。
我想轻松确定特定项目进入的文件编号。因此,只要我输入项目名称和总单位,就可以向我返回一个数字,说明项目应该进入哪个文件编号。
project name total units file number
a 3 1
b 4 1
c 1 1
d 5 1
e 2 1
f 5 1
g 8 2
h 12 2
i 8 3
j 10 3
k 4 4
l 7 4
m 9 4
n 19 5
o 15 6
p 6 7
q 3 7
我想要的最终结果是总计单位总和,并且项目名称的总和等于或小于20被分组并给出文件编号。
是否可以让Excel做这样的事情?
答案 0 :(得分:3)
不要使用VBA,这可以通过Excel的内置功能轻松完成。 SUMIF()
函数在这里有很多帮助
将以下公式放入单元格 C2 (假设上面的设置)
=IF(A2="a",ROUNDDOWN((B2-1)/20,0)+1,IF(SUMIF($C1:C$2,C1,$B1:B$2)+B2>20,C1+1,C1))
该公式正在执行以下操作:
我已对此进行了测试,但如果您有任何问题请与我联系。
答案 1 :(得分:0)
确定barryleajo提到的附带条件并假设您的个人总单位在1到19之间,我认为你需要这个算法: -
If it's the first line of data
Running total=total units
Else
If (Previous running total + total units) > 20
Running total=total units
Else
Running total=Previous running total + total units
因此,在下面的电子表格中,我设置了D2 = B2和E2 = 1,
然后把公式
= IF(D2 + B3→20,B3,D2 + B3)
进入D3
和
= IF(B3 = D3,E2 + 1,E2)
进入E3并将它们拉下来。
答案 2 :(得分:0)
以下代码有效。我添加了评论以帮助您理解答案。
Dim total_units As Range
Dim file_number As Integer
Dim cumulative_sum As Integer
Sub filenumber()
'Fill in column C header with string 'file_number'
Range("C1") = "file_number"
'Set total_units as the range variable
Set total_units = ThisWorkbook.Sheets(1).Range("B2")
'File_number starts equal to 1
file_number = 1
'Cumulative sum starts in the first row of total_units
cumulative_sum = total_units
'Loop until non empty rows of column project_name
Do While Not total_units = ""
'Fill in column C
total_units.Offset(, 1) = file_number
'Records the cumulative_sum in the row
cumulative_sum = cumulative_sum + total_units.Offset(1, 0)
'If cumulative sum exceeds 20, then, `file_number` changes and the start point in `cumulative_sum` also changes
If cumulative_sum > 20 Then
cumulative_sum = total_units.Offset(1, 0)
file_number = file_number + 1
End If
'Move the range
Set total_units = total_units.Offset(1, 0)
'Next row
Loop
End Sub