基于其他列值vba代码的平均列值
我有以下数据(仅显示少数数据) 我需要得到第3列中类似组的平均值。第1列中有许多名称(并非全部显示),并且这些名称有时不同,因此我无法在命令行中指定名称,因为这样不方便。你能帮我写一个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
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))),"")