计算多个范围的平均值

时间:2021-03-09 13:36:04

标签: excel vba

我正在尝试计算多个范围的平均值,如附图所示。 状况 - 它应该将“L”和“M”列的单元格值与“A”列的范围相匹配,并创建一个范围(例如 322810 到 324900)来计算与特定范围(例如 322810)相对的 B 列值的平均值到 324900)。 我已经能够编写以下代码,但它显然不起作用。

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

 With Worksheets("Source")
 lastrow = .Range("A" & .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" & i & ":B" & j & ")" 'AVG
                Exit For
            End If
        Next j
    End If
Next I
End With

将不胜感激所有帮助(公式或 VBA 代码) Screenshot

2 个答案:

答案 0 :(得分:1)

是的,BigBen 是对的。这就是方法。我例子中的公式是

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

Screenshot

答案 1 :(得分:1)

试试,

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" & .Rows.Count).End(xlUp).Row
        vDB = .Range("L3", .Range("m" & .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