Варианты 1-3
Рассмотрим, как сделать 1-9 варианты работы по созданию и применению пользовательских функций в Excel. Подробное описание приведено по ссылке внизу (там, где нулевой вариант). Здесь только тексты функций.
'Функция возвращает номера месяцев с выпуском больше среднемесячного
В конце смотрим, не пустая ли строка. Удаляем пробелы слева и справа (функция Trim) и определяем длину строки с помощью функции Len. Если она равна 0, то строка пуста. В этом случае возвращаем 0, иначе возвращаем строку с номерами месяцев.
Но это лишь пример, как сделать. Можно вернуть и пустую строку, если не нужен 0.
Затем можно добавить описание функции с помощью макро-опций (описано в предыдущем посте).
Текст функции:
В цикле будем сравнивать по очереди элементы друг с другом. В зависимости от соотношения пар элементов будем менять значения логических переменных.
Затем по их значениям определяем динамику.
Текст функции:
Если строка пустая (то есть ее длина без правого и левого пробелов равна 0), то возвращаем 0, иначе возвращаем всю строку.
Общий список всех сообщений по этой работе
Рассмотрим, как сделать 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Введем логические переменные – d_up и d_down, которые будут обозначать рост и падение.
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
В цикле будем сравнивать по очереди элементы друг с другом. В зависимости от соотношения пар элементов будем менять значения логических переменных.
Затем по их значениям определяем динамику.
Вариант 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, иначе возвращаем всю строку.
Дополнительные материалы
Общий список всех сообщений по этой работе
