4

В столбце A меня есть набор чисел (более 1000), и я хочу получить среднее значение по одному их блоку за раз (например, 10, поэтому A1:A10 затем A11:A20 и т.д.) И записать их средние значения в столбце B , так что B1 содержит среднее значение первого блока, B2 - второй блок и так далее.

Затем в C1 я хотел бы иметь значение, которое определяет количество строк, которое должно учитывать каждое среднее значение (например, 10 = A1:A10 , A11:A20 ... и 25 = A1:A25 , A26:A50 ... и скоро).

Когда я изменяю значение C1 я хочу, чтобы столбец B автоматически обновлялся до среднего с использованием новых размеров блока.

Как мне это сделать?

3 ответа3

11

Вы можете сделать это без использования VBA. Введите следующую формулу в B1 и заполните до последней строки столбца A:

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

Этот код будет работать, предполагая, что у вас есть значение в столбце 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

Обратите внимание, что это будет вычислять среднее значение только там, где достаточно значений, например, если вы введете 5 в C1, и у вас есть только значения для 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 в C1 , а в B1 положить =roll() и перетащить / двойной щелчок по углу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .