基于其他列值vba代码的平均列值

时间:2016-04-28 17:43:09

标签: excel vba excel-vba

我有以下数据(只显示了少数数据)

![enter image description here

我需要获取第3列中类似组的平均值。第1列中有许多名称(未显示全部),并且这些名称的时间不同,因此我无法在命令行中指定名称,因为它是不方便。你能帮我把vba代码解决这个问题。谢谢。

Column 1  Column 2       
123A        1245
123A        3400
123A        1200
124A        1201
124A        1001
111B        900
123B        800

1 个答案:

答案 0 :(得分:1)

这将创建一个列表:

Sub dupremoveavg()
Dim ws As Worksheet
Dim lastrow As Long

Set ws = Sheets("Sheet13") ' Change to your sheet

With ws
    lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    With .Range("A1:B" & lastrow)
        .Offset(, 4).Value = .Value
    End With
    With .Range("B2:B" & lastrow)
        .Offset(, 4).FormulaR1C1 = "=AVERAGEIF(C1,RC1,C[-4])"
        .Offset(, 4).Value = .Offset(, 4).Value
    End With

    .Range("E1:F" & lastrow).RemoveDuplicates 1, xlYes

End With

End Sub

enter image description here

或者对于非vba,您可以使用AVERAGEIF()

=AVERAGEIF(A:A,A2,B:B)

enter image description here

修改

根据您的修改。

在C2中使用此公式并复制。

=IF(A2<>A1,AVERAGEIF(A2:INDEX($A2:$A$20000,MATCH(TRUE,(INDEX($A2:$A$20000<>A2,)),0)),A2,B2:INDEX($B2:$B$20000,MATCH(TRUE,(INDEX($A2:$A$20000<>A2,)),0))),"")

enter image description here

此公式将引用动态范围,因为它会增长或缩小以适应不断变化的行数。

=IF(A2<>A1,AVERAGEIF(A2:INDEX($A2:INDEX(A:A,MATCH(1E+99,A:A)+1),MATCH(TRUE,(INDEX($A2:INDEX(A:A,MATCH(1E+99,A:A)+1)<>A2,)),0)),A2,B2:INDEX($B2:INDEX(B:B,MATCH(1E+99,A:A)+1),MATCH(TRUE,(INDEX($A2:INDEX(A:A,MATCH(1E+99,A:A)+1)<>A2,)),0))),"")