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が行の一番上にいない限り、アクティブなセルがあった列の行からのみカウントされます。

また、コードには、ループの最初の反復でアクティブセルがカウントされないため、この値が平均から失われるというエラーがあります。

次の一連のコードで2つの問題を修正しましたが、次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

次のように、1行のコードで目的の結果を得ることができます。これは、平均化するセルが連続していて、空のセルがないことを前提としています。また、値はワークシートのこの最初の行から始まり、少なくとも2行の値が必要であると想定しています。

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 に答える