2

我有一个 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 函数中完成,那就更好了。

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

4

2 回答 2

4

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

的公式C2

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

将其复制到所有数据行。

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

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

=AVERAGEIFS(B:B,A:A,A1)
于 2013-06-20T07:24:07.837 回答
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

希望这可以帮助 ..

于 2013-06-20T11:41:10.080 回答