Gustav, Простите, необратил на это внимание. Исправил. Есть интересная задача, но я что то никак не могу сообразить , знания по VB на три по семибальной системе. Помогите пожалуйста разобратся может по модульно или как получится.
Суть задачи: Имеется 4 листа:
Эталон - Здесь 4 эталона - правильноой последовательности строк (по 7 строк в каждом подэталоне), у каждого подтолона есть главная строка она всегда седьмая снизу (время событий идет снизу вверх, (если этой строки не найдено в листе Данные остальные 6 строк неимеет смысла искать), подэталоны разделены пробелом, в подэталоне может встретится знак ? или * который может указывать на любое значение. Необходимо искать правльную последовательность строк (учитывая * и ? - что не является ошибкой. Например Вентилятор №1, или Вентилятор №2 - это не ошибка) в листе Данные. На листе Эталон хранится только часть искомого текста.
Данные - данные для обработки. (здесь точно есть правильная последовательность строк, а есть неправильная) при нахождении правильной последовательности закрасить справа ячейку в зеленый цвет на листе Анализ, (таких последовательностей правильных может много нам нужна 1 любая) и скопировать данные уже полностью строчку в Итог (здесь будет формироватся новый журнал работы оборудования без пробелов, а в конце работы его надо отсортировать по дате (снизу вверх (время идет снизу вверх у сообщений)), если все проверили весь лист Данные а искомое не найдено, то в листе
Анализ справа закрасить в красный цвет (в красный цвет необходимо красить если не найдена главной строки (главная строка 7 снизу). Если найдена главная строка, то в анализе красная ячейка и копирование всех 7 строк в Итог, если главной строки не найдено копировать в Итог нет необходимости. На листе Данные сообщения хранятся в полном виде (со временем) Анализ - анализ правильности работы оборудования. подсвечиваются ячеки по результату работы сравнения данных с эталоном
Итог - формирование только интересующих строк. На листе Итог сообщения копируются по условию в полном виде (со временем) из таблицы Данные
Написал много но что бы понять что я хотел описать объясню механику:
Есть событие, в нашем случае главная строка, после которого оборудование должно отработать именно по алгоритму тоесть правильно, нужно просто реальныый события сравнить с эталоном и при нахождении правильной последовательности в таблице Анализ справа от этого события (различаются по т.1 или т.2 и.т.д.) залить в зеленый цвет и скопировать в Итог. если нашлось несколько таких правильных эталонов то скопировать только один в Итог, если главной строки не найдена, то залить в Анализ красным цветом и ничего не копировать в Итог, если главная строка найдена, а последовательность не как в эталоне, то залить красным цветом и скопировать что нашли в Итог. Итог в конце работы отартировать по времени (снизу вверх).
Gustav, Простите, необратил на это внимание. Исправил. Есть интересная задача, но я что то никак не могу сообразить , знания по VB на три по семибальной системе. Помогите пожалуйста разобратся может по модульно или как получится.
Суть задачи: Имеется 4 листа:
Эталон - Здесь 4 эталона - правильноой последовательности строк (по 7 строк в каждом подэталоне), у каждого подтолона есть главная строка она всегда седьмая снизу (время событий идет снизу вверх, (если этой строки не найдено в листе Данные остальные 6 строк неимеет смысла искать), подэталоны разделены пробелом, в подэталоне может встретится знак ? или * который может указывать на любое значение. Необходимо искать правльную последовательность строк (учитывая * и ? - что не является ошибкой. Например Вентилятор №1, или Вентилятор №2 - это не ошибка) в листе Данные. На листе Эталон хранится только часть искомого текста.
Данные - данные для обработки. (здесь точно есть правильная последовательность строк, а есть неправильная) при нахождении правильной последовательности закрасить справа ячейку в зеленый цвет на листе Анализ, (таких последовательностей правильных может много нам нужна 1 любая) и скопировать данные уже полностью строчку в Итог (здесь будет формироватся новый журнал работы оборудования без пробелов, а в конце работы его надо отсортировать по дате (снизу вверх (время идет снизу вверх у сообщений)), если все проверили весь лист Данные а искомое не найдено, то в листе
Анализ справа закрасить в красный цвет (в красный цвет необходимо красить если не найдена главной строки (главная строка 7 снизу). Если найдена главная строка, то в анализе красная ячейка и копирование всех 7 строк в Итог, если главной строки не найдено копировать в Итог нет необходимости. На листе Данные сообщения хранятся в полном виде (со временем) Анализ - анализ правильности работы оборудования. подсвечиваются ячеки по результату работы сравнения данных с эталоном
Итог - формирование только интересующих строк. На листе Итог сообщения копируются по условию в полном виде (со временем) из таблицы Данные
Написал много но что бы понять что я хотел описать объясню механику:
Есть событие, в нашем случае главная строка, после которого оборудование должно отработать именно по алгоритму тоесть правильно, нужно просто реальныый события сравнить с эталоном и при нахождении правильной последовательности в таблице Анализ справа от этого события (различаются по т.1 или т.2 и.т.д.) залить в зеленый цвет и скопировать в Итог. если нашлось несколько таких правильных эталонов то скопировать только один в Итог, если главной строки не найдена, то залить в Анализ красным цветом и ничего не копировать в Итог, если главная строка найдена, а последовательность не как в эталоне, то залить красным цветом и скопировать что нашли в Итог. Итог в конце работы отартировать по времени (снизу вверх).Eapold
Похоже, что задача действительно любопытная, правда, описание воспринимается с огромным трудом. Повставляли бы пустые строки между абзацами, уже бы полегче было читать... (Или кто-нибудь из модераторов бы вставил, спасибо!)
Похоже, что задача действительно любопытная, правда, описание воспринимается с огромным трудом. Повставляли бы пустые строки между абзацами, уже бы полегче было читать... (Или кто-нибудь из модераторов бы вставил, спасибо!)Gustav
Я в этом описании абсолютно ничего не понял. Какая-то каша! То Вы пишете, что у Вас в файле встречаются ? И * потом приводите сюда пример - вентилятор 1 и вентилятор 2 - в которых этих знаков и близко нет. И все в таком же духе!
Я в этом описании абсолютно ничего не понял. Какая-то каша! То Вы пишете, что у Вас в файле встречаются ? И * потом приводите сюда пример - вентилятор 1 и вентилятор 2 - в которых этих знаков и близко нет. И все в таком же духе!Бриан
Начал бы я с того, что на листе Данные по Ctrl+H заменил бы два символа "; " на один символ ";", после чего разбил текст по столбцам. У меня получилось 4 столбца, которые я назвал: "ДатаВремя1", "Контроллер", "Событие", "ДатаВремя2".
Вопрос: что такое "ДатаВремя2" (или тайм-штамп в конце общей строки Данных до разбора) ? Время завершения общей реакции на событие ("загазованность") ?
Пример: строки с 8365 по 8220 имеют общее окончание "26.10.2012 18:35:43". Можно ли говорить о том, что это время объединяет их в некий единый массив, в пределах которого и надо искать правильную последовательность событий?
Начал бы я с того, что на листе Данные по Ctrl+H заменил бы два символа "; " на один символ ";", после чего разбил текст по столбцам. У меня получилось 4 столбца, которые я назвал: "ДатаВремя1", "Контроллер", "Событие", "ДатаВремя2".
Вопрос: что такое "ДатаВремя2" (или тайм-штамп в конце общей строки Данных до разбора) ? Время завершения общей реакции на событие ("загазованность") ?
Пример: строки с 8365 по 8220 имеют общее окончание "26.10.2012 18:35:43". Можно ли говорить о том, что это время объединяет их в некий единый массив, в пределах которого и надо искать правильную последовательность событий?Gustav
Бриан. На листе Данные есть такие строки "28.10.2012 13:28:15; Контроллер Modbus Tcp; ВЫТЯЖНАЯ ВЕНТИЛЯЦИЯ. ВЫТЯЖНОЙ ВЕНТИЛЯТОР №1. МАГНИТНЫЙ ПУСКАТЕЛЬ ОТКЛЮЧИЛСЯ. ИСП РЕЖ.; 28.10.2012 13:41:50" - но может быть вентилятор №1 или №2 это без разница.
? и * я предложил для того что бы, если при сравнении строк будет найден Вентилятор №1 или 2 то это не имело бы значения, главное что бы включился любой вентилятор.
Простите за сумбурный текст , я его долго писал....но видимо что плохо описал.
Бриан. На листе Данные есть такие строки "28.10.2012 13:28:15; Контроллер Modbus Tcp; ВЫТЯЖНАЯ ВЕНТИЛЯЦИЯ. ВЫТЯЖНОЙ ВЕНТИЛЯТОР №1. МАГНИТНЫЙ ПУСКАТЕЛЬ ОТКЛЮЧИЛСЯ. ИСП РЕЖ.; 28.10.2012 13:41:50" - но может быть вентилятор №1 или №2 это без разница.
? и * я предложил для того что бы, если при сравнении строк будет найден Вентилятор №1 или 2 то это не имело бы значения, главное что бы включился любой вентилятор.
Простите за сумбурный текст , я его долго писал....но видимо что плохо описал.Eapold
Gustav, время перед сообщение это время когда событие произощло, время после события - это время квитирования (время когда его заметили, нажали кнопку "Видел, можножно закрыть). Система держит неквитированными все события пока оператор не отреагирует на них (если это необходимо) и нажмет кнопку "Кватировать события"
Пример: строки с 8365 по 8220 имеют общее окончание "26.10.2012 18:35:43". - эти события сквитированы вместе, здесь нет никакой последовательности.
Gustav, время перед сообщение это время когда событие произощло, время после события - это время квитирования (время когда его заметили, нажали кнопку "Видел, можножно закрыть). Система держит неквитированными все события пока оператор не отреагирует на них (если это необходимо) и нажмет кнопку "Кватировать события"
Пример: строки с 8365 по 8220 имеют общее окончание "26.10.2012 18:35:43". - эти события сквитированы вместе, здесь нет никакой последовательности.Eapold
Сообщение отредактировал Eapold - Четверг, 22.11.2012, 12:48
Для начала еще можно применить такую формулу массива (Ctrl+Shift+Enter):
[vba]
Code
=ПОИСКПОЗ(ЛОЖЬ;ЕОШ(ПОИСК({ "ПРЕДЕЛЬНАЯ ЗАГАЗОВАННОСТЬ В ПОМЕЩЕНИИ МНС, Т."; "ПОМЕЩЕНИЕ НАСОСНОГО ЗАЛА. ЗАПУСК ПРОДУВКИ"; "СИРЕНУ НА УЛИЦЕ ВКЛЮЧИТЬ"; "ТАБЛО ""ГАЗ - НЕ ВХОДИ"", ""ГАЗ - УХОДИ"" В ПОМЕЩЕНИИ МНС И СНАРУЖИ - ВКЛЮЧИТЬ"; "СИРЕНУ В МНС - ВКЛЮЧИТЬ"; "ВЫТЯЖНАЯ ВЕНТИЛЯЦИЯ. ВЫТЯЖНОЙ ВЕНТИЛЯТОР №?. АВТОМАТИЧЕСКИ ПУСТИТЬ"; "ВЫТЯЖНАЯ ВЕНТИЛЯЦИЯ. ВЫТЯЖНОЙ ВЕНТИЛЯТОР №?. ВКЛЮЧИЛСЯ" };A1));0)-1
[/vba] Она покажет 0 для главного события, 1-6 для соответствующих событий (с листа "Эталон") и #Н/Д для прочих событий. С ее помощью можно отфильтровать из общего потока записи, имеющие отношение к задаче. И далее уже поконкретнее разбираться с №1..4 среди гораздо меньшего количества записей.
Кстати, автофильтром находится всего 92 записи (не #н/д) из 8915.
Для начала еще можно применить такую формулу массива (Ctrl+Shift+Enter):
[vba]
Code
=ПОИСКПОЗ(ЛОЖЬ;ЕОШ(ПОИСК({ "ПРЕДЕЛЬНАЯ ЗАГАЗОВАННОСТЬ В ПОМЕЩЕНИИ МНС, Т."; "ПОМЕЩЕНИЕ НАСОСНОГО ЗАЛА. ЗАПУСК ПРОДУВКИ"; "СИРЕНУ НА УЛИЦЕ ВКЛЮЧИТЬ"; "ТАБЛО ""ГАЗ - НЕ ВХОДИ"", ""ГАЗ - УХОДИ"" В ПОМЕЩЕНИИ МНС И СНАРУЖИ - ВКЛЮЧИТЬ"; "СИРЕНУ В МНС - ВКЛЮЧИТЬ"; "ВЫТЯЖНАЯ ВЕНТИЛЯЦИЯ. ВЫТЯЖНОЙ ВЕНТИЛЯТОР №?. АВТОМАТИЧЕСКИ ПУСТИТЬ"; "ВЫТЯЖНАЯ ВЕНТИЛЯЦИЯ. ВЫТЯЖНОЙ ВЕНТИЛЯТОР №?. ВКЛЮЧИЛСЯ" };A1));0)-1
[/vba] Она покажет 0 для главного события, 1-6 для соответствующих событий (с листа "Эталон") и #Н/Д для прочих событий. С ее помощью можно отфильтровать из общего потока записи, имеющие отношение к задаче. И далее уже поконкретнее разбираться с №1..4 среди гораздо меньшего количества записей.
Кстати, автофильтром находится всего 92 записи (не #н/д) из 8915.Gustav
Нужно было вставить на лист Данные в ячейку B1 (или любую другую из первой строки, кроме A1, естественно). Ввод формулы завершить не просто Enter, а Ctrl+Shift+Enter. Потом формулу скопировать ниже по столбцу B.
Нужно было вставить на лист Данные в ячейку B1 (или любую другую из первой строки, кроме A1, естественно). Ввод формулы завершить не просто Enter, а Ctrl+Shift+Enter. Потом формулу скопировать ниже по столбцу B.Gustav
Аха, т.е. даже если в общей таблице (без фильтра) между этими строчками идут по 100 других (#Н/Д), но мы включаем фильтр и видим какие-то из них идущими подряд от 0 до 6 (или, если сверху, то от 6 до 0), то эти 7 строк (из автофильтра) и есть то, что надо?
Хорошо. И что с ними дальше надо сделать?
Аха, т.е. даже если в общей таблице (без фильтра) между этими строчками идут по 100 других (#Н/Д), но мы включаем фильтр и видим какие-то из них идущими подряд от 0 до 6 (или, если сверху, то от 6 до 0), то эти 7 строк (из автофильтра) и есть то, что надо?
Gustav, теперь надо эту комбинацию скопировать на лист Итог (чтоб там формировался журнал без пробелов), и закрасить зеленым цветом ячейку в листе Анализ. По точке №3 алгоритм нарушен, поэтому надо скопировать всеравно 7 строк в Итог, и покрасить красным цветом в Анализ По точке №4 (я когда файл уменьшал сообщения по точке №4 удалил) закрасить красным ячеку в Анализ, и еще правее закрасить красным для того что бы видно было что это событие 0 вообще не нашлось. Все возможные случаи у нас будут разобраны: 1. все в порядке т1, т2, 2. не все в порядке событие 0 есть а дальше алгоритм напутан 3. вообще все в беспорядке нет даже события 0
ps. для наглядности на данном этапе можно подкрасить цветом найденые от 0-7 события.
Gustav, теперь надо эту комбинацию скопировать на лист Итог (чтоб там формировался журнал без пробелов), и закрасить зеленым цветом ячейку в листе Анализ. По точке №3 алгоритм нарушен, поэтому надо скопировать всеравно 7 строк в Итог, и покрасить красным цветом в Анализ По точке №4 (я когда файл уменьшал сообщения по точке №4 удалил) закрасить красным ячеку в Анализ, и еще правее закрасить красным для того что бы видно было что это событие 0 вообще не нашлось. Все возможные случаи у нас будут разобраны: 1. все в порядке т1, т2, 2. не все в порядке событие 0 есть а дальше алгоритм напутан 3. вообще все в беспорядке нет даже события 0
ps. для наглядности на данном этапе можно подкрасить цветом найденые от 0-7 события.Eapold
Сообщение отредактировал Eapold - Четверг, 22.11.2012, 17:06
Я подумываю о том, как бы однозначно присвоить последовательности строк с кодами от 0 до 6 некий единый номер. И так для каждой такой последовательности - свой уникальный номер, чтобы отличать их друг от друга. Пока конструктивных мыслей нет.
Я подумываю о том, как бы однозначно присвоить последовательности строк с кодами от 0 до 6 некий единый номер. И так для каждой такой последовательности - свой уникальный номер, чтобы отличать их друг от друга. Пока конструктивных мыслей нет.Gustav
В задачу не вникал - уж слишком много текста Но насчёт последовательности - может собрать номера строк в массивы? Или каждому номеру группы в словаре присвоить одинаковый item? Или словарь названий групп, у каждого в item массив номеров строк? Я думаю последнее функциональнее.
В задачу не вникал - уж слишком много текста Но насчёт последовательности - может собрать номера строк в массивы? Или каждому номеру группы в словаре присвоить одинаковый item? Или словарь названий групп, у каждого в item массив номеров строк? Я думаю последнее функциональнее.Hugo