Хорошо, что есть комментарий, который говорит, что этот подпункт должен делать: Я прочитал это так: Если я бег «Test()
», происходит следующее: в колонке пройденного диапазона в ряде один, в среднем, что должны отображаться значения столбца.
В коде есть три проблемы. Первое упоминается в предыдущих комментариях: Используйте либо call ColumnAverageToTop(rg)
, либо ColumnAverageToTop rg
в своей тестовой программе. Решение:
Sub test()
Dim rg As Range
Set rg = ThisWorkbook.Worksheets(1).Range("B1")
ColumnAverageToTop rg
End Sub
Теперь, когда мы успешно ввести процедуру ColumnAverageToTop, есть проблема с переходом параметра в WorkSheetFunction.Average
Он принимает аргументы как описано здесь: https://msdn.microsoft.com/en-us/library/office/ff836809.aspx так, чтобы держать это просто просто убедитесь, что пройти диапазон -объект, на котором выполняется вычисление.
Наконец, при использовании End and Offset убедитесь, что вы используете их в правильном порядке. Каждая из этих функций предоставит новый объект диапазона. Я вижу, что вы пытаетесь получить ячейку ниже переданного аргумента, а затем опуститесь и получите все остальные значения для вычисления среднего значения этого диапазона.
Если вы истинно всегда нуждаетесь в среднем всего столбца, я бы посоветовал:
Sub ColumnAverageToTop(rg As Range)
'calculates the average of the data in column and puts it in row 1 of column
'We declare where we put the value: Cells(1,1) of the column of the Range passed
'E.g. "B1" passed means that the average will be in "B1".
'Same fore passing "B323"
rg.EntireColumn.Cells(1, 1).Value = WorksheetFunction.Average(rg.EntireColumn)
End Sub
Это будет включать в себя любое числовое значение в строке 1 той же самой колонки пропущенного диапазона, даже если это будет переписанный результатом. Таким образом, повторение одного и того же теста несколько раз приведет к изменению результата.
Если вы действительно нуждаетесь в среднем все ниже 1-й строки до первой пустой строки, она должна быть:
.rg.EntireColumn.Cells(1,1).value = WorksheetFunction.Average(rg.EntireColumn.Range(Cells(2, 1), Cells(2,1).End(xlDown)))
Если ваша потребность в среднем заполненных ячеек ниже ссылочный ячейки:
.rg.EntireColumn.Cells(1, 1).Value = WorksheetFunction.Average(rg.Offset(1, 0).Resize(rg.Offset(1, 0).End(xlDown).Row - rg.Offset(1, 0), 1))
Надеюсь, это поможет вам.
Изменить 'ColumnAverageToTop (rg)' to 'ColumnAverageToTop rg' ИЛИ' Call CoumnAverageToTop (rg) ' –
VBA не использует круглые скобки вокруг параметров для подпрограмм, если вы не используете' CALL' в первую очередь. –
Также ваш 'Application.WorksheetFunction.Average (rg.Columns (rg.Column))' всегда будет возвращать номер столбца в качестве среднего. Вы хотите что-то вроде этого: Application.WorksheetFunction.Average (Range (Left (rg.Address (0, 0), 1) & ":" & Left (rg.Address (0, 0), 1))) ' –