根据总数对数据进行分组

时间:2014-09-28 07:56:23

标签: excel vba excel-vba excel-formula

假设我有下表可供使用:

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做这样的事情?

3 个答案:

答案 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))

该公式正在执行以下操作:

  • 如果名称是" a"然后根据" a"
  • 中的单位检查所需的文件数量
  • 对于所有其他名称:将当前文件中的先前单位(即上面单元格中的文件编号)相加并添加当前项目单位。如果数量超过20,请将文件编号加1,否则使用相同的文件编号

我已对此进行了测试,但如果您有任何问题请与我联系。

答案 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并将它们拉下来。

enter image description here

答案 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