Тема специфичная и может быть интересной электрикам, занимающимся ремонтом и обслуживанием промышленного эл.оборудования. Пару месяцев назад задался целью "соорудить" EXCEL-евский файл для максимально быстрого заполнения и печати бланков "Наряд-допуск". Об Excel практически ничего не знал. Помог Ваш форум и еще пара-тройка сайтов. В инете есть пара программ для аналогичной цели, но мне они не подходили, т.к. 1 - платные. 2 - требуют установки на комп, а наши служебные компы запаролены и не позволяют установку на них чего-либо. 3 - проги не вполне отвечают нашим требованиям по форме заполнения бланка. Закончил свое "творение", но осталось несколько вопросов. 1. Как научить макрос загружать список, расположенный на другом листе (Bases1, Bases2) в листбокс юзерформы, вызываемой с первого листа (Editor). А то я был вынужден перенести все списки на первый лист. 2. Юзерформа со списком лиц вызывается по клику в одной из избранных ячеек. но если юзерформа уже открыта, то при клике по другой незащищенной ячейке - в нее вводится значение, уже выбранное в листбоксе юзерформы ранее для другой ячейке. Мне удалось не допустить этого лишь командой очистки выбранной ячейки в макросе листбокса. а хотелось бы чтобы чтобы при клике по избранной ячейке только открывалась юзерформа со списком лиц, но значение в ячейке не менялось. А менялось только после клика по строке листбокса. 3. Юзерформа выбора времени записывает промежуточные значения в ячейки, а потом собирает эти значения в одно и вставляет в выбранную ячейку. А хотелось бы чтобы все делалось в макроке - без промежуточных записей в ячейки.
Посмотрел Ваш файл - там черт ногу сломает. Врядли дождетесь мазохиста, к-рый захочет во всем этом рыться. Делайте простые примеры, разбив вашу задачу на несколько - быстрей получите ответ. "загружать список, расположенный на другом листе"... Самый простой способ, как мне кажется, сделать именованные диапазоны для списков. Тогда,например: ListBox1.RowSource = "Courses"' Имя диапазона И неважно на каком он листе.
Спасибо большое! все оказалось просто! у меня эти диапазоны уже именованы, а я про это забыл и пытался обратиться к ним типа: ListBox1.RowSource = Range... да только не получалось. но все же, мне интересно, без именованных диапазонов можно как-то обойтись? И по второму вопросу - Юзерформа "Выбор времени" запускается по клику по одной из ячеек G56,G58,G60,G62,G64. Когда кликаем по одной из кнопок "часы" - значение этой кнопки записывается в ячейку R55, после чего значения из R55, ":", S55 и T55 сцепляются и копируются в выделенную ячейку. Точно так же при нажатии одной из кнопок "минуты" - значение кнопки записывается в ячейки S55 и T55, после чего они все опять сцепляются и копируются в выделенную ячейку. Как бы это проделать только макросом, не занося промежуточные данные в ячейки R55,S55,T55. ?
Спасибо большое. Со вторым вопросом сам разобрался - вставил второй текстбокс в юзерформу и теперь промежуточные результаты сохраняются в 1 и 2 текстбоксах.
Тоже через ж. Сделайте три глобальных переменных и храните пром. значения в них. Хотя и этого не надо. Можно в модуле формы объявить переменные static.
Я себе решил эту проблему так, как приведено в приложеном файле. Конечно спепень автоматизации можно увеличить, но меня устраивает пока так. И еще, в Брянскэнерго, после одного несчастного случая появилась в бланке наряда допуска еще одна табличка. Не пугайтесь, если она не нужна, ее легко можно удалить.
Ну тут у вас можно конечно поспорить - за каким... нужно работнику оперативного персонала получать еще какие-то инструктажи, тем более от отв.руководителя или производителя, который может быть вовсе из сторонней организации? - Наверное с большого перепугу! Не знаю, можно ли так радикально переделывать форму бланка, как это проделано у вас? - Это все-таки утвержденная форма. А вообще, мое мнение - форму давно пора переделать! - Одних только таблиц с инструктажами сколько понаплодили... Один хрен их никто не проводит в реалии.
{quote}{login=KukLP}{date=11.12.2011 07:47}{thema=}{post}Тоже через ж. Сделайте три глобальных переменных и храните пром. значения в них. Хотя и этого не надо. Можно в модуле формы объявить переменные static.{/post}{/quote}
См. Указания по заполнению наряда-допуска для работ в электроустановках. Межотраслевых правил по охране труда (правил безопасности) при эксплуатации электроустановок ПОТ РМ-016-2001. Правее правил нет ничего!
{quote}{login=KukLP}{date=12.12.2011 05:27}{thema=}{post}Замените текстом из файла ВЕСЬ текст модуля UserForm1.{/post}{/quote} Ваш вариант мне нравится в плане того, что всё делается в коде макроса, но по сравнению с моим (с 2-мя текстбоксами) в некоторых случаях работает некорректно: если ввести час, но не вводить минуты, или наоборот, - то в текстбоксе появится ЧЧ: или :ММ , и если при этом сразу же кликнуть по другой ячейке - то это некорректное значение в нее запишется! Этого не наблюдается в моем варианте. Смотрите в прикрепленном файле. Но меня сейчас заботит другой вопрос. Когда юзерформа открыта - то при выделении любой ячейке на листе - в нее запишется значение из юзерформы, что не есть правильно! Значения должны вставляться в только в те ячейки, из которых собственно и происходит запуск юзерформы. Вариант с автозакрытием юзерформы после ввода значения в ячейку не годится, т.к. при следующем запуске значения снова обнуляются, а это неудобно, т.к. приходится каждый раз вводить часы и минуты. Сейчас же, если время в ячейках различается только в минутах - то достаточно выделить след. ячейку и нажать кнопку с нужными минутами. В общем, в идеале задумка такая: - если юзерформа открыта и мы выделяем любую ячейку листа, кроме тех пяти, из которых она и запускается - то юзерформа должна закрыться, или по крайней мере в выделенной ячейке значение не менялось бы.
За подсказку спасибо. Попробовал, работает. В ненужные ячейки действительно не вставляет значение. Но у меня несколько юзерформ. И я попробовал несколько изменить код листа:
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, а если закрыта - то перейти к следующему условию." а то у меня макрос спотыкается о закрытые юзерформы, пытаясь безусловно закрыть то, что уже и так закрыто. Спасибо.
Спасибо большое! - пришлось кардинально переработать код листа и юзерформы4, ваша подсказка: "on error resume next" здорово выручила. теперь все работает быстро и так, как было задумано. Остались только "тормоза" при работе юзерформы3, но это из за большого кол-ва циклов макроса (несколько сотен), которые он проделывает в процессе построения списка. Но и тут у меня уже есть некоторые задумки. А в дальнейшем планирую сделать форму (или лист) "мастер" для грамотного ввода данных в "Базу2", а то сейчас кроме меня в этом никто не разберется.
Скажите пожалуйста, как вообще пользоваться этими файлами для заполнения наряда-допуска? Скачал эти файлы, а что с ними делать не понятно. Разъясните пожалуйста, очень надо.
Скажите пожалуйста, как вообще пользоваться этими файлами для заполнения наряда-допуска? Скачал эти файлы, а что с ними делать не понятно. Разъясните пожалуйста, очень надо.
Я себе сделал в Экселе наряд, полностью автоматизировав заполнение Но! Дальше дело не пошло, т.к. забраковали, ибо в Правилах написано, что наряд заполнять ручкой ВСЁ!