Excel - WorksheetFunction.Average возвращает неверный ответ - PullRequest
0 голосов
/ 10 декабря 2018

Учитывая данные в B2: D10, я хотел найти среднее значение в каждой строке, используя формулу массива VBA.Следуя примеру книги VBA Queue by Bill Jelen.

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 голосов
/ 10 декабря 2018

Причина, по которой код дает неожиданные результаты, заключается в том, что вы усредняете только две ячейки: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...