Excel-WorksheetFunction.Average返回错误的答案

时间:2018-12-10 04:57:28

标签: excel vba excel-vba

给出B2:D10中的数据,我想使用VBA数组公式找到每一行的平均值。以下是Bill Jelen的书籍示例VBA Queue。

Worksheet data

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

对每一行进行查找以找到平均值。如您所见,答案是不同的。为什么?

1 个答案:

答案 0 :(得分:4)

代码产生意外结果的原因是由于您仅对两个单元格求平均: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)