Изменение значений в особых интервалах.

Автор Ol Pre, 03.08.2017, 19:31

« назад - далее »

Ol Pre

Добрый день знатокам Excel!  :)
Столкнулся с задачей которую никак не могу решить...
Нужно изменить значения в интервалах таблицы. Решения кроме как через VBA, мне даже представить сложно... (хотя, может меня в этом поправят?  :)
Пример прилагается (там же и более подробное описание)...
Очень надеюсь на Вашу помощь... :)

boa

Здравствуйте, не совсем понятен алгоритм получения нужного результата.
Изменяются все значения в диапазоне кроме первого и последнего кратно количеству значений в диапазоне?
Или достаточно изменить только не соответствующее число?
Можете приложить файл с правильным("ручным") решением?
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Ol Pre

День добрый!
Значения должны измениться кратно во всём "проблемном" диапазоне...
Пример с тем, как должно быть - приложил.

boa

#3
Несколько сложновата для восприятия получилась формула, но все же:

Формула массива, для ввода нажать Ctrl+Shift+Enter
{=IF(AND(SUM(1*((INDIRECT("R"&LARGE(IF(R1C2:R[-1]C2="!";ROW(R1C2:R[-1]C2);"");1)&"C1:R"&SMALL(IF(R[1]C2:R34C2="!";ROW(R[1]C2:R34C2);"");1)-1&"C1";FALSE)
   -INDIRECT("R"&LARGE(IF(R1C2:R[-1]C2="!";ROW(R1C2:R[-1]C2);"");1)+1&"C1:R"&SMALL(IF(R[1]C2:R34C2="!";ROW(R[1]C2:R34C2);"");1)&"C1";FALSE)
)>0)
     )>0
;RC2<>"!")
    ;INDIRECT("R"&LARGE(IF(R1C2:R[-1]C2="!";ROW(R1C2:R[-1]C2);"");1)&"C1";FALSE)
+ROUND(
(INDIRECT("R"&SMALL(IF(R[1]C2:R34C2="!";ROW(R[1]C2:R34C2);"");1)&"C1";FALSE)
-INDIRECT("R"&LARGE(IF(R1C2:R[-1]C2="!";ROW(R1C2:R[-1]C2);"");1)&"C1";FALSE))
   /(SMALL(IF(R[1]C2:R34C2="!";ROW(R[1]C2:R34C2);"");1)
-LARGE(IF(R1C2:R[-1]C2="!";ROW(R1C2:R[-1]C2);"");1))
;0)
*(ROW()
-LARGE(IF(R1C2:R[-1]C2="!";ROW(R1C2:R[-1]C2);"");1))
    ;RC1)}


В файле я постарался показать как эта формула складывалась поэтапно.
Несколько не сходится с вашим результатом, но это из-за округления.
Если надо коэффициент кратный 2-м то подправьте функцию ROUND.

P.S. В файл добавил варианты для ROUND
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Ol Pre

Ух! Спасибо Вам добрый человек boa... Всё просто отлично!  :D
Добавил данное вычисление через макрос и полный вперёд!!!

boa

Пожалуйста, ;)
через макрос это можно было сделать проще
я показал, что результат можно и на формулах получить
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Ol Pre

Ну... Я собственно и предполагал, что это проще сделать через макрос. Да мне в принципе без разницы. Количество строк обычно не превышает 2000-3000. Так что и с формулой, в макросе работает "на раз"...
Формула конечно же жесть... Я так понял, что простые пути - не для вас?  ;)
С Уважением...

boa

Если кто-то сможет предложить более простое решение(путь), я с удовольствием его рассмотрю  ;).
Но в данном варианте я формулу не пытался упростить, ибо это требует дополнительного времени(а я ленивый ;)). Пошел в лоб.
Мне понравилась ваша задача своей неординарностью.
Ее решение доставило мне определенное удовольствие.
Ведь "Математика – гимнастика ума" (А.Суворов).
Как говорят на Украине "Був час і натхнення" ;)
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Ol Pre

Цитата: boa от 05.08.2017, 00:09
Ее решение доставило мне определенное удовольствие.

Признаюсь честно... Я Вам завидую... :)  (без сарказма...)
Удачи вам...

P.S. и да... ординарные задачи, мы и сами решать умеем... :)  (отсюда млин и зависть...)
Кстати сказать, могу подкинуть ещё одну неординарную... Готовы? :) (я с ней точно не справлюсь...)

boa

Цитата: Ol Pre от 06.08.2017, 00:32
могу подкинуть ещё одну неординарную
Создавайте, новую тему.
На данном форуме более десятка специалистов способных решать подобные задачи.
Если успею, помогу ;)
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Pelena

Ol Pre, можно так попробовать
=ЕСЛИ(ИНДЕКС($A3:$A$35;ЕСЛИОШИБКА(ПОИСКПОЗ(1=1;B3:$B$35="!";0);1))>=ИНДЕКС($A3:$A$35;ЕСЛИОШИБКА(ПОИСКПОЗ(1=1;B3:$B$35="!";0)-1;1));A3;I2+ОКРУГЛВНИЗ((ИНДЕКС($A3:$A$35;ПОИСКПОЗ(1=1;B3:$B$35="!";0))-ПРОСМОТР(;-1/($B$2:B2="!");$A$2:A2))/(ПОИСКПОЗ(1=1;B3:$B$35="!";0)+СТРОКА()-ПРОСМОТР(;-1/($B$2:B2="!");СТРОКА($A$2:A2))-1);0))
Результат отличается от Вашего, но условия все выполнены