2013-02-15 592 views
2

我想計算一列的平均值並將其放在下面的值。
我寫在VBA這段代碼但返回值始終爲0Excel vba計算列的平均值

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 
+1

你假設ActiveCell設置正確,當宏開始;將其設置爲要求的範圍的頂部 – Tahbaza 2013-02-15 02:07:54

回答

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 
+1

我真的很感激它。 – 2013-02-16 23:37:58

+1

非常好。如果它的後面你可以接受答案:) – CuberChase 2013-02-17 00:00:52