Страницы: 1
RSS
Анализ данных по матрице
 
Добрый день,    
Прошу помочь с написанием формулы или макроса,    
Задача:    
для анализа списка пользователей лист "Список" по каждой ФИО надо проанализировать наличие конфликтов ролей, пересечение ролей по матрице правил лист "Правила". и вывести на другой лист ФИО, и названия пересекающихся ролей (при наличии Х).    
файл во вложении  
 
Сам пробовал написать, получилось только для одной ФИО и двух ролей через формулы индекс и поиск позиции. как написать для всего массива не могу сообразить. :) Может быть нужный циклы формулы массивов. но как соединить все в воедино не понимаю.    
 
Прошу помочь формалами или ссылкой на похожие примеры в инете, искал, но на нашел, думаю, что должно делаться просто :)
 
Самому хочется решить эту задачу, только плохо, что Вы не сформулировали эту задачу четко, ясно. Поэтому у меня к Вам вопросы.  
Вот открыл я Ваш документ, на Лист("Правила") видно заглавие, которое одинаково по строкам и столбцам, упрощенно говоря  
    A B C D ...  
 A  
 B  
 C  
 D  
 .    
 .  
   
Далее видим ячейки трех видов:  
пустые  
с красной заливкой ("Xячейки")ячейки  
серая заливка ("диагональные") ячейки  
Поподробнее, что с этими ячейками конкретно нужно сделать? И не видно примера формул, как это Вы сделали.
 
Не думал, что так быстро кто-нибудь посмотрит :)  
Согласен может быть не четко описал, первый раз обращаюсь за помощью.    
 
Да все верно, такого вида:  
 A B C D ...  
A  
B  
C  
D  
 
серая заливка, говорит о том, что роль сама с собой пересекается, и это не важно. Как в любой таблице спортивной, команда сама собой играть не может. :)  
 
Пустые- значит конфликтов нет.    
красные- значит есть конфликт. То есть при наличии у пользователя одновременно двух таких ролей. значит есть конфликт и его надо вывести в отчет.    
   
Добавил свой пример попытки. Отдельно на лист 1. там кусок по одной ФИО. и получившаяся формула выделена желтым цветом.    
 
=ЕСЛИ(ИНДЕКС('GFL rules matrix'!$B$7:$AJ$36;ПОИСКПОЗ(H1;'GFL rules matrix'!$A$7:$A$36;0);ПОИСКПОЗ(H2;'GFL rules matrix'!$B$1:$AJ$1;0))="X";СЦЕПИТЬ(H1; " и "; H2);0)
 
Если я правильно понял нужно для каждого столбца из данного диапазона (или каждой строки, поскольку строки и столбцы здесь одинаковы, грубо говоря имеем дело с асоциированной матрицей)    
Например будем двигаться вниз по первому столбцу (он называется у нас Специалист по планированию потребности - МТР ВНГ)- пусть он будет называться А  
Этот столбец А пересекает строку А - и пересечение выделяется серым цветом, поскольку столбцы одинаковы  
Далее на своем пути мы встречаем строку В (Специалист по планированию потребности - Услуги ВНГ)  
, которая пустая, она нам подходит и ее нужно вывести на Лист("Список")  
далее вниз идут ячейки с красной заливкой, которые не подходят и заканчиваем  пустой ячейкой (Менеджер GFL), которая подходит.  
Получается Вам для каждого столбца-строки или строка-столбцы (здесь это тождественные понятия) нужно выбрать пустые ячейки и их отобразить на лист Лист("Список") и с красной заливкой и их тоже отобрать?
 
Скорее не так ;) наоборот мне нужно наоборот проверить каждого пользователя ( его роли) на наличие пересечений ролей ( по листу правила) например у первого пользователя есть одновременного две роли, которые если проверить по листу правила имеют крест (красная ячейка) и вот этот крест надо вывести на отдельный лист и название ролей, и пересечении, которых есть этот крест.
 
1. Обозначьте себя - ведь это просто невежливо,- просить помощи не представившись.  
2. Я не вижу в примере - ЧТО должно получиться на выходе. Покажите вариант, где всё сделайте вручную.
 
При написании своего логина, почему-то не давал отправить сообщения писал, что такой пользователь уже существует. А войти под собой не получается.    
А так меня зовут Антон  
 
Что хотел бы получить в итоге и в принципе ручной подход изображен во втором файле вкладка лист 1. Ячейка с формулой выделена желтым.    
В итоге хотел бы получить по каждому пользователю список ролей которые пересекаются и имеют крест красная ячейка на листе правила.
 
более- менее уже прояснилось. Макросом будет наверное более всего лаконично.  
Вот текст, который будет выводится в списке, например  
Менеджер договорного отдела - Услуги ВНГ  
и т.д.  
он печататься будет или только для Вашего просмотра?    
Поскольку хотелось бы этот текст прописать, например так (без пробелов и тире)  
МенеджерДоговорногоОтдела_Услуги_ВНГ  
Это я хотел бы сделать для того, чтобы дать ячейкам и диапазону содержательные имена, чтобы потом было проще обращаться к ячейкам и диапазону ячеек. Составить по этому поводу цикл. Критерий, например цвет заливки.
 
Если для макроса будет удобнее, можно вообще заменить названия ролей на порядок цифр, например 1,2,3,4 и т.д. И отдельно сделать справочник. А после уже на годовом листе с помощью ВПР подтянуть названия.цвет заливки вообще можно не учитывать. Заменить х - например числовым значением.
 
представляю Вам файл, в котором на Лист4 представлена таблица РОЛЕЙ, а дальше вправо от таблицы идут расчеты.  
Где помечено желтой заливкой, можна вводить данные. Вообще их ненужно даже вводить просто из соседнего диапазона критерий_b копируем нужные роли в ячейки диапазона критерий_a и смотрим, что получилось. Чтобы сработало событие и пересчитались данные, верхнюю ячейку диапазона критерий_a нужно активизировать. Пока что таким образом работает. Конечно, еще вариант сырой, ведь потом еще нужно в диапазоне результаты перенести данные и упорядочить один под другим, которые залиты зеленой заливкой. Еще много нужно сделать и в плане оптимизации кода VBA, сделать его более элегантным и более управляемым. К стати код VBA находится в модуле ROLI, его можно посмотреть, но еще не отшлифованный по высшему качеству. Вообщем жду отзывов.
 
файл Excel 2003
 
Спасибо,    
но это еще не совсем, то, что мне нужно.  В принципе Вы сделали, то, что и я в своей формуле, только сделали на большее количество ролей. Мне кажется это можно и без макроса, а вот дальше макрос пригодиться.    
 
Дальше необходимо, что в критерий a по очереди подставлялись роли каждого сотрудника (по ФИО). а в критерий b подставлялись его оставшиеся роли. и проверка проходила, только между ролями одного сотрудника, а не всеми ролями.    
 
Примерно такой цикл:    
1.сотрудник имеет роли 1,2,3,4,5 и т.д. Идет проверка 1 с 2,3,4,5 и т.д. результаты сохраняются,    
2. идет проверка 2 с 3,4,5 и т.д.  
3 идет проверка 3,4,5, и т.д.    
4 и до конца всех ролей.  
5. конфликты по каждой роли сохраняются. и    
 
Следующий цикл, это такая же проверка по следующей  ФИО и тоже сохраняется все.  
 
 
Спасибо за помощь.
 
Зачем нам делать еще переменным столбец по критерию b. Только усложним задачу в плане кода, а получим тот же результат. Если роль по критерию а стыкуется с такой же ролью по критерию b, в столбце результат вообще результата не будет (там будет просто пустая ячейка).
 
Объясню почему надо сравнивать только с частью ролями: если мы сравниваем пересечения со всеми ролями, то получаем все конфиликты (значения X), а на самом деле у пользователя присутствует только часть ролей, а не все. И то есть они могут пересекаться только между собой. Соответственно всех конфликтов у него точно не будет, а будет только часть или вообще не будет. Вот их то и надо найти.
 
Anton, по-моему надо определиться с Основной специальностью оператора.Или я не прав?
 
Маугли,    
 
не понял о чем Вы :) и файл открыть не смог.    
 
мне надо конфликты найти по каждой ФИО и их ролям.
 
Макрос.Как вариант..
 
Интересный вариант, только я не понял как им пользоваться :)    
как работает эта закраска. и как это будет работать для списка сотрудников из 200 человек например. И можно ли доделать этот лист, чтобы конфликты выводились на отдельный лист и прописывались роли, при пересечении возник конфликт.    
 
Спасибо за помощь. При решении данной задачи, готов хорошего человека отблагодарить. :)
 
сколько возможно на практике количество совмещений. Сколько минимум и сколько максимум?
 
Исправил ошибки.Прикидка на список.Ждите, здесь Мастера есть.
 
tarasso,    
 
предположительно не более 10, но лучше взять 20.
 
Маугли,    
 
Правильно ли я понял, что у Вас проверяется только по основной роли, которую вы выделили на листе "Список", а нужно, чтобы и оставшиеся роли данного сотрудника проверились.    
 
А в принципе логика правильная, роль проверить на совмещения с другими (розовый цвет) и кресты вынести отдельно.названия ролей пересекающихся.    
 
я в приниципе такой же анализ по 1 роли сделал в формуле  
 
=ЕСЛИ(ИНДЕКС('H:\GFL\МФР\SoD конфликты\[Выявление SoD конфликтов.xlsx]GFL rules matrix'!$B$7:$AJ$36;ПОИСКПОЗ(H1;'H:\GFL\МФР\SoD конфликты\[Выявление SoD конфликтов.xlsx]GFL rules
 
сложность как раз в том, чтобы роли между собой все проверить, "перекрекстно",    
ну и следующий цикл по всем ФИО пройтись так.    
В теории знаю как, а как написать в Excel не знаю :(
 
Да, я так понял.А вы имеете ввиду примерно так? Увы,обед)
 
{quote}{login=Маугли}{date=17.05.2012 07:51}{thema=}{post}....Ждите, здесь Мастера есть.{/post}{/quote}  
 
Мастера есть, только помогаеть, что-то не больно хотят :)
 
http://www.cyberforum.ru/vba/thread577414.html  
 
здесь обсуждение закончено?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
В принципе, сделать можно. Но на самом деле не так просто, как кажется на первый взгляд - очень закрученные проверки нужны. Тут либо со словарями играться, либо пользовательские типы задавать... Если согласны на индивидуальное сотрудничество - пришлите кусок данных побольше для гарантии уверенной работы макроса на мыло vlad_ex@i.ua.
 
{quote}{login=ikki}{date=17.05.2012 10:34}{thema=}{post}http://www.cyberforum.ru/vba/thread577414.html  
здесь обсуждение закончено?{/post}{/quote}  
Да, вопрос решился, макросом по этой ссылке, все отлично заработало.    
Всем спасибо за помощь!
Страницы: 1
Читают тему
Наверх