Calculando a média de blocos de números de tamanho variável dentro de uma coluna?

4

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?

    
por Excellll 21.06.2011 / 14:39

3 respostas

11

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)),"")
    
por 21.06.2011 / 15:54
4

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

    
por 21.06.2011 / 16:30
3

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.

    
por 21.06.2011 / 15:24