创build一个函数来计算VBA中所选范围的平均值

我尝试在Excel中创build一个用户定义的函数。 为了得到任何选定范围的平均数,假设H2到H10的单元格范围,我创build了以下函数。

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 

但是,当我在单元格中input函数并selectH1到H10的范围时,结果会给出错误的平均数。 我甚至不知道这个数字是如何计算的。 谢谢您的帮助。

由于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 

在这里查看SpecialCells()方法

你的错误是col初始化,因为正确的forms是:

  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 

可能有点高级,但是这里有一个VBA平均function的更强大的版本,我希望可以帮助你学习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 

编辑testing和更新UDF后,得到它的工作完全像平均function内置