Страницы

суббота, 5 сентября 2015 г.

Пользовательские функции Часть 2-1 Excel продолжение

Варианты 1-3
Рассмотрим, как сделать 1-9 варианты работы по созданию и применению пользовательских функций в Excel. Подробное описание приведено по ссылке внизу (там, где нулевой вариант). Здесь только тексты функций.

Вариант 1

Нужно разработать функцию для вывода строки с номерами месяцев с выпуском больше среднемесячного.
'Функция возвращает номера месяцев с выпуском больше среднемесячного
Public Function Sred1(rng As Range) As String
Dim i As Integer        'счетчик цикла
Dim str As String       'строка с номерами месяцев
Dim sred As Double     'среднемесячный выпуск
Dim sum As Long      'общая сумма

str = ""
sum = 0
'суммируем все выпуски по строке
For i = 1 To rng.Columns.Count
    sum = sum + rng(1, i)
Next i
'находим среднее по всем выпускам
sred = sum / rng.Columns.Count

'цикл по всем месяцам диапазона
For i = 1 To rng.Columns.Count
'если значение больше среднего, то добавляем номер месяца в строку
    If CInt(rng(1, i)) > sred Then
        str = str + CStr(i) + " "
    End If
Next i
'если строка с номерами пустая, то возвращаем 0
If Len(Trim(str)) = 0 Then
    Sred1 = "0"
    'иначе возвращаем строку с номерами месяцев
    Else: Sred1 = str
End If
End Function
Сначала суммируем в цикле все суммы выпусков, затем делим их на количество месяцев и получаем среднее. Затем в цикле сравниваем все значения со средним. Если текущее значение больше среднего, то добавляем номер месяца в строку.
В конце смотрим, не пустая ли строка. Удаляем пробелы слева и справа (функция Trim) и определяем длину строки с помощью функции Len. Если она равна 0, то строка пуста. В этом случае возвращаем 0, иначе возвращаем строку с номерами месяцев.
Но это лишь пример, как сделать. Можно вернуть и пустую строку, если не нужен 0.
Затем можно добавить описание функции с помощью макро-опций (описано в предыдущем посте).

Вариант 2

С помощью пользовательской функции необходимо для каждой строки вывести характеристику динамики изменения выпуска в течение полугодия. В ячейках этого столбца должно отобразиться одно из слов: «Рост», «Падение», «Колебание», «Постоянен».
Текст функции:
Public Function Динамика(rng As Range) As String
    Dim d_up As Boolean             'логическая переменная - был ли рост
    Dim d_down As Boolean           'логическая переменная - было ли падение
    Dim i As Integer                'счетчик цикла
    Dim p As Integer                'переменная для сравнения значений массива
           
    'присваиваем начальные значения логическим переменным
    d_up = False
    d_down = False

    'первое значения для сравнения
    p = rng(1, 1)
        'в цикле сравниваем последовательно элементы строки
    'если следующий элемент больше, чем предыдущий, значит, был рост
    'если следующий элемент меньше, чем предыдущий, значит, было падение
    'если они равны, то значения постоянны
    For i = 2 To rng.Columns.Count
        If p < rng(1, i) Then
            d_up = True
        ElseIf p > rng(1, i) Then
            d_down = True
        End If
        p = rng(1, i)
    Next i
    'если был рост и падение, то возвращаем Колебание
    If (d_up = True) And (d_down = True) Then
        Динамика = "Колебание"
        'если не было ни роста, ни падения, то возвращаем Постоянен
    ElseIf (d_down = False) And (d_up = False) Then
        Динамика = "Постоянен"
        'если не было падения, а только рост и постоянство (или только рост), то возвращаем Рост
    ElseIf d_down = False Then
        Динамика = "Рост"
        'Если не было роста, а только падение и постоянство (или только падение), то возвращаем Падение
    ElseIf d_up = False Then
        Динамика = "Падение"
    End If
End Function
Введем логические переменные – d_up и d_down, которые будут обозначать рост и падение.
В цикле будем сравнивать по очереди элементы друг с другом. В зависимости от соотношения пар элементов будем менять значения логических переменных.
Затем по их значениям определяем динамику.

Вариант 3

Нужно создать и заполнить таблицу с книжными магазинами, книгами и недельными продажами. Затем создать функцию, с помощью которой для каждой строки вывести номера недель с минимальным объемом продаж (таких номеров может быть несколько). Если номеров несколько, то они должны разделяться пробелом.
Текст функции:
'Функция возвращает номера недель с минимальным объемом продаж
Public Function MinWeek(rng As Range) As String
Dim i As Integer        'счетчик цикла
Dim str As String       'строка с номерами недель
Dim min As Integer     'минимальный объем продаж
'начинаем с первого дня
str = "1"
'устанавливаем минимум как объем 1 недели
min = CInt(rng(1, 1))
'цикл по всем неделям диапазона
For i = 2 To rng.Columns.Count
'если минимум больше текущего значения, то устанавливаем новый
'минимум и начинаем строку с номерами сначала
    If min > CInt(rng(1, i)) Then
        min = CInt(rng(1, i))
        str = CStr(i)
    'если минимум равен текущему значению, то нужно в строку
    'добавить номер еще одной недели
    ElseIf min = CInt(rng(1, i)) Then str = str + " " + CStr(i)
    End If
Next i
'если продаж не было в течение всего периода, то возвращаем 0
If Len(Trim(str)) = 0 Then
    MinWeek = "0"
    'иначе возвращаем строку с номерами дней
    Else: MinWeek = str
End If
End Function
В цикле перебираем все ячейки строки и сравниваем с текущим минимумом. Если значение меньше минимума, то установим новый минимум и начнем строку снова, с номера текущей недели. За самый первый минимум примем значение первой недели.
Если строка пустая (то есть ее длина без правого и левого пробелов равна 0), то возвращаем 0, иначе возвращаем всю строку.

Дополнительные материалы


Общий список всех сообщений по этой работе