代码存在一些问题。
-
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 = 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