我有以下数据(只显示了少数数据)
我需要获取第3列中类似组的平均值。第1列中有许多名称(未显示全部),并且这些名称的时间不同,因此我无法在命令行中指定名称,因为它是不方便。你能帮我把vba代码解决这个问题。谢谢。
Column 1 Column 2
123A 1245
123A 3400
123A 1200
124A 1201
124A 1001
111B 900
123B 800
答案 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
或者对于非vba,您可以使用AVERAGEIF()
=AVERAGEIF(A:A,A2,B:B)
修改强>
根据您的修改。
在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))),"")
此公式将引用动态范围,因为它会增长或缩小以适应不断变化的行数。
=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))),"")