Вопрос:
Я хочу рассчитать среднее значение столбца и поставить значение ниже.
Я написал этот код в 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 Лучший ответ:
Как отмечает @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