VBA按降序排序 - 基于平均值

时间:2017-02-21 10:40:56

标签: excel vba excel-vba sorting average

希望你能帮忙..!

我有这样的名单..


Item    Value
Prod_1  0.22 
Prod_2  0.30 
Prod_3  0.23 
Prod_4  0.22 
Prod_5  0.28 
Prod_6  0.23 
Prod_7  0.22 
Prod_8  0.28 
Prod_9  0.24 

我想将它们分成3个,以便这三个项目的平均值需要按降序排序。

这里的挑战是要知道需要使用哪种组合 - 我想以后再对它们进行排序..

请看下面..!

这就是我想要的......



Name    Value   Average  

Prod_1  0.22    0.2500000
Prod_2  0.30        
Prod_6  0.23        

Prod_9  0.24    0.2466667
Prod_5  0.28        
Prod_7  0.22        

Prod_4  0.22    0.2433333
Prod_8  0.28        
Prod_3  0.23        

目前我有9个项目..但这将是n个数字,并且总是需要在3个组中。

我尝试了其他方法..但没有成功..

1 个答案:

答案 0 :(得分:0)

如果您将产品名称放在A列,第2行到第10行,即Prod_1等,并将其相应的值放在“B”行2到10行中,那么此子例程将执行您的示例要求明确要求的内容。它可以帮助您了解VBA脚本如何工作,以便您可以在以后修改它以满足新的需求。

在代码中,您将看到正在创建的两个数组originalArray,它是一个多维数组。它有9个项目,包含两个数据 - 名称和值。它填充了从第2行到第10行的循环,将每行数据收集到数组中的新行。

接下来,我们有一个分离元素的数组,或者更确切地说你希望如何将这些组分成3个。这也是一个多维数组,但它是在一个步骤中初始化和定义的。

添加“For”循环以将组放在“E”和“F”列中三个,并将它们的平均值放入“G”列。然后它跳过一行并执行下一组3,然后跳过一行并完成最后一组3.

仔细研究代码,或者使用F8键逐步完成代码,它将帮助您了解代码的运行方式 - 从上到下 -

Sub getAvgs()
Dim origArray(1 To 9, 1 To 2)
Dim varData, rowCounter As Long, averager As Double

    For i = 1 To 9
        origArray(i, 1) = Sheet1.Range("A" & i + 1).Value
        origArray(i, 2) = Sheet1.Range("B" & i + 1).Value
    Next i

    varData = [{1, 2, 6; 9, 5, 7; 4, 8, 3}]


    rowCounter = 3
    Columns("G:G").Select
    Selection.NumberFormat = "0.00000"
    Columns("E:G").ColumnWidth = 12
    Sheet1.Range("E1").Value = "Name"
    Sheet1.Range("F1").Value = "Value"
    Sheet1.Range("G1").Value = "Average"


    For i = 1 To 3
        For f = 1 To 3
            Sheet1.Range("E" & rowCounter).Value = origArray(varData(f, i), 1)
            Sheet1.Range("F" & rowCounter).Value = origArray(varData(f, i), 2)
            averager = averager + origArray(varData(1, f), 2)
            rowCounter = rowCounter + 1
        Next f
        Sheet1.Range("G" & rowCounter - 3).Value = averager / 3
        averager = 0
        rowCounter = rowCounter + 1
    Next i

End Sub