【发布时间】: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 的数据。