VBA Excel Макросы: Сглаживание

Автор drillbox, 10 сентября 2017, 03:45

drillbox

Всем доброго времени суток!

В столбце эксель задан временной ряд размерности 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
[свернуть]

drillbox

Все в принципе понятно, еще раз большое спасибо!
Только пару моментов хотелось бы уточнить

Что такое 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-кода куда-либо делайте у клавиатуры русский язык, чтобы не искажался русский текст.