Добрый день всем! Нужна Ваша помощь с файлом. Сразу предупреждаю, вопрос непростой.
В общем, суть такова: 1) Сделал файл для учета заявок на разные виды сервисных работ. 2) Кроме самой "базы данных" на первом листе, добавил 3 интерактивных графика (суточный, 4-часовой и месячный) Каждый из них в идеале должен цветными ячейками отображать время или период, когда запланированы те или иные работы в строке нужной бригады. 3) При щелчке (активации) этой цветной ячейки нужно показать справа от графика все сведения по строке из таблицы первого листа, которая соответствует этому квадрату. 4) Если в какой-либо строке указано дату переноса работы, в графике стрелкой отображается, на какой период она сдвинута. 5) На макросы фильтрации и рисования линий можете не обращать внимание (работают правильно), а Worksheet_SelectionChange может и стоит глянуть, чтобы наглядней было то, о чем я написал.
В общем, набросал файл и макросы, но столкнулся с парой непродуманных проблем (на примере, 4 февраля):
1) Для цветового выделения выбрал метод условного форматирования и функцию СУММПРОИЗВ. В большинстве случаев срабатывало правильно, но при "накладке" (два переноса в один день) на месячном графике мой вариант формул выдает не те результаты, что хотелось бы. Может, Вы подскажете, как мне добиться нужного результата?
Сейчас пробую безуспешно for each rCell in Range, но не могу правильно задать алгоритм в ВБА.
2) Зеленоватые ячейки справа от каждого графика: Вывод информации изначально реализовал через ИНДЕКС+ПОИСКПОЗ с привязкой к ключевому полю (НомерБрогады&Дата). Теперь, когда появилась необходимость учитывать заявки чаще 2 раз в сутки такой подход не работает.
В суточном графике, например, с помощью этих формул выводится информация только о первой заявке текущего дня. Мне же нужен какой-то способ найти и вывести на экран все данные первого листа , которые связаны с этой заявкой и заказом.
ИТОГ: Мне нужно как-то перекроить имеющийся набор графиков, чтобы при выделении любой ячейки можно было получать полный набор данных по этому заказу и допились до ума СУММПРОИЗВ (либо заменить на любой другой способ), желательно не запоров сильно быстродействие. А свои идеи пока иссякли. Был бы очень рад любому совету.
P.S. Простите, если слишком запутанно объяснил
Добрый день всем! Нужна Ваша помощь с файлом. Сразу предупреждаю, вопрос непростой.
В общем, суть такова: 1) Сделал файл для учета заявок на разные виды сервисных работ. 2) Кроме самой "базы данных" на первом листе, добавил 3 интерактивных графика (суточный, 4-часовой и месячный) Каждый из них в идеале должен цветными ячейками отображать время или период, когда запланированы те или иные работы в строке нужной бригады. 3) При щелчке (активации) этой цветной ячейки нужно показать справа от графика все сведения по строке из таблицы первого листа, которая соответствует этому квадрату. 4) Если в какой-либо строке указано дату переноса работы, в графике стрелкой отображается, на какой период она сдвинута. 5) На макросы фильтрации и рисования линий можете не обращать внимание (работают правильно), а Worksheet_SelectionChange может и стоит глянуть, чтобы наглядней было то, о чем я написал.
В общем, набросал файл и макросы, но столкнулся с парой непродуманных проблем (на примере, 4 февраля):
1) Для цветового выделения выбрал метод условного форматирования и функцию СУММПРОИЗВ. В большинстве случаев срабатывало правильно, но при "накладке" (два переноса в один день) на месячном графике мой вариант формул выдает не те результаты, что хотелось бы. Может, Вы подскажете, как мне добиться нужного результата?
Сейчас пробую безуспешно for each rCell in Range, но не могу правильно задать алгоритм в ВБА.
2) Зеленоватые ячейки справа от каждого графика: Вывод информации изначально реализовал через ИНДЕКС+ПОИСКПОЗ с привязкой к ключевому полю (НомерБрогады&Дата). Теперь, когда появилась необходимость учитывать заявки чаще 2 раз в сутки такой подход не работает.
В суточном графике, например, с помощью этих формул выводится информация только о первой заявке текущего дня. Мне же нужен какой-то способ найти и вывести на экран все данные первого листа , которые связаны с этой заявкой и заказом.
ИТОГ: Мне нужно как-то перекроить имеющийся набор графиков, чтобы при выделении любой ячейки можно было получать полный набор данных по этому заказу и допились до ума СУММПРОИЗВ (либо заменить на любой другой способ), желательно не запоров сильно быстродействие. А свои идеи пока иссякли. Был бы очень рад любому совету.
P.S. Простите, если слишком запутанно объяснил Невилл
"Поучиться" у меня пока мало чему можно)) Постараюсь немного оптимизировать и структурировать код, а потом выложу здесь. Пока задачу-то он выполняет, то слишком много лишнего и местами слишком по-китайски циклы сделаны. Стыдно
Вдруг и правда, кому-то сгодится тоже. ОК
"Поучиться" у меня пока мало чему можно)) Постараюсь немного оптимизировать и структурировать код, а потом выложу здесь. Пока задачу-то он выполняет, то слишком много лишнего и местами слишком по-китайски циклы сделаны. Стыдно
Китин, как и обещал, выкладываю. Все еще сыро, но работает, в целом.
Не могу понять, правда, где в процедуре FindEvents (Модуль Events) я нарушил что-то с буфером обмена. При активации листов с графиками буфер очищается, хотя это уж лишнее.
Не критично, но если кто подскажет, буду благодарен.
Любые советы по оптимизации кода также приветствуются))
Китин, как и обещал, выкладываю. Все еще сыро, но работает, в целом.
Не могу понять, правда, где в процедуре FindEvents (Модуль Events) я нарушил что-то с буфером обмена. При активации листов с графиками буфер очищается, хотя это уж лишнее.
Не критично, но если кто подскажет, буду благодарен.
Любые советы по оптимизации кода также приветствуются))Невилл
У меня Ваш файл не качается. Если без него, то очистка буфера обмена происходит при изменении макросом каких-то значений на листе Excel. Или в именованных диапазонах, или еще где, главное, что не внутри VBA, а именно в Excel. Ан нет, скачался. В код не вникал, но сразу вижу, что Вы пренебрегаете отключением обновления экрана [vba]
Код
Application.ScreenUpdating = 0
[/vba]Очень рекомендую.
У меня Ваш файл не качается. Если без него, то очистка буфера обмена происходит при изменении макросом каких-то значений на листе Excel. Или в именованных диапазонах, или еще где, главное, что не внутри VBA, а именно в Excel. Ан нет, скачался. В код не вникал, но сразу вижу, что Вы пренебрегаете отключением обновления экрана [vba]
Boroda, спасибо за совет! По ошибке считал ScreenUpdating и EnableEvents тождественными вещами)) Теперь почитал, поправил! Дерганье экрана исчезло при не 100%-ном масштабе сразу!
Boroda, спасибо за совет! По ошибке считал ScreenUpdating и EnableEvents тождественными вещами)) Теперь почитал, поправил! Дерганье экрана исчезло при не 100%-ном масштабе сразу!Невилл
Ребята, файл тот же, проблемка другая. Не стал новую тему создавать.
В общем, у меня файл работает нормально (Win7x32 Office16)
А кое у кого из коллег макросы выдают ошибку при переключении листов (к активации листов "График" привязаны макросы):
Пытаюсь понять, в чем дело. Если есть минутка времени, гляньте файл, пожалуйста. Compile error in hidden module DrawLines Ругается на модуль DrawLines (для создания стрелок-автофигур). Код там - слегка модифицированная версия с какого-то англофорума.
Что я мог не учесть? Нужно что-то добавить для поддержки совместимости в код?
P.S. Пароль проекта: 123
Ребята, файл тот же, проблемка другая. Не стал новую тему создавать.
В общем, у меня файл работает нормально (Win7x32 Office16)
А кое у кого из коллег макросы выдают ошибку при переключении листов (к активации листов "График" привязаны макросы):
Пытаюсь понять, в чем дело. Если есть минутка времени, гляньте файл, пожалуйста. Compile error in hidden module DrawLines Ругается на модуль DrawLines (для создания стрелок-автофигур). Код там - слегка модифицированная версия с какого-то англофорума.
Что я мог не учесть? Нужно что-то добавить для поддержки совместимости в код?
кое у кого из коллег макросы выдают ошибку при переключении листов
У Вас в модуле нет четкой привязки к книге, и листу. Вот что это такое: Range("График") Именованный диапазон - содержится на каком-то листе, но в модуле Вы программе не говорите с каким листом работать. Запустите DrawArrowInCell с 1-го листа - получите ошибку. Иногда у офиса происходят глюки и он делает активным другой лист, или книгу(особенно если есть UDF или волатильные функции) Чтобы такого избежать нужно четко указывать к диапазону какого листа Вы обращаетесь: к примеру: [vba]
Код
With ThisWorkbook.Sheets(n) For m = 1 To .Range("График").Rows.Count
кое у кого из коллег макросы выдают ошибку при переключении листов
У Вас в модуле нет четкой привязки к книге, и листу. Вот что это такое: Range("График") Именованный диапазон - содержится на каком-то листе, но в модуле Вы программе не говорите с каким листом работать. Запустите DrawArrowInCell с 1-го листа - получите ошибку. Иногда у офиса происходят глюки и он делает активным другой лист, или книгу(особенно если есть UDF или волатильные функции) Чтобы такого избежать нужно четко указывать к диапазону какого листа Вы обращаетесь: к примеру: [vba]
Код
With ThisWorkbook.Sheets(n) For m = 1 To .Range("График").Rows.Count
Slavick, спасибо за наводку. Попробую с этим блоком поработать дополнительно Хотя задумка там была в том, процедура DrawArrowInCell вызывается только при событии Worksheet_Activate() исключительно на трех листах. То есть, ActiveSheet уже, вроде, и так нужный выбран. На каждом из них есть именованный диапазон с идентичным названием "График" (область-соответствующий лист, а не книга).
То есть, процедура DrawArrowInCell с первого листа без входа в редактор VBA и ручного запуска происходить, вроде и не должна.
Slavick, спасибо за наводку. Попробую с этим блоком поработать дополнительно Хотя задумка там была в том, процедура DrawArrowInCell вызывается только при событии Worksheet_Activate() исключительно на трех листах. То есть, ActiveSheet уже, вроде, и так нужный выбран. На каждом из них есть именованный диапазон с идентичным названием "График" (область-соответствующий лист, а не книга).
То есть, процедура DrawArrowInCell с первого листа без входа в редактор VBA и ручного запуска происходить, вроде и не должна.Невилл
Иногда у офиса происходят глюки и он делает активным другой лист, или книгу(особенно если есть UDF или волатильные функции) Чтобы такого избежать нужно четко указывать к диапазону какого листа Вы обращаетесь:
хоть ActiveSheet и выбран - указать процедуре куда смотреть - лишним не будет. создайте переменную к примеру sh и работайте с ней - так удобней. Или как я уже написал ThisWorkbook.Sheets(n) - так длинее и не удобно, но тоже правильно. [vba]
Код
set sh = ActiveSheet
[/vba] [vba]
Код
with sh For m = 1 To .Range("График").Rows.Count .... end with
Иногда у офиса происходят глюки и он делает активным другой лист, или книгу(особенно если есть UDF или волатильные функции) Чтобы такого избежать нужно четко указывать к диапазону какого листа Вы обращаетесь:
хоть ActiveSheet и выбран - указать процедуре куда смотреть - лишним не будет. создайте переменную к примеру sh и работайте с ней - так удобней. Или как я уже написал ThisWorkbook.Sheets(n) - так длинее и не удобно, но тоже правильно. [vba]
Код
set sh = ActiveSheet
[/vba] [vba]
Код
with sh For m = 1 To .Range("График").Rows.Count .... end with