Всем доброго времени суток!
В столбце эксель задан временной ряд размерности 50.
Провести сглаживание с окнами 2-х размеров.
Первая кнопка - окно равно 3, вторая - 5.
Результат сглаживания выводится в соседнем столбце.
И нужно построить график для столбца с исходными данными и для рассчитанного столбца.
Визуально это выглядит так (смотрите фото).
По диагонали - столбец с элементами, а желтым (+текущий оранжевый элемент) выделено окно.
Размер окна задается в ячейке экселя. Если окно "не вмещается", то оно сокращается до максимально допустимого.
Я сделал пример, как если бы надо было обработать не 50, а 10 элементов.
Графики просто постройте; графики будут автоматически меняться (без использования макроса).
Макрос
Sub макрос()
Dim rng As Range, RowsCount As Long, okno As Long, polokna As Long, min As Long
Dim i As Long, ii As Long, var
Dim top As Long, bot As Long
'1. Присваиваем фрагменту "A2:A51" имя "rng", чтобы было удобнее.
Set rng = Range("B2:C51")
'2. Запись кол-ва элементов в переменную, чтобы было удобнее ориентироваться в коде.
RowsCount = rng.Rows.Count
'3. Запись окна в переменную "okno", чтобы удобнее читать код.
okno = Range("G3").value
'4. Запись половины окна в переменную "polokna". Это кол-во элементов сверху и снизу от
' текущего элемента.
polokna = (okno - 1) / 2
'5. Функционал.
For i = 1 To RowsCount
'1) Подсчёт кол-ва элементов сверху от текущего элемента.
top = i - 1
'2) Подсчёт кол-ва элементов снизу от текущего элемента.
bot = RowsCount - i
'3) Выбор, где меньше элементов: сверху или снизу. Где меньше - то ограничивает.
If top <= bot Then
min = top
Else
min = bot
End If
'4) Если кол-во элементов больше полокна, то берётся полокна.
If min > polokna Then
min = polokna
End If
'5) Сброс переменной от предыдущего использования.
var = Empty
'6) Подсчёт суммы элементов, входящих в окно.
For ii = i - min To i + min
var = var + rng.Cells(ii, 1).value
Next ii
'7) Нахождение среднего.
var = var / (min * 2 + 1)
'8) Вставка расчёта в эксель.
rng.Cells(i, 2).value = var
Next i
End Sub
Все в принципе понятно, еще раз большое спасибо!
Только пару моментов хотелось бы уточнить
Что такое var, от чего мы его сбрасывали? Без Var = Empty сглаживание сбивается
При Cells(i,2) ответами заполняется третий, а не второй столбец, из-за того, что у нас rng=range(B2:C51)? Почему, кстати, именно такой диапазон?
Спойлер
' Cброс переменной от предыдущего использования.
var = Empty
' Подсчёт суммы элементов, входящих в окно.
For j = i - min To i + min
var = var + rng.Cells(j, 1).Value
Next j
'Вычисление среднего
var = var / (min * 2 + 1)
rng.Cells(i, 2).Value = var
В самом файле в ответе 1 есть макрос, который запускается кнопкой.
var - это просто переменная, как i. Никакой разницы нет, единственное разный тип данных: у var тип данных Variant, у i тип данных Long. Variant означает, что в переменной может быть любой тип данных: текст, числа и т.д.
Переменную var надо очищать для каждого элемента, т.к. в var записываются данные из var + 1.
Цитата:
При Cells(i,2) ответами заполняется третий, а не второй столбец, из-за того, что у нас rng=range(B2:C51)? Почему, кстати, именно такой диапазон?
Да, потому что используется не просто Cells(i,2), а rng.Cells(i,2).
Cells(i,2) относится к активному листу, а rng.Cells(i,2) относится к диапазону rng.
Почему именно такой диапазон? Потому что в столбце B находятся данные, а в столбец C вставляется результат. А какой должен быть диапазон по вашим соображениям?
Перед копирование vba-кода куда-либо делайте у клавиатуры русский язык, чтобы не искажался русский текст.