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

基于其他列值vba代码的平均列值,vba,excel,Vba,Excel,我有以下数据(仅显示少数数据) 我需要得到第3列中类似组的平均值。第1列中有许多名称(并非全部显示),并且这些名称有时不同,因此我无法在命令行中指定名称,因为这样不方便。你能帮我写一个vba代码来解决这个问题吗。谢谢 Column 1 Column 2 123A 1245 123A 3400 123A 1200 124A 1201 124A 1001 111B 900 123B 8

我有以下数据(仅显示少数数据)

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

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

这将在侧面创建一个列表:

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()


编辑

根据您的编辑

在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(A2A1,AVERAGEIF(A2:INDEX($A2:$A2$A$20000),MATCH(TRUE,(INDEX($A2:$A$A$20000A2,)),0)),A2,B2:INDEX($B2:$B$20000,MATCH(TRUE,(INDEX($A2:$A$20000A2,),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))),"")
=IF(A2A1,AVERAGEIF(A2:INDEX($A2:INDEX(A:A,MATCH(1E+99,A:A)+1),MATCH(真)(INDEX($A2:INDEX(A:A,MATCH(1E+99,A:A)+1)A2,AVERAGEIF(A2:INDEX(A:A,A:A,A)+1),0)),A2,B2:INDEX($B2:INDEX(B:B,MATCH(1E+99,A:A)+)+)1),MATCH(真,(INDEX($A2:INDEX(A:A,MATCH(A:A,A,A+A)+)A2),0)),“”)

它似乎不需要VBA——只需要一个简单的比率
SUMIF()
COUNTIF()
或者一个简单的AVERAGEIF():
=AVERAGEIF(a:a,A1,B:B)
并向下复制。它将填充A列中所有相似名称的平均值。@ScottCraner我忘记了
AverageIf()
,它当然更短。所需的输出是什么。在您提供的图片中显示您期望得到的实际回报。@Scott,我已经用所需的输出进行了更新。非常感谢。这并不是直接解决我的问题。请参阅随附的excel表格。另外请注意,这个数据集大约有100行,第二天将有不同的ID。我可以手动完成,但如果我可以运行代码,将节省时间。我的想法是首先查看第一个ID值,并存储第二行值,如果相同,则转到下一行检查ID是否相同获得第二行值,如wise计算平均值,直到找到下一个不同的ID。希望你明白我的意思。谢谢请在您的原始帖子中显示所需的输出,与您看到的完全一致。@scott谢谢。它工作,它解决了我的要求,稍后我将尝试代码。非常感谢。
=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))),"")