VBA – 运行时错误424:所需的对象
我得到了运行时错误424:所需的对象。 我被困在创build一个公式来计算标准偏差。 我想我通过定义范围的types做错了什么。 有什么build议么?
Sub result() ' I can see the average MsgBox Application.Average(getRangeByYear(2, year)) ' Error is caused in here MsgBox sdExcludesZero(getRangeByYear(2, year)) End sub Function meanExcludesZero(r As Excel.Range) Dim count As Double Dim sum As Double For Each cell In r If cell.Value <> 0 Then count = count + 1 sum = sum + cell.Value End If Next cell meanExcludesZero = sum / count End Function Function sdExcludesZero(r As Excel.Range) Dim mean As Double mean = meanExcludesZero(r) Dim sumOfSquareDiff As Double, count As Double For Each cell In r If cell.Value <> 0 Then count = count + 1 sumOfSquareDiff = sumOfSquareDiff + (cell.Value - mean) * (cell.Value - mean) End If Next cell sdExcludesZero = Application.sqrt(sumOfSquareDiff / count) End Function Function getRangeByYear(column As Integer, year As Integer) ... ... getRangeByYear = Range(Cells(startIndex, column), Cells(endIndex, column)) End Function
代码有一些问题。
-
getRangeByYear
返回Variant
而传递给sdExcludesZero
参数是Excel.Range
(因此,cell.Value
更改为cell
) - 而不是
Application.sqrt
使用Sqr
请参阅下面的代码。
Sub result() ' I can see the average MsgBox Application.Average(getRangeByYear(2, year)) ' Error is caused in here MsgBox sdExcludesZero(getRangeByYear(2, year)) End Sub 'Function meanExcludesZero(r As Excel.Range) Function meanExcludesZero(r As Variant) Dim count As Double Dim sum As Double For Each cell In r 'If cell.Value <> 0 Then If cell <> 0 Then count = count + 1 'sum = sum + cell.Value sum = sum + cell End If Next cell meanExcludesZero = sum / count End Function 'Function sdExcludesZero(r As Excel.Range) Function sdExcludesZero(r As Variant) Dim mean As Double mean = meanExcludesZero(r) Dim sumOfSquareDiff As Double, count As Double For Each cell In r 'If cell.Value <> 0 Then If cell <> 0 Then count = count + 1 'sumOfSquareDiff = sumOfSquareDiff + (cell.Value - mean) * (cell.Value - mean) sumOfSquareDiff = sumOfSquareDiff + (cell - mean) * (cell - mean) End If Next cell 'sdExcludesZero = Application.sqrt(sumOfSquareDiff / count) sdExcludesZero = Sqr(sumOfSquareDiff / count) End Function Function getRangeByYear(column As Integer, year As Integer) '... '... getRangeByYear = Range(Cells(startIndex, column), Cells(endIndex, column)) End Function
我已经评论了需要更改的行,并在其下面添加了新行。 如果有什么不清楚,请告诉我。
build议:而不是cell
使用任何其他variables名称。
编辑:你只需要将函数getRangeByYear
的返回types更改为Range
。 因此,使用,
Set getRangeByYear = Range(Cells(startIndex, column), Cells(endIndex, column))
代替
getRangeByYear = Range(Cells(startIndex, column), Cells(endIndex, column))
另一个改变是将取代
sdExcludesZero = Application.sqrt(sumOfSquareDiff / count)
同
sdExcludesZero = Sqr(sumOfSquareDiff / count)
请参阅下面的完整代码。
Sub result() ' I can see the average MsgBox Application.Average(getRangeByYear(2, year)) ' Error is caused in here MsgBox sdExcludesZero(getRangeByYear(2, year)) End Sub Function meanExcludesZero(r As Excel.Range) Dim count As Double Dim sum As Double For Each cell In r If cell.Value <> 0 Then count = count + 1 sum = sum + cell.Value End If Next cell meanExcludesZero = sum / count End Function Function sdExcludesZero(r As Excel.Range) Dim mean As Double mean = meanExcludesZero(r) Dim sumOfSquareDiff As Double, count As Double For Each cell In r If cell.Value <> 0 Then count = count + 1 sumOfSquareDiff = sumOfSquareDiff + (cell.Value - mean) * (cell.Value - mean) End If Next cell 'sdExcludesZero = Application.sqrt(sumOfSquareDiff / count) sdExcludesZero = Sqr(sumOfSquareDiff / count) End Function Function getRangeByYear(column As Integer, year As Integer) As Range '... '... Set getRangeByYear = Range(Cells(startIndex, column), Cells(endIndex, column)) End Function