计算一列中大小可变的数字块的平均值?

计算一列中大小可变的数字块的平均值?

在列中A我有一组数字(超过 1,000),并且我想一次获取其中一组数字的平均值(例如,10,依此A1:A10类推A11:A20),然后将这些平均值写入列中B,这样包含第一个块、第二个块等的B1平均值。B2

然后,C1我想要一个值来定义每个平均值应该考虑的行数(例如,10 = A1:A10A11:A20... 和 25 = A1:A25A26:A50... 等等)。

C1当我改变我希望列的值时,B使用新的块大小自动更新为平均值。

我该如何做呢?

答案1

无需使用 VBA 即可完成此操作。在 B1 中输入以下公式并填充至 A 列的最后一行:

=IFERROR(AVERAGE(INDIRECT("A" & $C$1*(ROW()-1)+1 & ":A" & ROW()*$C$1)),"")

答案2

假设 A 列(从第 1 行开始)中有值,并且输入值在 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

请注意,这只会在有足够多值的情况下计算平均值,例如,如果您在 C1 中输入 5,而您只有 A1:A13 的值,那么您只会获得 A1:A5 和 A6:A10 的平均值

希望这可以帮助

答案3

在一个模块中;

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

放入,然后放入10并向下拖动/双击。C1B1=roll()

相关内容