Как автоматичестки посчитать сколько было ситуаций когда значение сначала коснулось 8, а после этого опустилось до 4 и по том снова поднялось до 8 и опять до 4 и тд. Важна именно последовательность событий. Если посчитать вручную, то здесь 7 таких ситуаций Файл прилагается.
БМВ написал: Можно подробнее о коснулось? Для наглядности лучше отметить желаемые события на графике.
Коснулось - достигло значения. Порядок значений отметил на графике.
Насчёт таблицы, вы правы. Значения оцениваем из таблицы, только без графика сложно объяснить что и в каком порядке нужно. Для этого и приложил файл с графиком и таблицей.
Набросок, без оптимизации: =СЧЁТ(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)) С остальным разобрался. Тоже была идея что-то похожее сделать, только не знал как.
Изначально, в условии, я писал что находим сначала 8 и только после этого 4, а у Вас получилось что сначала 4, а потом 8. С точки зрения тех данных, которые были в таблице, то результат не критичен. Он действительно совпадает. А когда увеличил количество данных и изменил сами данные, то формула посчитала некорректно. В файле есть пример. Все равно благодарю за помощь))
Ошибка понятна. В первом примере были целые числа. В последнем - дробные, проявляется ошибка стандарта вычислений с плавающей запятой. При разности двух чисел имеем массив значений: {-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. Не сверял. То ли ошибка в ручном подсчете, то ли еще где-то в формуле неточность выплывает. Так как Вы разобрались в работе формулы, Вам домашнее задание - найти ошибку Возможно, нужно округлить не разность, а вычитаемое и уменьшаемое по отдельности.
первым параметром пишете диапазон с данными, потом макс. и мин. значение между которыми, нужно фиксировать описанное Вами поведение данных (используйте любые значения не обязательно 8 и 4)
Хотел спросить, а значения для переменных в функцию Вы сразу забили для того чтобы если их не ввести, то она всё равно работала? Я просто подумал что это тоже самое, только выдает ошибку если аргументы не введены:
Код
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
vikttur написал: Ошибка понятна. В первом примере были целые числа. В последнем - дробные, проявляется ошибка стандарта вычислений с плавающей запятой.
Да уж, с округлениями мог бы и сам догадаться. Стыдно даже как-то ((
Нашёл еще один недостаток в формуле. Получается что в расчёты попали строки 31 и 35 при вычитании из которых тоже получалось значение 4, только не как дробное, а как целое, а функция ПРАВБ() возвращала значение как и для остальных совпадений. Это и был тот тринадцатый случай, которого по факту на графике нет.
Вот, допилил немного, теперь вроде правильно считает