逐行自动计算不同数值的平均值

时间:2013-06-20 07:09:10

标签: excel vba

我有一个Excel文件,里面有几列,有很多行。一栏,说A有ID号。另一栏,说G有价格。 A列具有重复的ID号,但并非所有数字都重复相同的次数。有时只有一次,其他时间为2,3或几次。该行的每列G都有唯一的价格。

基本上,我需要在A列中对给定ID的价格进行平均。如果每个ID重复相同的次数,这将非常简单,但因为它们不是我必须手动执行我的平均计算每个分组。由于我的电子表格有很多行,所以这是永远的。

这是一个例子(H列是我目前手动计算的平均值):

     A     ...   G      H
1    1234        3.00   3.50
2    1234        4.00
3    3456        2.25   3.98
4    3456        4.54
5    3456        5.15
11   8890        0.70   0.95
13   8890        1.20
...

所以在上面的例子中,ID#1234的平均价格是3.50。同样,ID#3456的平均价格为3.98,#8890的平均价格为0.95。

  • 注意第5行和第11行之间缺少行,第12行也丢失了?那是因为出于其他原因将它们过滤掉了。我需要从计算中排除这些隐藏的行,并仅计算可见行的平均值。

我正在尝试编写一个自动计算的VBA脚本,然后打印H列中每个ID的平均值。

以下是我考虑的一些代码:

Sub calcAvg()
Dim rng As Range
Set rng = Range("sheet1!A1:A200003")
    For Each Val In rng
        Count = 0
        V = Val.Value  '''V is set equal to the value within the range
        If Val.Value = V Then
            Sum = Sum + G.Value
            V = rng.Offset(1, 0)  '''go to next row
            Count = Count + 1
        Else
            '''V = Val.Value  '''set value in this cell equal to the value in the next cell down.
            avg = Sum / Count
            H = avg  '''Column G gets the avg value.
        End If
    Next Val

End Sub

我知道上面的代码存在一些问题。我不太熟悉VBA。此外,这将每次在同一行打印平均值。我不知道如何迭代整行。

这似乎过于复杂。它在理论上是一个简单的问题,但缺少的行和不同数量的ID#重复使它更复杂。

如果可以在Excel函数中完成,那就更好了。

任何想法或建议都将不胜感激。感谢。

2 个答案:

答案 0 :(得分:4)

如果你可以在数据的顶部添加另一行(在其中放置列标题),则使用公式非常简单。

C2的公式是

=IF(A2<>A1,AVERAGEIFS(B:B,A:A,A2),"")

将所有数据行复制下来。

这适用于Excel 2007或更高版本。如果使用Excel 2003或更早版本,请改用AVERAGEIF,相应地调整范围

如果您无法添加标题行,请将第一个公式(单元格C1)更改为

=AVERAGEIFS(B:B,A:A,A1)

答案 1 :(得分:1)

以我的方式......

Sub calcAvg()
Dim x, y, i, y2, t, Count, Mount As Integer
Dim Seek0 As String

x = 1 '--> means Col A
y = 1 '--> means start - Row 1
y2 = 7 '--> means end - Row 19

    For i = y To y2
        If i = y Then
            Seek0 = Cells(i, x)
            t = i
            Count = Cells(i, x + 6)
            Mount = 1            
        Else
            If Cells(i, x) <> Seek0 Then
                Cells(t, x + 7) = Count / Mount
                Count = Cells(i, x + 6)
                Mount = 1
                t = i
                Seek0 = Cells(i, x)
            Else
                Count = Count + Cells(i, x + 6)
                Mount = Mount + 1
            End If
        End If
    Next    
End Sub

希望这会有所帮助..