【问题标题】:WorksheetFunction.Average returns incorrect answerWorksheetFunction.Average 返回错误答案
【发布时间】:2020-02-11 11:13:56
【问题描述】:

鉴于 B2:D10 中的数据,我想使用 VBA 数组公式找到每行的平均值。遵循 Bill Jelen 的书籍示例 VBA 队列。

Name    A   B   C   Answer  Manual Avg
A2      4   34  59  31.5    32.33333333
A3      45  83  74  59.5    67.33333333
A4      98  40  17  57.5    51.66666667
A5      95  8   83  89  62
A6      57  55  98  77.5    70
A7      14  21  17  15.5    17.33333333
A8      55  23  4   29.5    27.33333333
A9      80  15  77  78.5    57.33333333
A10     11  24  40  25.5    25

E列的答案来自这个公式

Sub QuickFillAverage()
Dim myArray As Variant
Dim myCount As Integer

myArray = Worksheets("Sheet1").Range("B2:D10")

For myCount = LBound(myArray) To UBound(myArray)
    Worksheets("Sheet1").Cells(myCount + 1, 5).Value = _
    WorksheetFunction.Average(myArray(myCount, 1), myArray(myCount, 3))
Next myCount

End Sub

F列的答案来自

(B2+C2+D2) / 3

为每一行完成以求平均值。如您所见,答案是不同的。为什么?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    代码产生意外结果的原因是您仅对两个单元格进行平均:myArray(myCount, 1)myArray(myCount, 3)。您可能会想到 Range() 函数,该函数将返回两个范围值之间的所有单元格 - 但当您使用数组时,情况并非如此。

    您需要在平均工作表函数中包含所有三个值:

    WorksheetFunction.Average(myArray(myCount, 1), myArray(myCount, 2), myArray(myCount, 3))
    

    这是我创建的一个函数,它将接受一个数组并根据提供的任何行号(这将是您的 myCount 编号)对数组进行平均:

    Function averageArrayRows(arr As Variant, ByVal myRow As Long) As Double
    
        Dim i As Long, mySum As Double
    
        For i = LBound(arr, 2) To UBound(arr, 2)
            mySum = mySum + arr(myRow, i)
        Next
    
        averageArrayRows = mySum / (UBound(arr, 2) - LBound(arr, 2) + 1)
    
    End Function
    

    您可以通过以下方式使用:

    Worksheets("Sheet1").Cells(myCount + 1, 5).Value = averageArrayRows(myArray, myCount)
    

    【讨论】:

    • 非常感谢.. 我遇到了一个错误,我更改了这部分myRow As Long 并在这部分之前使用了 ByVal 以避免错误。也去掉了第一个参数中变量arr后面的()
    • 感谢您的反馈,我继续为可能遇到相同问题的未来读者更新。
    • 注意,直接传递给WorksheetFunction.Average() 的范围可能包含空单元格或非数字单元格,这些单元格会被函数自动排除在计算之外。当传递Range.Value返回的数组时,上述代码的行为是不一样的。
    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2014-12-04
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多