VBA среднее значение 3 цикла в 1 столбце? - PullRequest
0 голосов
/ 18 октября 2018

Мне нужна помощь с моим кодом.По сути, мне просто нужно усреднить 3 значения в столбце и продолжать этот шаблон, пока не останется больше значений.Может кто-нибудь, пожалуйста, помогите?

Я хочу усреднить, например, A1: A3, A4: A6 ... и так далее, пока не останется больше значений.Средний результат будет в B1: B2.

enter image description here

Sub DLSaverage()
Dim i As Long, j As Long, k As Long, l  As Long, m As Long, myRange As Range

Sheets("DLS Data").Select
i = 2
j = 3
k = 4

Do While Cells(i, 3).Value <> ""
    'l = Cells(i, 2).Value
    'm = Cells(k, 2).Value

    'Cells(j, 22).Value = [Average (l : m)]
    i = i + 3
    j = j + 1
    k = k + 3
Set myRange = Range("L" & i & ":L" & k)
Cells(j, 22).Value = Application.Average(myRange)


Loop

End Sub

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Использование массивов

Option Explicit
Public Sub GetAverages()
    Dim ws As Worksheet, numOutputRows As Long, arr(), i As Long
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With ws
        arr = Application.Transpose(.Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row))
        Dim outputArray(), rowCounter As Long
        ReDim outputArray(1 To Round(UBound(arr) / 3, 0))
        For i = 1 To UBound(arr) Step 3
            rowCounter = rowCounter + 1
            outputArray(rowCounter) = Application.WorksheetFunction.Average(arr(i), arr(i + 1), arr(i + 2))
        Next

        ws.Cells(1, 2).Resize(UBound(outputArray), 1) = Application.Transpose(outputArray)
    End With
End Sub
0 голосов
/ 18 октября 2018

Я предлагаю

Option Explicit

Sub testAverage()
    Const Window As Long = 3

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim Target As Range
    Set Target = ws.Range("A1", ws.Cells(ws.Rows.Count, "A").End(xlUp))

    Dim iRow As Long
    For iRow = 1 To Target.Rows.Count Step Window
        ws.Cells((iRow \ Window) + 1, "C").Value = Application.WorksheetFunction.Average(ws.Cells(iRow, "A").Resize(RowSize:=Window))
    Next iRow
End Sub

Обратите внимание, что строка назначения ws.Cells((iRow \ Window) + 1, "C").Value рассчитывается с целочисленным делением (iRow \ Window) + 1 и не является нормальным делением.

enter image description here

0 голосов
/ 18 октября 2018

это можно сделать без vba:

Поместите это в C1 и скопируйте:

=IFERROR(AVERAGE(INDEX(A:A,(ROW(1:1)-1)*3+1):INDEX(A:A,(ROW(1:1)-1)*3+3)),"")

enter image description here

0 голосов
/ 18 октября 2018
Sub TestMe()

    Dim curRow As Long
    curRow = 1
    Do While Worksheets(1).Cells(curRow, 1) <> ""
        With Worksheets(1)
            .Cells(curRow, 4).Formula = "=AVERAGE(A" & curRow & ":C" & curRow & ")"
            curRow = curRow + 1
        End With
    Loop

End Sub

Приведенный выше код заполнит столбец D формулой для =Average(A1:C1):

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...