【问题标题】:To Calculate Average Value of Multiple Range计算多个范围的平均值
【发布时间】:2021-03-10 02:33:57
【问题描述】:

我正在尝试计算多个范围的平均值,如附图所示。 条件 - 它应该将“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" & .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 代码)

【问题讨论】:

  • 使用 AVERAGEIFS 并跳过 VBA。

标签: excel vba


【解决方案1】:

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

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

【讨论】:

  • 条件之间会有逗号(,)而不是半列(;)....非常感谢@Wolfgang
  • 啊是的@surendrachoudhary,这是由于我的本地设置(德语)
  • 现在更正了原帖@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" & .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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2018-02-28
    • 1970-01-01
    • 2021-03-29
    • 2021-08-21
    相关资源
    最近更新 更多