Хочу поднять для обсуждения один очень интересный вопрос, который возник из собственного опыта и наблюдений за применением пользовательских форм (UserForm) в VBA.
Стандартный способ применения UserForm заключается в следующем: по всему коду программы разбросаны обращения к элементам формы, и где-то в конце концов появляется долгожданное Show, после чего вызванная форма, используя переменные из других модулей программы, начинает работу. В случае внесения изменений и доработок в программу, начинается мучительный поиск обращений к элементам формы и корректировка этих обращений. Так же выглядит адаптация чьей-то формы или программы под свои нужды - необходимо лопатить множество строк кода, выискивая, где формируется значение того или иного элемента управления.
Я хочу предложить несколько иной вариант применения UserForms. В своих проектах я считаю форму "чёрным ящиком", о котором вся остальная программа знает только имя и точку входа. За точку входа я принимаю функцию: [vba]
Код
Public Function NewShow(разные параметры) as КакойТоТип
[/vba] Тип функции и её параметры зависят от назначения UserForm, и, по сути, стандартизированы быть не могут. Чаще всего тип функции - Boolean, имитирующий нажатие кнопок <Принять> (True) и <Отмена> (False), а большинство необходимых данных возвращаются в параметры, переданные по ссылке. Но никто не мешает применять тот же VbMsgBoxResult или просто String (пустая строка - <Отмена>) и т.п., а также вообще ничего не возвращать (благо, VBA позволяет вызывать функцию как метод, без применения значения).
Внутренняя структура входной функции выглядит примерно так: [vba]
Код
Public Function NewShow(разные параметры) as КакойТоТип применение параметров к элементам формы Me.Show НеобходимаяМодальность формирование результата End Function
[/vba] Принятие несколько лет назад этого метода на вооружение сэкономило мне множество сил по доработке и переработке проектов (особенно крупных), когда я мог изменять форму под новые требования, не оглядываясь на остальную программу и не вспоминая элементы, на которые есть ссылки из других частей программы.
Конечно, бывают случаи, когда удобнее применять прямой доступ к элементам формы, но, честно сказать, таких случаев очень немного.
Как пример оформления пользовательской формы по этому правилу могу предложить доработанный мной календарик из соответствующей темы
Хочу поднять для обсуждения один очень интересный вопрос, который возник из собственного опыта и наблюдений за применением пользовательских форм (UserForm) в VBA.
Стандартный способ применения UserForm заключается в следующем: по всему коду программы разбросаны обращения к элементам формы, и где-то в конце концов появляется долгожданное Show, после чего вызванная форма, используя переменные из других модулей программы, начинает работу. В случае внесения изменений и доработок в программу, начинается мучительный поиск обращений к элементам формы и корректировка этих обращений. Так же выглядит адаптация чьей-то формы или программы под свои нужды - необходимо лопатить множество строк кода, выискивая, где формируется значение того или иного элемента управления.
Я хочу предложить несколько иной вариант применения UserForms. В своих проектах я считаю форму "чёрным ящиком", о котором вся остальная программа знает только имя и точку входа. За точку входа я принимаю функцию: [vba]
Код
Public Function NewShow(разные параметры) as КакойТоТип
[/vba] Тип функции и её параметры зависят от назначения UserForm, и, по сути, стандартизированы быть не могут. Чаще всего тип функции - Boolean, имитирующий нажатие кнопок <Принять> (True) и <Отмена> (False), а большинство необходимых данных возвращаются в параметры, переданные по ссылке. Но никто не мешает применять тот же VbMsgBoxResult или просто String (пустая строка - <Отмена>) и т.п., а также вообще ничего не возвращать (благо, VBA позволяет вызывать функцию как метод, без применения значения).
Внутренняя структура входной функции выглядит примерно так: [vba]
Код
Public Function NewShow(разные параметры) as КакойТоТип применение параметров к элементам формы Me.Show НеобходимаяМодальность формирование результата End Function
[/vba] Принятие несколько лет назад этого метода на вооружение сэкономило мне множество сил по доработке и переработке проектов (особенно крупных), когда я мог изменять форму под новые требования, не оглядываясь на остальную программу и не вспоминая элементы, на которые есть ссылки из других частей программы.
Конечно, бывают случаи, когда удобнее применять прямой доступ к элементам формы, но, честно сказать, таких случаев очень немного.
Как пример оформления пользовательской формы по этому правилу могу предложить доработанный мной календарик из соответствующей темыSkif-F
Сообщение отредактировал Skif-F - Пятница, 24.04.2015, 00:54