Здравствуйте, задача просуммировать время простоя оборудования по данным следящей системы, фиксирующей момент отключения (начало простоя) и момент включения (конец простоя) для каждого станка. При этом нужно учесть перекрытие - если одновременно стоят несколько станков, то считать не сумму простоя каждого станка, а время от момента когда встал первый из группы до времени когда заработал последний из группы - это меньше вроде начал что-то через логические зависимости строить, но как то многовато условий в строке пр2 просматривается на месте "если...". Посоветуйте, пожалуйста, может другой путь есть. Данные сортированы по убыванию «начало простоя».
Здравствуйте, задача просуммировать время простоя оборудования по данным следящей системы, фиксирующей момент отключения (начало простоя) и момент включения (конец простоя) для каждого станка. При этом нужно учесть перекрытие - если одновременно стоят несколько станков, то считать не сумму простоя каждого станка, а время от момента когда встал первый из группы до времени когда заработал последний из группы - это меньше вроде начал что-то через логические зависимости строить, но как то многовато условий в строке пр2 просматривается на месте "если...". Посоветуйте, пожалуйста, может другой путь есть. Данные сортированы по убыванию «начало простоя».hrnv
Nic70y, получается общее время от первого стопа до последнего пуска. тоже самое, что =B2-A11 фактически бОльшую часть времени все станки работают, иногда один встает, иногда несколько. И только в последнем случае учитываем перекрытие времени. А виден этот случай - из сравнивания концов соседних временнЫх отрезков - там где в D:G получается Истина - там перекрытие.
Nic70y, получается общее время от первого стопа до последнего пуска. тоже самое, что =B2-A11 фактически бОльшую часть времени все станки работают, иногда один встает, иногда несколько. И только в последнем случае учитываем перекрытие времени. А виден этот случай - из сравнивания концов соседних временнЫх отрезков - там где в D:G получается Истина - там перекрытие.hrnv
[/vba] Перечисленные диапазоны как бы соответствуют вашим черным заливкам в таблице (смотрите по колонкам листа), а результат третьей формулы - двум рыжим заливкам T1 и T2.
Идея в том, чтобы смоделировать секунды или минуты ячейками рабочего листа. Далее можно не совсем традиционно применить операции Union или Intersect и эффектно получить простое решение задачи без программирования достаточно утомительной в данном случае традиционной логики.
[/vba] Перечисленные диапазоны как бы соответствуют вашим черным заливкам в таблице (смотрите по колонкам листа), а результат третьей формулы - двум рыжим заливкам T1 и T2.
Идея в том, чтобы смоделировать секунды или минуты ячейками рабочего листа. Далее можно не совсем традиционно применить операции Union или Intersect и эффектно получить простое решение задачи без программирования достаточно утомительной в данном случае традиционной логики.
На формулах со вспом. столбцами: Во вспомогательных ст-цах считаем число отключённых на момент начала и конца. Потом суммируем только то время, когда отключённых нет.
На формулах со вспом. столбцами: Во вспомогательных ст-цах считаем число отключённых на момент начала и конца. Потом суммируем только то время, когда отключённых нет.Формуляр
Объем - от 500 до 1500 строк. Интервал времени - сутки. Вот идея осенила И если уж без программирования не обойтись, то может создать логический массив длиной в сутки = 86400секунд и просматривая строки листа менять на истину элементы массива, соответствующие секундам простоя. Ну и пусть хоть 2минуты считает, да хоть и 5мин. Зато надежно. Сам к сожалению на VBA только со стороны поглядываю.
Объем - от 500 до 1500 строк. Интервал времени - сутки. Вот идея осенила И если уж без программирования не обойтись, то может создать логический массив длиной в сутки = 86400секунд и просматривая строки листа менять на истину элементы массива, соответствующие секундам простоя. Ну и пусть хоть 2минуты считает, да хоть и 5мин. Зато надежно. Сам к сожалению на VBA только со стороны поглядываю.hrnv
MCH, Мощно, слов нет. Такой длинный код. И даже правильно посчитал, но только 1 раз, к сожалению (на 1 листе). Дело в том, что время обеда в простоях не учитывается. Формулами учел обед на соседнем листе - и тут функция стала слегка обманывать. Ума не приложу, почему. Попробовал в аргументах оставить только значения - не помогло. Может я что не так делаю?
MCH, Мощно, слов нет. Такой длинный код. И даже правильно посчитал, но только 1 раз, к сожалению (на 1 листе). Дело в том, что время обеда в простоях не учитывается. Формулами учел обед на соседнем листе - и тут функция стала слегка обманывать. Ума не приложу, почему. Попробовал в аргументах оставить только значения - не помогло. Может я что не так делаю?hrnv
Формуляр, Хорошая идея, чем учитывать черные полоски с перекрытием - лучше белые просветы посчитать и отнять от общего интервала. Только вот края просветов на мой взгляд определить столь же затруднительно как и учесть перекрытие. Сделал тестовый файл - с соответствием рисунка и данных и разными вариантами перекрытия - prostoy_test.xlsm. Отсортировал как в Вашем варианте (первый столбец - по возрастанию) подставил, считает неправильно.
Формуляр, Хорошая идея, чем учитывать черные полоски с перекрытием - лучше белые просветы посчитать и отнять от общего интервала. Только вот края просветов на мой взгляд определить столь же затруднительно как и учесть перекрытие. Сделал тестовый файл - с соответствием рисунка и данных и разными вариантами перекрытия - prostoy_test.xlsm. Отсортировал как в Вашем варианте (первый столбец - по возрастанию) подставил, считает неправильно.hrnv
И ещё один вариант придумался, но тоже на VBA. Если идти в порядке возрастания времени (снизу вверх), то нижняя строка содержит время начала tn1 и время конца tk1, строка над ней tn2 и tk2 и т.д. Идем снизу вверх и считаем тоже. Данные записаны так, что априори tn1<= tn2 Если tk1<tn2 – второй отрезок начался после конца первого - перекрытия нет, переходим на строку выше и работаем с парой 2-3 Иначе, второй отрезок начался внутри первого и возможны 2 варианта расположения конца второго отрезка – до конца первого или после. Если конец второго до конца первого – то первый полностью перекрывает второго – строку, содержащую второй отрезок – удаляем Если конец второго после конца первого – удлиняем конец первого , после чего строку, содержащую второй отрезок – удаляем. И начинаем сравнивать первую строку с новой второй строкой.
Если tk1>=tn2 и tk2>tk1, то tk1:= tk2 , удаляем строку 2, сравниваем новую пару 1 и 2 Если tk1>=tn2 и tk2<=tk1, то удаляем строку 2, сравниваем новую пару 1 и 2 Если tk1<tn2, то сравниваем пару 2 и 3
И ещё один вариант придумался, но тоже на VBA. Если идти в порядке возрастания времени (снизу вверх), то нижняя строка содержит время начала tn1 и время конца tk1, строка над ней tn2 и tk2 и т.д. Идем снизу вверх и считаем тоже. Данные записаны так, что априори tn1<= tn2 Если tk1<tn2 – второй отрезок начался после конца первого - перекрытия нет, переходим на строку выше и работаем с парой 2-3 Иначе, второй отрезок начался внутри первого и возможны 2 варианта расположения конца второго отрезка – до конца первого или после. Если конец второго до конца первого – то первый полностью перекрывает второго – строку, содержащую второй отрезок – удаляем Если конец второго после конца первого – удлиняем конец первого , после чего строку, содержащую второй отрезок – удаляем. И начинаем сравнивать первую строку с новой второй строкой.
Если tk1>=tn2 и tk2>tk1, то tk1:= tk2 , удаляем строку 2, сравниваем новую пару 1 и 2 Если tk1>=tn2 и tk2<=tk1, то удаляем строку 2, сравниваем новую пару 1 и 2 Если tk1<tn2, то сравниваем пару 2 и 3hrnv
MCH, приношу извинения так лихо перерывы в работе учел - аж самому смешно - понял только когда сам процедуру написал. Ваша функция прекрасно работает, если разберусь, поправлю, чтобы время перерывов снималось,а скорее всего его достаточно просто вычитать. Огромное спасибо за помощь! Прицепляю рабочий лист с журнала отключений (часть строк удалил чтобы в 100kb поместилось) - все прекрасно работает С уважением, hrnv
MCH, приношу извинения так лихо перерывы в работе учел - аж самому смешно - понял только когда сам процедуру написал. Ваша функция прекрасно работает, если разберусь, поправлю, чтобы время перерывов снималось,а скорее всего его достаточно просто вычитать. Огромное спасибо за помощь! Прицепляю рабочий лист с журнала отключений (часть строк удалил чтобы в 100kb поместилось) - все прекрасно работает С уважением, hrnvhrnv