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


Na coluna A Eu tenho um conjunto de números (acima de 1.000) e quero obter uma média de um bloco deles por vez (por exemplo, 10, A1:A10 então A11:A20 e assim por diante) e escreva essas médias na coluna B, de tal modo que B1 contém a média do primeiro bloco, B2 o segundo bloco e assim por diante.

Então, 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 eu mudar o valor de C1 Eu quero coluna B para atualizar automaticamente para a média usando os novos tamanhos de bloco.

Como devo fazer isso?


4


origem


Esta questão não mostra nenhum esforço de pesquisa. As respostas, por outro lado, são muito boas. - Jean-François Corbett


Respostas:


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)),"")

11



+1 porque prefiro uma fórmula para o VBA sempre que possível, mas note que IFERROR() está disponível apenas no Excel 2007 e mais recente. - DMA57361


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 isto ajude


4





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

colocar 10 dentro C1, e em B1 colocar =roll() e arraste para baixo / clique duplo de canto.


3