代码存在一些问题。
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
我已评论需要更改的行,并在其下面添加新行。如果有什么不清楚,请告诉我。
意见建议:而不是cell
使用任何其他变量名称。
编辑:你只需要的功能getRangeByYear
返回类型更改为Range
。因此使用的,
Set getRangeByYear = Range(Cells(startIndex, column), Cells(endIndex, column))
代替
getRangeByYear = Range(Cells(startIndex, column), Cells(endIndex, column))
另一个变化将与
sdExcludesZero = Sqr(sumOfSquareDiff/count)
更换
sdExcludesZero = Application.sqrt(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
非常感谢。现在很清楚。对范围和变种的类型感到困惑 –
@PakHoCheung - 你只需要改变函数'getRangeByYear'的返回类型。请参阅编辑答案。 – Mrig
使用set有什么区别?这是否像内存分配? –