将范围对象传递给VBA中的一个子对象

尝试创build一个采用范围单元格并计算该列中单元格的平均值的子例程。 但是我得到错误:对象必需

我怎样才能纠正这一点?

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 

好,有一个评论,告诉这个子应该做什么:我读它:如果我运行“ Test() ”,会发生以下情况:在第一行传递的范围的列中,该列的值的平均值应该出现。

你的代码有三个问题。 第一个在前面的注释中提到:在testing例程中使用call ColumnAverageToTop(rg)或者ColumnAverageToTop rg 。 解:

 Sub test() Dim rg As Range Set rg = ThisWorkbook.Worksheets(1).Range("B1") ColumnAverageToTop rg End Sub 

现在,我们将成功inputColumnAverageToTop例程,将parameter passing给WorkSheetFunction.Average有一个问题。 WorkSheetFunction.Average参数如下所示: https : WorkSheetFunction.Average所以为了保持简单,只要确保将一个Range对象传递给进行计算的对象即可。

最后,在使用“结束”和“偏移”时,请确保按照正确的顺序使用它们。 每个函数都会提供一个新的范围对象。 我看到你试图让传递的参数下面的单元格,然后下去,并获得所有其他值来计算该范围的平均值。

如果你真的总是需要整个列的平均值,我会build议:

 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 'Eg "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行中的任何数值,即使它将被结果覆盖。 多次运行相同的testing会改变结果。

如果你真的需要第一行以下的所有内容的平均值,直到第一个空白行,它应该是:

.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))

希望这可以帮助你。