我尝试在Excel中创建用户定义的函数。为了得到任何选定范围的平均数,让我们说H2到H10的单元格范围,我创建了以下函数。
Function avg(rng As Range) As Single
Dim i%, nrow%, col%
Dim sum As Single
nrow = rng.Rows.Count
col = rng.Column
sum = 0
For i = 1 To nrow
sum = sum + Cells(i, col).Value
Next i
avg = sum / nrow
End Function
但是,当我在单元格中输入函数并选择H1到H10的范围时,结果会给出错误的平均数。我甚至都不知道如何计算这个数字。 谢谢你的帮助。
答案 0 :(得分:1)
由于OP愿意熟练使用VBA,因此看到原始代码中的错误可能对他有用
Function avg(rng As Range) As Single
Dim cell As Range
Dim sum As Double
For Each cell In rng.SpecialCells(xlCellTypeConstants, xlNumbers) '<--| loop through each single cell of passed range that contains a number
sum = sum + cell.Value '<--| update sum
Next
avg = sum / rng.Count '<--| return average
End Function
请参阅here了解SpecialCells()
方法
答案 1 :(得分:0)
您的错误在于col
初始化,因为正确的形式是:
col=rng.columns.count
此代码完美无缺:
Option Base 1
Function avg(rng As Range) As Single
Dim i%, nrow%, ncol%, j%
Dim sum As Single
nrow = rng.Rows.Count
ncol = rng.Columns.Count
sum = 0
For i = 1 To nrow
For j = 1 To ncol
sum = sum + rng(i, j)
Next j
Next i
avg = sum / (nrow * ncol)
End Function
答案 2 :(得分:0)
可能有点高级,但这是VBA平均功能的更强大的版本,我希望能帮助你学习VBA:
Public Function AverageVBA(ParamArray vValues() As Variant) As Variant
Dim vValue As Variant
Dim vSubValue As Variant
Dim dSum As Double
Dim lCount As Long
dSum = 0
lCount = 0
For Each vValue In vValues
If IsArray(vValue) Or TypeName(vValue) = "Collection" Or TypeName(vValue) = "Range" Then
For Each vSubValue In vValue
If IsNumeric(vSubValue) And Len(vSubValue) > 0 Then
lCount = lCount + 1
dSum = dSum + vSubValue
End If
Next vSubValue
Else
If IsNumeric(vValue) And Len(vValue) > 0 Then
lCount = lCount + 1
dSum = dSum + vValue
End If
End If
Next vValue
If lCount = 0 Then
AverageVBA = CVErr(xlErrDiv0)
Else
AverageVBA = dSum / lCount
End If
End Function
编辑在测试和更新UDF之后,让它的工作方式与内置的平均功能完全相同