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

时间:2017-01-31 20:46:39

标签: excel vba

我尝试在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的范围时,结果会给出错误的平均数。我甚至都不知道如何计算这个数字。 谢谢你的帮助。

3 个答案:

答案 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之后,让它的工作方式与内置的平均功能完全相同