Страницы: 1
RSS
Как, с помощью формулы, автоматически посчитать количество ситуаций, которые показаны на графике?
 
Доброго времени суток.

Как автоматичестки посчитать сколько было ситуаций когда значение сначала коснулось 8, а после этого опустилось до 4 и по том снова поднялось до 8 и опять до 4 и тд.
Важна именно последовательность событий.
Если посчитать вручную, то здесь 7 таких ситуаций
Файл прилагается.
Изменено: Shadow.ua - 02.06.2018 23:09:53
 
Цитата
Shadow.ua написал:
коснулось 8, а после этого опустилось до 4 и по том снова поднялось до 8 и опять до 4 и тд.
Можно подробнее о коснулось?  Для наглядности лучше отметить желаемые события на графике.

Думаю не мне одному название темы не нравится. Оцениваем то не график, а значения таблицы
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Можно подробнее о коснулось?  Для наглядности лучше отметить желаемые события на графике.
Коснулось - достигло значения.
Порядок значений отметил на графике.

Насчёт таблицы, вы правы. Значения оцениваем из таблицы, только без графика сложно объяснить что и в каком порядке нужно. Для этого и приложил файл с графиком и таблицей.
 
Набросок, без оптимизации:
=СЧЁТ(1/(--ПРАВБ(
НАИМЕНЬШИЙ(ЕСЛИ(A1:A37>=8;СТРОКА(A1:A37)+0,8;ЕСЛИ(A1:A37<=4;СТРОКА(A1:A37)+0,4));СТРОКА(A1:A36))-НАИМЕНЬШИЙ(ЕСЛИ(A1:A37>=8;СТРОКА(A1:A37)+0,8;ЕСЛИ(A1:A37<=4;СТРОКА(A1:A37)+0,4));СТРОКА(A2:A37))
)=4))

Формула массива, ввод тремя клавишами
Логика: каждой строке, значение которой >=8 или <=4, прикрепляем справа 8 или 4. Строим сортированный по возрастанию массив. Если у рядом стоящих значений разница между правыми цифрами 4 - это оно.
СЧЕТ игнорирует ошибки и нули.
 
Спасибо за помощь. Есть чему поучиться.

Пока нужные результаты не смог получить.
Разложил Вашу формулу по действиям, как работает понял, но как добиться того что нужно пока не получилось придумать.

На Лист1 в книге, на графике, нарисовал недостаток. Добавил в файл Лист2 с другими данными и с ними считает некорректно.

Может поможете ещё, пожалуйста.
 
Вариант с доп столбцом.
По вопросам из тем форума, личку не читаю.
 
Работает. Спасибо.
Можно еще попросить Вас объяснить логику этой части ПРОСМОТР(2;1/($A$1:A2>=8);СТРОКА($A$1:A2))
С остальным разобрался. Тоже была идея что-то похожее сделать, только не знал как.
 
Цитата
Shadow.ua написал: На Лист1 в книге, на графике, нарисовал недостаток.
Не понял. Нужно и возрастание учитывать?

В файле и предложенная формула, и расчет вручную показывают одинаковый результат
 
Цитата
Не понял. Нужно и возрастание учитывать?
Изначально, в условии, я писал что находим сначала 8 и только после этого 4, а у Вас получилось что сначала 4, а потом 8.
С точки зрения тех данных, которые были в таблице, то результат не критичен. Он действительно совпадает. А когда увеличил количество данных и изменил сами данные, то формула посчитала некорректно. В файле есть пример.
Все равно благодарю за помощь))
 
Сначала 8, потом 4 - так и формула работает.

Ошибка понятна. В первом примере были целые числа. В последнем - дробные, проявляется ошибка стандарта вычислений с плавающей запятой. При разности двух чисел имеем массив значений:
{-1,4:-0,600000000000001:-2,4:-2:-0,6:-1:-2:-3:-1:-1:-1:-1:-1,4:-3:-2,6:-1:-1:-1:-1:-4:-5:-1:-2:-1:-1:-1,4:-1:-3,6:-4,4:-0,600000000000001...}
Как видим, правое число у этих значений не всегда на первой позиции после запятой.
Округлять нужно:
=СЧЁТ(1/(--ПРАВБ(ОКРУГЛ(
НАИМЕНЬШИЙ(ЕСЛИ(A1:A99>=$J$6;СТРОКА(A1:A99)+0,8;ЕСЛИ(A1:A99<=$J$7;СТРОКА(A1:A99)+0,4));СТРОКА(A1:A98))-
НАИМЕНЬШИЙ(ЕСЛИ(A1:A99>=$J$6;СТРОКА(A1:A99)+0,8;ЕСЛИ(A1:A99<=$J$7;СТРОКА(A1:A99)+0,4));СТРОКА(A2:A99))
;1))=4))

Результат - 13, показанный красными точками в файле - 12. Не сверял. То ли ошибка в ручном подсчете, то ли еще где-то в формуле неточность выплывает. Так как Вы разобрались в работе формулы, Вам домашнее задание - найти ошибку :)
Возможно, нужно округлить не разность, а вычитаемое и уменьшаемое по отдельности.
 
см.вложение
=countdown(A1:A37;8;4)

первым параметром пишете диапазон с данными, потом макс. и мин. значение между которыми, нужно фиксировать описанное Вами поведение данных (используйте любые значения не обязательно 8 и 4)
Изменено: Ігор Гончаренко - 03.06.2018 19:29:07
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Shadow.ua написал:
объяснить логику этой части ПРОСМОТР(2;1/($A$1:A2>=8);СТРОКА($A$1:A2))
https://www.planetaexcel.ru/techniques/25/664/
По вопросам из тем форума, личку не читаю.
 
Ігор Гончаренко, спасибо. Работает.

Хотел спросить, а значения для переменных в функцию Вы сразу забили для того чтобы если их не ввести, то она всё равно работала?
Я просто подумал что это тоже самое, только выдает ошибку если аргументы не введены:
Код
Function CountDown(rg As Range, Optional Ma, Optional Mi)
  Dim i&, j&, Up As Boolean
  For i = 2 To rg.Count
    If rg(i - 1) < Ma And rg(i) >= Ma Then Up = True
    If Up Then If rg(i) <= Mi Then CountDown = CountDown + 1: Up = False
  Next
End Function
Изменено: Shadow.ua - 04.06.2018 00:36:07
 
Shadow.ua, не первый ведь день на форуме - оформляйте код тегом.
 
Цитата
vikttur написал:
Ошибка понятна. В первом примере были целые числа. В последнем - дробные, проявляется ошибка стандарта вычислений с плавающей запятой.
Да уж, с округлениями мог бы и сам догадаться. Стыдно даже как-то ((

Нашёл еще один недостаток в формуле. Получается что в расчёты попали строки 31 и 35 при вычитании из которых тоже получалось значение 4, только не как дробное, а как целое, а функция ПРАВБ() возвращала значение как и для остальных совпадений. Это и был тот тринадцатый случай, которого по факту на графике нет.

Вот, допилил немного, теперь вроде правильно считает

=СЧЁТ(1/(--ПРАВБ(ОСТАТ(ABS(ОКРУГЛ(
НАИМЕНЬШИЙ(ЕСЛИ(A1:A99>=0,8;СТРОКА(A1:A99)+0,8;ЕСЛИ(A1:A99<=0,4;СТРОКА(A1:A99)+0,4));СТРОКА(A1:A99))-
НАИМЕНЬШИЙ(ЕСЛИ(A1:A99>=0,8;СТРОКА(A1:A99)+0,8;ЕСЛИ(A1:A99<=0,4;СТРОКА(A1:A99)+0,4));СТРОКА(A1:A99)-1);1));1))=4))

Спасибо за помощь  :)  
 
Цитата
Юрий М написал:  Shadow.ua , не первый ведь день на форуме - оформляйте код тегом.
Исправился ))

БМВ, спасибо за ссылку ))
 
да максимум и минимум планировались необязательными аргументами и правильно написать обьявление функции следовало так:
Код
Function CountDown(rg As Range, Optional Ma=8, Optional Mi=4)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
понятно. спасибо ))
 
Еще один простой вариант с доп. столбцом.
По вопросам из тем форума, личку не читаю.
 
Попробовал, тоже интересно. Спасибо  :)  
Страницы: 1
Наверх