Страницы: 1
RSS
Удаление UserForm из самой формы и импорт его же из общей папки
 
Добрый день.
Есть ли возможность обновлять UserForm программно (под обновлением понимаю её же удаление и импорт из общего источника) с условием, что процесс "обновления" начинался бы нажатием кнопки в самой форме?
 
да, такая возможность есть
(если в настройках Excel стоит галочка «доверять программный доступ к проекту VBA»)

но зачем???
я делал самые разные макросы, даже очень сложные, - и ни разу такая потребность не возникала...
 
Данная галочка стоит. Если макрос находиться в отдельном модуле, то он свободно удаляет/добавляет, тут вопросов нет.
На работе разрабатывается UserForm с разного рода инструментами для оптимизации рабочего процесса для сотрудников и хотелось бы обновлять ее просто и быстро (не у всех хорошо с Excel, из-за этого банальное не желание что либо долгое делать, да и подходить к каждому занимает время, работа не связана с программированием).
Суть в том чтобы пользователь по команде просто открывал саму UserForm и нажимал кнопку, которая его же обновит. Выделять в панели быстрого доступа для этого отдельную кнопку нет смысла, это будет происходить раз в неделю или реже (возможно вообще пропадет потребность), не хотелось бы захламлять.

Если запускать процесс "обновления" из самой формы, которую надо обновить, то вылетит ошибка, мол форма вообще-то используется. Процесс начатый в одном макросе там же заканчивается... можно ли это обойти?  
 
Цитата
Alfenok написал:
вылетит ошибка, мол форма вообще-то используется.
можно ли это обойти?
А как Вы себе это представляете? Под эту форму выделен кусок памяти в ОС, которую нельзя высвободить, не закрыв форму.

Может надо иначе попробовать к вопросу подойти? Например, не кнопка на ПБД, а отдельная надстройка с кнопкой ОБНОВИТЬ и всем остальным, что Вы там распространяете. Надстройкой и в дальнейшем управлять проще - можно просто заменить её на диске и в ней будет уже все новое со всеми исправлениями. Не вариант?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да, спасибо, это вариант. А есть метод выгрузки формы из памяти? А то макрос не удаляет форму (которая открывалась хотя бы раз) непосредственно во время возникновения события, а только после завершения работы макроса. Много видел ссылок на метод Unload, но он не работает, вроде как в VBA вообще нет его.
 
Цитата
Alfenok написал:
метод Unload, но он не работает, вроде как в VBA вообще нет его
8-0
Unload UserForm1
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Alfenok написал:
метод Unload, но он не работает, вроде как в VBA вообще нет его
Странно - а я всё время им пользуюсь, выгружая форму: Unload Me )
 
вешаете кнопку на форму
в кнопке пишете код
Код
1
2
Application.ontime now + 1/86400, "UpdateForm" ' запуск через секунду
Unload me
вне формы (в стандартном модуле) пишете макрос с названием UpdateForm, который запустит обновление

но я бы такого не делал
программу (код) и данные (таблицы Excel) надо разделять (на 2 отдельных файла), если надо часто обновлять код.
В одном файле все держать можно только в том случае, если кроме вас (автора кода) никто им не пользуется.
Если же несколько пользователей, - сделайте надстройку, которая подключается при запуске к открытому файлу Excel с данными (надо-то строк 10-20 кода добавить)
 
У меня в одной задаче очистка формы по кнопке на самой форме так:
Код
1
2
3
4
Private Sub Кнопка_Очистить_Click()
    Unload Форма_заполнения_договора
    Форма_заполнения_договора.Show
End Sub
И всё работает
 
Цитата
Игорь написал: но я бы такого не делал
а чем это чревато?
я просто у себя на фирме сделал обновление формы, модулей именно таким способом как хочет ТС. Все нормально работало.
В сетевой папке текстовый файлик с версией формы - у юзеров проверка - если их версия меньше моей - обновление.
15 чел обновлялись и не надо было каждому ходить устанавливать)

п.с. - совет ТС - не выдавайте юзерам сообщений типа "обновить форму?" "произошло обновление" и т.д. - делайте все тихо - вам спокойнее будет)
Изменено: Dima S - 07.05.2016 16:34:13
 
Unload Me не помогло...
Но в целом проблема решилась, спасибо огромное!
Очень помогла следующая строчка от Игоря :
Код
1
Application.ontime now + 1/86400, "UpdateForm" ' запуск через секунду
Соответственно код имеет следующий вид.
Кнопка в форме:
Код
1
2
3
4
Private Sub CommandButton7_Click()
Application.OnTime Now + 1 / 86400, "UpdateUserForm"
Unload Me
End Sub
Макрос:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub UpdateUserForm()
 
On Error GoTo Error1
With ThisWorkbook.VBProject.VBComponents
    .Remove .item("UserForm1")
End With
Error1:
 
On Error GoTo Error2
ThisWorkbook.VBProject.VBComponents.Import ("...\UserForm1.frm") 'Адрес
MsgBox "Успешно!"
Exit Sub
Error2:
 
Application.OnTime Now + 1 / 86400, "UpdateUserForm"
 
End Sub
Ранее застревал в макросе на второй ошибке, не удавалось ему импортировать форму, т.к. форма использовалась (в предыдущем сообщении описывал проблему) и надо было макрос запускать еще раз, потому что он только удалил форму.
Dima S, согласен с тем что пользователю лучше поменьше знать и видеть лишних табличек, но пренебрегаю этим, так как обновление это будет не столь частым.  
Изменено: Alfenok - 10.05.2016 12:59:08
Страницы: 1
Читают тему
Наверх
Loading...