我想计算一列的平均值并将值放在下面 我在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
答案 0 :(得分: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