2

我想计算一列的平均值并将值放在下面。
我在 VBA 中编写了这段代码,但返回值始终为 0。

Sub Macro4()
'
' Macro4 Macro
'
' Keyboard Shortcut: Ctrl+Shift+C
Dim sum As Integer
Dim count As Integer
count = 0
sum = 0
Do While ActiveCell.Value <> ""
    ActiveCell.Offset(1, 0).Activate
    sum = sum + ActiveCell.Value
    count = count + 1
    Loop
ActiveCell.Value = sum / count
ActiveCell.Offset(0, 5).Select
Selection.End(xlUp).Select
Selection.End(xlUp).Select
End Sub
4

1 回答 1

3

正如@Tahbaza 指出的那样,除非您ActiveCell位于行的顶部,否则它只会从活动单元格所在的列中的行开始计数。

您的代码还有一个错误,即它不会在循环的第一次迭代中计算活动单元格,因此该值将从平均值中丢失。

我已经在下面的代码集中解决了这两个问题,但是如果没有下面的建议,还会有其他改进(即根本不使用Select)。

Sub Macro4()
   '
   ' Macro4 Macro
   '
   ' Keyboard Shortcut: Ctrl+Shift+C
   Dim sum As Integer
   Dim count As Integer
   count = 0
   sum = 0
   Selection.End(xlUp).Select              '<---Go to the top of the range
   Do While ActiveCell.Value <> ""
       sum = sum + ActiveCell.Value
       count = count + 1
       ActiveCell.Offset(1, 0).Activate    '<---Move down *after* you done the sumcount
   Loop
   ActiveCell.Value = sum / count
   ActiveCell.Offset(0, 5).Select
   Selection.End(xlUp).Select
   Selection.End(xlUp).Select
End Sub

您可以使用如下一行代码实现您想要的结果。这假设您希望平均的单元格是连续的并且没有空单元格。它还假定您的值从工作表的第一行开始,并且必须至少有两行值

Sub ColumnAverage()
    Cells(1, ActiveCell.Column).End(xlDown).Offset(1, 0).Value = Application.WorksheetFunction.Average(ActiveSheet.Columns(ActiveCell.Column))
End Sub

编辑:事实上,如果您不需要静态值,但可以在列的最后一个单元格中使用工作表函数公式。它有点像野兽,但如果你分解它应该是有道理的:

Sub ColumnAverageFormula()
    Cells(1, ActiveCell.Column).End(xlDown).Offset(1, 0).Formula = "=Average(" & Cells(1, ActiveCell.Column).Address(0, 0) & ":" & Cells(1, ActiveCell.Column).End(xlDown).Address(0, 0) & ")"
End Sub
于 2013-02-15T02:48:13.087 回答