2016-01-27 11 views
0

Попытка создать подпрограмму, которая принимает ячейку диапазона, и вычисляет среднее значение ячеек в этом столбце. Но я получаю сообщение об ошибке: Object RequiredПередача объекта диапазона в подпрограмму в VBA

Как это исправить?

Sub test() 

    Dim rg As Range 

    Set rg = ThisWorkbook.Worksheets(1).Range("B1") 
    ColumnAverageToTop (rg) 

    End Sub 

    Sub ColumnAverageToTop(rg As Range) 
    'calculates the average of the data in column and puts it above the data 
    Cells(1, rg.Column).End(xlDown).Offset(1, 0).Value = Application.WorksheetFunction.Average(rg.Columns(rg.Column)) 
    End Sub 
+2

Изменить 'ColumnAverageToTop (rg)' to 'ColumnAverageToTop rg' ИЛИ' Call CoumnAverageToTop (rg) ' –

+0

VBA не использует круглые скобки вокруг параметров для подпрограмм, если вы не используете' CALL' в первую очередь. –

+0

Также ваш 'Application.WorksheetFunction.Average (rg.Columns (rg.Column))' всегда будет возвращать номер столбца в качестве среднего. Вы хотите что-то вроде этого: Application.WorksheetFunction.Average (Range (Left (rg.Address (0, 0), 1) & ":" & Left (rg.Address (0, 0), 1))) ' –

ответ

1

Хорошо, что есть комментарий, который говорит, что этот подпункт должен делать: Я прочитал это так: Если я бег «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))

Надеюсь, это поможет вам.

Смежные вопросы