给出B2:D10中的数据,我想使用VBA数组公式找到每一行的平均值。以下是Bill Jelen的书籍示例VBA Queue。
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
对每一行进行查找以找到平均值。如您所见,答案是不同的。为什么?
答案 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)