Варианты 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В цикле перебираем все ячейки диапазона и проверяем, не равны ли их значения 0. Если равны, то добавляем номер дня в строку-результат, которую и возвращаем.
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
Вариант 8
Для книжных магазинов нужно вывести номера дней с максимальным объемом продаж.Текст функции
'Функция возвращает номера дней с максимальным объемом продаж
Public Function MaxDays(rng As Range) As StringПринимаем за максимум значение объема продаж в первый день недели, то есть в первой ячейке диапазона, переданного в функцию. Начинаем строку-результат с номера «1». Затем в цикле проверяем остальные ячейки диапазона и сравниваем с текущим максимумом. Если текущее значение больше максимального, то устанавливаем новый максимум и начинаем строку-результат снова, с текущего номера.
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
В конце функция возвращает строку с номерами дней.
Вариант 9
Необходимо определить динамику изменения стоимости продаж по дням недели. Функция должна возвращать «Рост», «Падение», «Колебание», «Постоянна» в зависимости от изменения стоимости в течение недели.Текст функции такой же, ка и во 2 варианте.
Public Function Динамика(rng As Range) As StringВведем две логические переменные, одна будет отвечать за рост (d_up), вторая за падение (d_down). Присваиваем им значения “false”. Если следующее значение больше предыдущего, то меняем значение d_up на “true”, если меньше предыдущего, то меняем значение d_down на true.
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
В конце, в зависимости от значений этих переменных, делаем вывод о характере изменения стоимости, то есть динамике, и возвращаем это значение.
Дополнительные материалы
Общий список всех сообщений по этой работе
