【问题标题】:Excel VBA- Average all numeric cells in a worksheetExcel VBA-平均工作表中的所有数字单元格
【发布时间】:2013-06-19 05:48:42
【问题描述】:

我正在尝试创建一个宏来迭代工作表中所有使用的单元格并返回平均值。 最终目标是获取每个工作表中数字的平均值,并生成带有平均值的折线图。

我很难理解如何执行此操作。我现在的策略(这可能是次优的)涉及 a)找到具有数字数据的第一行; b) 找到具有数字数据的第一列; c) 找到带有数字数据的最后一行; d) 找到带有数字数据的最后一列; d) 在这些单元格上创建一个范围; e) 平均范围

这是我当前的代码

Sub AverageAllNumbers()
     Dim fRow As Long
     Dim fColumn As Long
     Dim lRow As Long
     Dim lColumn As Long
     Dim dblAverage As Long
     Dim averageRange As Range

    fRow = Cells.Find(What:=Number, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row
    fColumn = Cells.Find(What:=Number, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
    lRow = Cells.Find(What:=Number, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    lColumn = Cells.Find(What:=Number, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    averageRange = Range(Cells(fRow, fColumn), Cells(lRow, lColumn))

    dblAverage = Application.WorksheetFunction.Average(averageRange)
    MsgBox dblAverage

End Sub

几乎没有任何效果 - 'lColumn' 产生 16384,fRow 和 fColumn 产生 1,这在我的电子表格中甚至不是使用过的单元格。

发生了什么事?

【问题讨论】:

  • @pnuts 已在已删除的答案中提及。一个简单的替代方案可能只是Msgbox application.average(cells),我认为它只适用于使用的范围。
  • 为什么不使用=average(a:xfd)application.worksheetfunction.average(a:xfd)
  • @lori_m 和 Dean 有可行的解决方案。但我希望看到一个答案来解释为什么 Cells.Find 调用适用于 lRow 而不是其他人。
  • @pnuts - 我的意思是计算时只考虑使用的范围,因此引用整个工作表是可行的。对于 SUMPRODUCT 等其他函数,情况并非如此。
  • 看起来使用What:=Number 包括空白单元格作为数字......有时。对于 lColumn,在我制作的工作表上选择的 address 是“XFD1048576”,而为 lRow 选择的 address 是“XFD12”。我不确定根本为什么会这样。我没有超过单元格 L11 的数据。

标签: vba excel


【解决方案1】:

您是否尝试过使用Worksheet.UsedRange 属性?

Sub AverageAll()
    Dim average As Double
    Dim averageRange As Range

    ' Set averageRange to UsedRange; no need to find it ourselves.
    Set averageRange = ActiveSheet.UsedRange

    average = Application.WorksheetFunction.average(averageRange)
    MsgBox average
End Sub

它在一个测试用例中对我有用,尽管是微不足道的。

【讨论】:

    【解决方案2】:

    应该是单行:

    Sub SheetAverage()
        MsgBox Application.WorksheetFunction.Average(ActiveSheet.UsedRange)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多