将范围对象传递给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))
希望这可以帮助你。