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 

代码有一些问题。

  1. getRangeByYear返回Variant而传递给sdExcludesZero参数是Excel.Range (因此, cell.Value更改为cell
  2. 而不是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