Страницы

понедельник, 7 сентября 2015 г.

Пользовательские функции Часть 2-1 Excel Окончание

Варианты 4-9

Продолжаем работу с пользовательскими функциями VBA.

Вариант 4

В этом задании нужно определить номера дней недели с отработкой больше 8 часов. Очень простая функция – в цикле перебираем все элементы диапазона, переданного в функцию. Если значение в ячейке больше 8, то номер добавляем в строку – результат.
Текст функции:
Public Function otrabotka(rng As Range) As String
Dim i As Integer        'счетчик цикла
Dim str As String    'строка с номерами дней

'пустая строка
str = ""
'цикл проверки всех дней недели
For i = 1 To rng.Columns.Count
    'если значение в ячейке больше 8,
    'то добавляем номер ячейки в строку
    If rng.Cells(1, i) > 8 Then
        str = str + CStr(i) + " "
    End If
Next i
'возврат строки с номерами дней
otrabotka = str
End Function

Вариант 5

Нужно вывести номера дней с максимальной дневной отработкой для каждого сотрудника.
Текст функции
Public Function MaxOtrabotka(rng As Range) As String
Dim i As Integer        'счетчик цикла
Dim str As String    'строка с номерами дней
Dim max As Integer     'максимальная отработка

'первоначальное значение максимума
max = rng.Cells(1, 1)
'первый день
str = "1"
'цикл проверки остальных дней
For i = 2 To rng.Columns.Count
    'если установленный максимум меньше текущего значения,
    'то максимум изменяется и устанавливается новое значение строки с номерами
    If max < rng.Cells(1, i) Then
        max = rng.Cells(1, i)
        str = CStr(i)
    'если установленный максимум равен текущему значению,
    'то номер дня добавляется в строку с номерами дней
    ElseIf max = rng.Cells(1, i) Then str = str + " " + CStr(i)
    End If
Next i
'возврат строки с номерами дней
MaxOtrabotka = str
End Function
Принимаем за максимум значение первого дня недели (это первая ячейка в диапазоне, который передается в функцию).
Зачем в цикле перебираем остальные дни и сравниваем с максимумом. Если максимум меньше, то устанавливаем новое значение и начинаем заполнять строку заново – с этого номера дня.
В конце возвращаем строку с номерами дней.

Варианты 6 и 7

В этих заданиях разные таблицы, но сделать нужно одно и то же, поэтому опишу только один раз. Необходимо вывести нерабочие дни недели. То есть отработка должна быть равна 0.
Текст функции:
Public Function otrabotka0(rng As Range) As String
Dim i As Integer        'счетчик цикла
Dim str As String    'строка с номерами дней

'пустая строка
str = ""
'цикл проверки всех дней недели
For i = 1 To rng.Columns.Count
    'если значение в ячейке равно 0,
    'то добавляем номер ячейки в строку
    If rng.Cells(1, i) = 0 Then
        str = str + CStr(i) + " "
    End If
Next i
'возврат строки с номерами дней
otrabotka0 = str
End Function
В цикле перебираем все ячейки диапазона и проверяем, не равны ли их значения 0. Если равны, то добавляем номер дня в строку-результат, которую и возвращаем.

Вариант 8

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

Вариант 9

Необходимо определить динамику изменения стоимости продаж по дням недели. Функция должна возвращать «Рост», «Падение», «Колебание», «Постоянна» в зависимости от изменения стоимости в течение недели.
Текст функции такой же, ка и во 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). Присваиваем им значения “false”. Если следующее значение больше предыдущего, то меняем значение d_up на “true”, если меньше предыдущего, то меняем значение d_down на true.
В конце, в зависимости от значений этих переменных, делаем вывод о характере изменения стоимости, то есть динамике, и возвращаем это значение.

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


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