Você pode fazer isso sem usar o VBA. Digite a seguinte fórmula em B1 e preencha a última linha da Coluna A:
=IFERROR(AVERAGE(INDIRECT("A" & $C$1*(ROW()-1)+1 & ":A" & ROW()*$C$1)),"")
Na coluna A
, tenho um conjunto de números (acima de 1.000) e desejo obter uma média de um bloco deles por vez (por exemplo, 10, então A1:A10
then A11:A20
e assim em) e escreva essas médias na coluna B
, tal que B1
contenha a média do primeiro bloco, B2
o segundo bloco e assim por diante.
Em seguida, em C1
, gostaria de ter um valor que defina o número de linhas que cada média deve considerar (por exemplo, 10 = A1:A10
, A11:A20
... e 25 = A1:A25
, A26:A50
... e assim por diante).
Quando altero o valor de C1
, quero que a coluna B
seja atualizada automaticamente para a média usando os novos tamanhos de bloco.
Como devo fazer isso?
Você pode fazer isso sem usar o VBA. Digite a seguinte fórmula em B1 e preencha a última linha da Coluna A:
=IFERROR(AVERAGE(INDIRECT("A" & $C$1*(ROW()-1)+1 & ":A" & ROW()*$C$1)),"")
Esse código funcionará, supondo que você tenha valor na coluna A (começando na linha 1) e o valor de entrada esteja em C1.
Sub GetAverages()
Dim avgCount As Integer, numberRng As Range
Set numberRng = Range("A1:A" & Range("A1").End(xlDown).Row)
avgCount = Range("C1").Value
For cl = avgCount To (numberRng.Rows.Count - (numberRng.Rows.Count Mod avgCount)) Step avgCount
Cells(cl, 2) = WorksheetFunction.Average(Range("A" & cl - (avgCount - 1) & ":A" & cl))
Next cl
End Sub
Observe que isso só calculará uma média quando houver valores suficientes, por exemplo, se você digitar 5 em C1 e tiver apenas valores para A1: A13, então você só terá médias para A1: A5 e A6: A10
Espero que isso ajude
Em um módulo;
Function roll()
Dim i As Long
Dim total As Double
Dim groupSize As Long
Application.Volatile
groupSize = Range("C1").Value
If 0 = Application.Caller.Row Mod groupSize Then
For i = 0 To groupSize - 1
total = total + Application.Caller.Offset(-i, -1).Value
Next
roll = total / groupSize
Else
roll = ""
End If
End Function
coloque 10
em C1
, e em B1
coloque =roll()
e arraste para baixo / clique duplo.
Tags microsoft-excel vba