Для вычисления среднего значения нескольких диапазонов

#excel #vba

Вопрос:

Я пытаюсь рассчитать среднее значение нескольких диапазонов, как показано на прилагаемом рисунке. Условия — Он должен соответствовать значению ячейки столбца «L» и «M» с диапазоном столбца «A» и составлять диапазон (например, от 322810 до 324900) для вычисления среднего значения столбца B, которое соответствует определенному диапазону (например, от 322810 до 324900). Я смог написать следующий код, но он явно не работает.

  Dim lastrow As Long
 Dim i As Long, j As Long

 With Worksheets("Source")
 lastrow = .Range("A" amp; .Rows.Count).End(xlUp).Row

 For i = 2 To lastrow   1 'loop whole range (column C)
    If .Cells(i, "L") = .Range("A").Value Then 'If column L cell value match with any cell of Range "A"
        For j = i To lastrow 'Loop "group" range.
            If .Cells(j, "M") = .Range("A").Value Then ' (end of small group range) then apply formula
                .Cells(i, "N").Formula = "=AVERAGE(B" amp; i amp; ":B" amp; j amp; ")" 'AVG
                Exit For
            End If
        Next j
    End If
Next I
End With
 

Мы будем признательны за любую помощь (формула или код VBA).
Скриншот

Комментарии:

1. Используйте AVERAGEIFS и пропустите VBA.

Ответ №1:

Да, БигБен прав. Это и есть путь. Формула в моем примере такова

 =AVERAGEIFS($B$3:$B$16,$A$3:$A$16,">="amp;L4,$A$3:$A$16,"<="amp;M4)
 

Скриншот

Комментарии:

1. Между критериями будет запятая (,) вместо полустолбца (;)…. Большое вам спасибо @Wolfgang

2. Ах да @surendrachoudhary, это было связано с моими местными настройками (немецкий)

3. Исправил исходный пост сейчас @surendrachoudhary, спасибо за голосование!

Ответ №2:

Попробуй,

 Sub test()
    Dim Lastrow As Long
    Dim i As Long, j As Long
    Dim r As Long
    Dim mPoint As Long
    Dim Ws As Worksheet
    Dim vDB, vR()
    Dim rngStart As Range, rngEnd As Range
    Dim rngDB As Range
    
    Set Ws = Worksheets("Source")


    With Ws
        Lastrow = .Range("A" amp; .Rows.Count).End(xlUp).Row
        vDB = .Range("L3", .Range("m" amp; .Rows.Count).End(xlUp))
        r = UBound(vDB, 1)
        ReDim vR(1 To r, 1 To 1)
 
        For i = 1 To r
            For k = 1 To Lastrow
                If .Range("a1").Cells(k) = vDB(i, 1) Then
                    Set rngStart = .Range("a1").Cells(k)
                    mPoint = rngStart.Row
                    Exit For
                End If
            Next k
            If rngStart Is Nothing Then
            Else
                For k = mPoint To Lastrow
                    If .Range("a1").Cells(k) = vDB(i, 2) Then
                        Set rngEnd = .Range("a1").Cells(k)
                        Exit For
                    End If
                Next k
            End If
            
            If rngStart Is Nothing Or rngEnd Is Nothing Then
            Else
               Set rngDB = .Range(rngStart, rngEnd).Offset(, 1)
               Debug.Print rngDB.Address
                vR(i, 1) = WorksheetFunction.Average(rngDB)
            End If
            Set rngStart = Nothing
            Set rngEnd = Nothing
        Next i
        .Range("n3").Resize(r) = vR
    End With

End Sub