Страницы: 1
RSS
Разнесение и подсчёт количества серий из цифр в строке, количества цифр и их сумм в заданном диапазоне
 
Всем добрый день! Не могу придумать макросы для разнесения и подсчёта количества серий из цифр в строке, количества цифр и их сумм в заданном диапазоне. Задача: обеспечить автоматический подсчёт и разнесение по столбцам серий цифр и количества, а так же их сумм при следующих условиях:
1. если в заданном диапазоне в ячейке есть значение 24 (или более) и в предыдущей или последующей ячейке значение больше нуля, то в столбце "Более 24, количество, шт" (А12) должно отразиться количество таких серий,  а  в столбце "Более 24, продолжительность, час" (В12) сумма значений.
2. если в заданном диапазоне в ячейке есть значение 24  и в предыдущей или последующей ячейке пусто (или 0), в ячеках подряд или не подряд значения менее 24, то в столбце "Менее 24, количество, шт" (С12) должно отразиться количество таких ячеек,  а  в столбце "Менее 24, продолжительность, час" сумма значений (D12).

*Для ячеек А12 макрос имеется, вроде работает
** Для ячеек В12 макрос писал, но он кривой, считает только первые значения, вообще его как и нет лучше считать.

Люди знающие, умеющие, помогите!
 
Реализовал как понял:
Если подряд сумма часов превышает 24, то считаем ее как вариант 1, если не превышает, то как вариант2
поэтому подряд 2+2 или 3+3 это одна серия, но суммарно менее 24, возможно нужно как то иначе реализовать
 
не совсем, 1-вариант верно, если превышает 24 часа подряд, то серия (т.е. 2424245 - это 1 серия сумма 77),
а второй вариант не серии, а числа...т.е. 24 5 6 - это 3 числа, сумма 35

т.е. если в строке идёт 24245 6 7 24 - то 1 серия сумма 53 и 3 числа сумма 47

с разнесением по столбцам

вроде понятно....
 
Сумму на 24 сделал, а вот п.2 ни кол-во ни сумма пока не соображу.
Хотя и в варианте нет проверки что не будет 24:3:24

Код
Function fnСерииЦифрСумма(r As Range, НачалоПериода&, КонецПериода&)
    Dim i&, s&, arrZn()
    Dim b As Boolean
    arrZn = r.Value
    For i = НачалоПериода& To КонецПериода&
        If arrZn(1, i) >= 24 Then
            If arrZn(1, i + 1) > 0 Or arrZn(1, i - 1) > 0 Then
                s = s + arrZn(1, i)
                If arrZn(1, i + 1) < 24 Then s = s + arrZn(1, i + 1)
                If arrZn(1, i - 1) < 24 Then s = s + arrZn(1, i - 1)
            End If
        End If
    Next i
    fnСерииЦифрСумма = s
End Function
 
Цитата
Peet написал:
т.е. если в строке идёт 24245 6 7 24 - то 1 серия сумма 53 и 3 числа сумма 47
у меня получается 6 + 7 + 24 = 37, а не 47

В принципе, моя функция так и считает
Изменено: MCH - 24.11.2020 17:15:46
 
Подогнал под Ваши значения:(
Изменено: Igor67 - 24.11.2020 17:52:29
 
не нужно жать на кнопку цитирования только пому, что она есть [МОДЕРАТОР]

Игорь, всё работает, почти всё....если в первую ячейку (за первое число) ввести значение, то всё ломается((((
Это возможно исправить?
 
Поставил проверку на начало и конец диапазона данных. Но у вас есть серия 24,2,1 - ее обрабатывает как 1 - 24 и 1 меньше 24.
 
Igor67,Вы о том, что если в первой и второй ячейке 24 то в сумму не идёт? При серии 24, 24 и т.д., первое значение в сумму не идёт....почему-то(((
А вообще Igor67, просто СУПЕР!!!

...и последнее значение не учитывает, если 31 число
 
А так?
 
Igor67,почти...с 30-31 числом что-то не совсем...
 
Поправил. Просто не в то место вставил условие.
Изменено: Igor67 - 27.11.2020 14:10:28
 
Если в первую ячейку поставить 24, то сумма возникает в "Более 24"...а её там быть не должно
 
Проверяйте.
 
Igor67, всё считает как надо и как хотелось. ОГРОМНОЕ ВАМ СПАСИБО! ВОСХИЩЁН ВАШИМИ СПОСОБНОСТЯМИ!
Ещё раз СПАСИБО!
 
Igor67,только ещё один нюанс, что надо поменять в функции, чтобы подсчёт был до 1 знака после запятой, без округления?
 
Поменять тип данных, или просто убрать их определение и тогда он будет выбираться автоматически.
Скрытый текст

Изменено: Igor67 - 01.12.2020 15:37:24
 
Igor67,а конкретно в Ваших функциях это как будет выглядеть?
 
Замените  строчку   Dim i&, s, arrZn()
или просто уберите знак & после s
 
Igor67,спасибо, а то сам бы очень долго бы искал....и не нашёл бы
 
Цитата
Peet написал:
подсчёт был до 1 знака после запятой, без округления?
Вот только не понятно что это такое. Если у Вас будет 1,1 - то так и посчитает. А вот 1,15 - будет считать как 1,2.

И как это побеждать это следующий вопрос.
 
Igor67,а это побеждать не придётся, во всяком случае, в том проекте, который мы с Вами делаем))))
там идёт подсчёт часов и достаточно 1 знака после запятой, большая точность не требуется.
Ещё раз СПАСИБО!
 
Решение в лоб.
 
Да, более чем даже изначально в задаче представлялось....НЕТ ПРЕДЕЛА СОВЕРШЕНСТВУ!
 
Всем добрый день! Igor67 написал и отшлифовал великолепные макросы для разнесения и подсчёта количества серий из цифр в строке, количества цифр и их сумм в заданном диапазоне.
Сейчас выполняется автоматический подсчёт и разнесение по столбцам серий цифр и количества, а так же их сумм при следующих условиях:
1. если в заданном диапазоне в ячейке есть значение 24 (или более) и в предыдущей или последующей ячейке значение больше нуля, то в столбце "Более 24, количество, шт" (А12) должно отразиться количество таких серий,  а  в столбце "Более 24, продолжительность, час" (В12) сумма значений.
2. если в заданном диапазоне в ячейке есть значение 24  и в предыдущей или последующей ячейке пусто (или 0), в ячеках подряд или не подряд значения менее 24, то в столбце "Менее 24, количество, шт" (С12) должно отразиться количество таких ячеек,  а  в столбце "Менее 24, продолжительность, час" сумма значений (D12).

Прошу помочь доработать данные макросы в части сопоставления двух строк план и факт, т.е.:
1.  если в заданном диапазоне верхней и нижней строки в ячейках есть значение 24 (или более) и в предыдущей или последующей ячейке значение больше нуля, то в столбце "Более 24, количество, шт" (Е12) и (F12) "Менее 24 по плану/количество/продолжительность) ничего не должно быть.
2. если в заданном диапазоне  верхней и нижней строки в ячейках есть значение 24  и в предыдущей или последующей ячейке пусто (или 0), в ячеках подряд или не подряд значения менее 24, и в ячейках верхней и нижней не пусто, тогда в столбце "Менее 24 по плану, количество, шт" (Е12) должно отразиться количество таких ячеек,  а  в столбце "Менее 24 по плану, продолжительность, час" сумма значений (F12).
Сложно объяснить, но на пальцах необходимо добавить сравнения по вертикали, т.е. в таблице:
5 числа при плане 3 было 5, идет в количество и сумму;
7 числа при плане 5 было 0, никуда не идёт;
10 числа при плане 5 было 5, идет в количество и сумму;
Тогда суммарно в Е12 - 2, F12 - 10
....как-то так

Люди знающие, умеющие, помогите!
 
Peet,сообщение видел. Сейчас нет времени. А кроме того пока не понял что хотите. Написано много, но я и в первый раз не понял задачу и просто подгонял результат. А сейчас кроме того, что надо как то сопоставить план-факт не понял ни чего. Для серии 24 ни чего не надо? А если в серии 24 план и факт будет различаться? Сделайте несколько вариантов примеров данных и покажите какой должен быть результат.

ПС быстрого ответа не обещаю..
 
Igor67, я попытался изменить Ваш модуль 1 для сравнения плана и факта, вроде работает, хоть и написал криворуко и рукопопа, если получится, хотелось бы. чтоб он стал человеческий. Про серию 24, да она должна работать, вроде даже работает. Про сумму в сериях пока ваще не получается. Сама идея заключается в том, чтобы  сосчитать факт соответствующий плану, т.е. по плану событие или нет, к учёту идёт, то что по плану.

Соответствие значений не важно, т.е. если планировали 1 час, а фактически было 3, то 1 серия. Если не планировали, то к учёту не идёт.

В примере: 1 группа строк - факт по плану по сериям "более 24 по плану"  - 2 серии сумма  56, по "менее 24 по плану" - 4 сумма 13.
                      2 группа строк - факт по плану по сериям "более 24 по плану"  - 1 серия сумма  29, по "менее 24 по плану" - 0 сумма 0
                      3 группа строк - факт по плану по сериям "более 24 по плану"  - 0 серий сумма  0, по "менее 24 по плану" - 2 сумма 3.

* сумма в примере не считается (красным)
 
Смотрите вариант. Обратите внимание - диапазон ПЛАН-ФАКТ передается в один массив. Выбор идет по "строкам" 1 или 2. Под ваши данные считает, но не знаю правильно или нет. Проверяйте.
Страницы: 1
Наверх