Страницы: 1
RSS
Для электриков - "Автоматизированное заполнение Наряда-допуска"
 
Тема специфичная и может быть интересной электрикам, занимающимся ремонтом и обслуживанием промышленного эл.оборудования. Пару месяцев назад задался целью "соорудить" EXCEL-евский файл для максимально быстрого заполнения и печати бланков "Наряд-допуск". Об Excel практически ничего не знал. Помог Ваш форум и еще пара-тройка сайтов. В инете есть пара программ для аналогичной цели, но мне они не подходили, т.к. 1 - платные. 2 - требуют установки на комп, а наши служебные компы запаролены и не позволяют установку на них чего-либо. 3 - проги не вполне отвечают нашим требованиям по форме заполнения бланка.  
Закончил свое "творение", но осталось несколько вопросов.  
1. Как научить макрос загружать список, расположенный на другом листе (Bases1, Bases2) в листбокс юзерформы, вызываемой с первого листа (Editor). А то я был вынужден перенести все списки на первый лист.  
2. Юзерформа со списком лиц вызывается по клику в одной из избранных ячеек. но если юзерформа уже открыта, то при клике по другой незащищенной ячейке - в нее вводится значение, уже выбранное в листбоксе юзерформы ранее для другой ячейке. Мне удалось не допустить этого лишь командой очистки выбранной ячейки в макросе листбокса. а хотелось бы чтобы чтобы при клике по избранной ячейке только открывалась юзерформа со списком лиц, но значение в ячейке не менялось. А менялось только после клика по строке листбокса.  
3. Юзерформа выбора времени записывает промежуточные значения в ячейки, а потом собирает эти значения в одно и вставляет в выбранную ячейку. А хотелось бы чтобы все делалось в макроке - без промежуточных записей в ячейки.  
 
ссылка на архив с файлом: http://zalil.ru/32238936
 
Вам электрик или специалист по Excel нужен?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Мне бы по Excel, - сам то я электрик
 
Посмотрел Ваш файл - там черт ногу сломает. Врядли дождетесь мазохиста, к-рый захочет во всем этом рыться. Делайте простые примеры, разбив вашу задачу на несколько - быстрей получите ответ.  
"загружать список, расположенный на другом листе"... Самый простой способ, как мне кажется, сделать именованные диапазоны для списков. Тогда,например:  
ListBox1.RowSource = "Courses"' Имя диапазона  
И неважно на каком он листе.
Я сам - дурнее всякого примера! ...
 
Спасибо большое! все оказалось просто! у меня эти диапазоны уже именованы, а я про это забыл и пытался обратиться к ним типа: ListBox1.RowSource = Range...  
да только не получалось.  
но все же, мне интересно, без именованных диапазонов можно как-то обойтись?  
И по второму вопросу - Юзерформа "Выбор времени" запускается по клику по одной из ячеек G56,G58,G60,G62,G64. Когда кликаем по одной из кнопок "часы" - значение этой кнопки записывается в ячейку R55, после чего значения из R55, ":", S55 и T55 сцепляются и копируются в выделенную ячейку. Точно так же при нажатии одной из кнопок "минуты" - значение кнопки записывается в ячейки S55 и T55, после чего они все опять сцепляются и копируются в выделенную ячейку.  
Как бы это проделать только макросом, не занося промежуточные данные в ячейки R55,S55,T55. ?
 
Можно так заполнить без именованных диапазонов:  
ListBox1.List = Sheets("ИмяЛиста").Range("b2:b11").Value  
Список должен располагаться в столбец.
Я сам - дурнее всякого примера! ...
 
Спасибо большое.    
Со вторым вопросом сам разобрался - вставил второй текстбокс в юзерформу и теперь промежуточные результаты сохраняются в 1 и 2 текстбоксах.
 
Тоже через ж. Сделайте три глобальных переменных и храните пром. значения в них. Хотя и этого не надо. Можно в модуле формы объявить переменные static.
Я сам - дурнее всякого примера! ...
 
Я себе решил эту проблему так, как приведено в приложеном файле. Конечно спепень автоматизации можно увеличить, но меня устраивает пока так. И еще, в Брянскэнерго, после одного несчастного случая появилась в бланке наряда допуска еще одна табличка. Не пугайтесь, если она не нужна, ее легко можно удалить.
 
Ну тут у вас можно конечно поспорить - за каким... нужно работнику оперативного персонала получать еще какие-то инструктажи, тем более от отв.руководителя или производителя, который может быть вовсе из сторонней организации? - Наверное с большого перепугу!  
Не знаю, можно ли так радикально переделывать форму бланка, как это проделано у вас? - Это все-таки утвержденная форма.  
А вообще, мое мнение - форму давно пора переделать! - Одних только таблиц с инструктажами сколько понаплодили... Один хрен их никто не проводит в реалии.
 
{quote}{login=KukLP}{date=11.12.2011 07:47}{thema=}{post}Тоже через ж. Сделайте три глобальных переменных и храните пром. значения в них. Хотя и этого не надо. Можно в модуле формы объявить переменные static.{/post}{/quote}  
 
Если не затруднит, как это проделать?
 
Замените текстом из файла ВЕСЬ текст модуля UserForm1.
Я сам - дурнее всякого примера! ...
 
См. Указания по заполнению наряда-допуска для работ в электроустановках. Межотраслевых правил по охране труда (правил безопасности) при эксплуатации электроустановок ПОТ РМ-016-2001.  
Правее правил нет ничего!
 
Я сделал так  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
{quote}{login=KukLP}{date=12.12.2011 05:27}{thema=}{post}Замените текстом из файла ВЕСЬ текст модуля UserForm1.{/post}{/quote}  
Ваш вариант мне нравится в плане того, что всё делается в коде макроса, но по сравнению с моим (с 2-мя текстбоксами) в некоторых случаях работает некорректно: если ввести час, но не вводить минуты, или наоборот, - то в текстбоксе появится ЧЧ: или :ММ , и если при этом сразу же кликнуть по другой ячейке - то это некорректное значение в нее запишется! Этого не наблюдается в моем варианте.  
Смотрите в прикрепленном файле.  
Но меня сейчас заботит другой вопрос. Когда юзерформа открыта - то при выделении любой ячейке на листе - в нее запишется значение из юзерформы, что не есть правильно! Значения должны вставляться в только в те ячейки, из которых собственно и происходит запуск юзерформы. Вариант с автозакрытием юзерформы после ввода значения в ячейку не годится, т.к. при следующем запуске значения снова обнуляются, а это неудобно, т.к. приходится каждый раз вводить часы и минуты. Сейчас же, если время в ячейках различается только в минутах - то достаточно выделить след. ячейку и нажать кнопку с нужными минутами.  
В общем, в идеале задумка такая: - если юзерформа открыта и мы выделяем любую ячейку листа, кроме тех пяти, из которых она и запускается - то юзерформа должна закрыться, или по крайней мере в выделенной ячейке значение не менялось бы.
 
Тогда Вам в каждую процедуру нужно пихать проверку:  
if intersect(activecell,Range("Перечисляем нужные ячейки")) is nothing then exit sub
Я сам - дурнее всякого примера! ...
 
За подсказку спасибо. Попробовал, работает. В ненужные ячейки действительно не вставляет значение.  
Но у меня несколько юзерформ. И я попробовал несколько изменить код листа:  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)  
   If Not Application.Intersect(Range("D3,D5,D7,D9,D11"), Target) Is Nothing Then  
       UserForm2.Show  
       ActiveCell = UserForm2.TextBox1 & ":" & UserForm2.TextBox2  
   Else  
       Unload UserForm2  
   End If  
   If Not Application.Intersect(Range("B3,B5,B7,B9,B11"), Target) Is Nothing Then  
       UserForm1.Show  
       ActiveCell = UserForm1.TextBox1  
   End If  
End Sub  
 
в этом виде юзерформа2 нормально вызывается, вставляет значения и закрывается при выделении ненужной ячейки. Но как только я пытаюсь вставить:  
 
   Else  
       Unload UserForm1  
 
во второй блок условия для юзерформы1 - то юзерформа2 перестает нормально работать - ничего не вставляет в поля. В то же время в остальном все работает, в том числе и юзерформа1 нормально вставляет в поля.  
Может подскажите - где тут собака, а то я уж по всякому пробовал: и через  
Else и через ElseIf и через Ваш фрагмент кода... не выходит!
 
А зачем Вам 2 одинаковых формы? Для веса? Делали бы одной. Если так уж хочется, можно в зависимости от диапазона цвет фона менять. И не было бы этого геморроя. Ну, дело Ваше.  
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)  
   If Not Application.Intersect(Range("D3,D5,D7,D9,D11"), Target) Is Nothing Then  
       Unload UserForm1: UserForm2.Show  
       ActiveCell = UserForm2.TextBox1 & ":" & UserForm2.TextBox2  
       Exit Sub ' незачем проверять другие условия, если это выполнено  
   Else  
       Unload UserForm2  
   End If  
   If Not Application.Intersect(Range("B3,B5,B7,B9,B11"), Target) Is Nothing Then  
       Unload UserForm2: UserForm1.Show  
       ActiveCell = UserForm1.TextBox1  
       Exit Sub  
   Else  
       Unload UserForm1  
   End If  
End Sub
Я сам - дурнее всякого примера! ...
 
"если ввести час, но не вводить минуты, или наоборот, - то в текстбоксе появится ЧЧ: или :ММ , и если при этом сразу же кликнуть по другой ячейке - то это некорректное значение в нее запишется!"  
Private Sub UserForm_Initialize()  
   NumHour = "00"  
   Sec = "0"  
   Sec1 = "0"  
   ActiveCell.ClearContents  
End Sub  
И будет Вам счастье.
Я сам - дурнее всякого примера! ...
 
Спасибо KukLP  
Все идеально работает. Буду все переносить в файл "Авт.выдача нарядов".  
По поводу вашего недоумения "зачем вам 2 одинаковые юзерформы?" - это просто я 2 почти одинаковые для сравнения выложил. В файле "Авт.выдача нарядов" у меня 4 разные юзерформы (см. самое первое мое сообщение):  
юзерформа1 - "Выбор времени" (ее мы и обсуждали)  
юзерформа2 - "Выбор даты" (календарь, вызывается выделением одной из ячеек "дата")  
юзерформа3 - "Выбор заданий" (вызывается кнопкой "Выбор заданий")  
юзерформа4 - "Выбор лиц" (вызывается выделением одной из ячеек "ответственные лица")  
В нашей организации работают разные люди, в том числе и пенсионеры, которые с компьютером не очень дружат. Один чел. умудрился запустить все 4 юзерформы и давай кликать по ячейкам! - конечно вводилась полная хрень! Так что мне еще большая работа предстоит по устранению разных шероховатостей.  
Прошу понять меня правильно - все это не эстетство, а горькая необходимость. Дело в том, что часто бывает так, что к нам одновременно приходят 3 - 4 бригады для производства работ, приходят и сидят, ждут - когда наш электрик вручную заполнит "Наряд-допуск"(да еще в 2-х экземплярах, да для каждой бригады - свой наряд) - т.е. для 4-х бригад нужно заполнить 8 бланков, да еще без помарок и ничего не забыв.  А потом этого несчастного электрика ебут за то, что бригада пришла в 8:00, а к работе приступила в 9:00. Объяснения что за пол-часа 8 бланков заполнить нереально - руководством в расчет не принимаются - они то наряды не заполняют, не знают что это такое!  
Вот я и задался целью сделать так, чтобы заполнить и распечатать наряд можно было максимально быстро, и экономия времени в мелочах - тут не праздный вопрос!  
В инете видел ролик, где в аналогичной программе(правда платной) наряд заполняется за 30 секунд!
 
{quote}{login=s1606rus}{date=13.12.2011 03:44}{thema=}{post} Один чел. умудрился запустить все 4 юзерформы и давай кликать по ячейкам!{/post}{/quote}Вот поэтому и нет смысла делать их столько - разместите всё на одной.
 
Пытаюсь оптимизировать код для юзерформы4. До этого все работало, правда меня не устраивало макрос делал какие-то непонятные телодвижения и не устраивало что юзерформа хранила промежуточные результаты на в ячейке листе.  
После оптимизации все заработало быстрее, но в определенных случаях юзерформа вылетает в Debug. Например: если выделить ячейку "Выдающий наряд", выбрать в списке фамилию, затем выделить ячейку "член бригады", выбрать фамилию, а затем снова выделить ячейку "Выдающий наряд" - то происходит вылет.  
Вообще - несколько раз уже пытаюсь оптимизировать эту юзерформу4, но почему-то начинаются вылеты...  уже руки опускаются...
 
Все верно.  
       UserForm4.ListBox1 = ActiveCell  
       UserForm4.ListBox1.RowSource = "ВН_у"  
Вы сначала пытаетесь выделить в списке строку из RowSource, к-рый присвоится только в следующей инструкции.
Я сам - дурнее всякого примера! ...
 
А как будет выглядеть фрагмент макроса?:  
"Если юзерформа1 открыта - то закрыть юзерформу1, а если закрыта - то перейти к следующему условию."  
а то у меня макрос спотыкается о закрытые юзерформы, пытаясь безусловно закрыть то, что уже и так закрыто.  
Спасибо.
 
If UserForm1.Visible Then  
Unload UserForm1  
Else  
'...  
End If  
или просто:  
on error resume next
Я сам - дурнее всякого примера! ...
 
Спасибо большое! - пришлось кардинально переработать код листа и юзерформы4, ваша подсказка: "on error resume next" здорово выручила. теперь все работает быстро и так, как было задумано.  
Остались только "тормоза" при работе юзерформы3, но это из за большого кол-ва циклов макроса (несколько сотен), которые он проделывает в процессе построения списка. Но и тут у меня уже есть некоторые задумки.  
А в дальнейшем планирую сделать форму (или лист) "мастер" для грамотного ввода данных в "Базу2", а то сейчас кроме меня в этом никто не разберется.
 
Скажите пожалуйста, как вообще пользоваться этими файлами для заполнения наряда-допуска? Скачал эти файлы, а что с ними делать не понятно. Разъясните пожалуйста, очень надо.
 
Скажите пожалуйста, как вообще пользоваться этими файлами для заполнения наряда-допуска? Скачал эти файлы, а что с ними делать не понятно. Разъясните пожалуйста, очень надо.
 
Я себе сделал в Экселе наряд, полностью автоматизировав заполнение  
Но! Дальше дело не пошло, т.к. забраковали, ибо в Правилах написано, что наряд заполнять ручкой  
ВСЁ!
Страницы: 1
Читают тему
Наверх