В настоящей заметке рассматриваются методы создания пользовательских форм и работы с ними.[1] Пользовательские диалоговые окна создаются на основе технологии пользовательских форм, к которым можно получить доступ из редактора Visual Basic (VBE; подробнее см. Настройка среды Visual Basic Editor).
Рис. 1. Окно новой пустой формы UserForm
Скачать заметку в формате Word или pdf, примеры в формате архива
Стандартная последовательность шагов при этом следующая:
- Вставьте новую форму UserForm в проект VBAProject рабочей книги.
- Добавьте элементы управления в форму UserForm.
- Настройте свойства добавленных элементов управления.
- Создайте процедуры «обработчики событий» для элементов управления. Эти процедуры добавляются в модуль кода UserForm и выполняются при возникновении различных событий (например, при щелчке на кнопке).
- Разработайте процедуру, которая отображает форму UserForm. Эта процедура находится в модуле VBA (а не в модуле кода для формы UserForm).
- Определите простой способ вызова на выполнение процедуры, созданной в п. 5. Можно поместить кнопку на рабочий лист, команду ленты и т.д.
Рассмотрим эти шаги подробнее.
Вставка новой формы UserForm
Чтобы добавить в проект форму UserForm, запустите VBE (например, нажав в Excel клавиши <Alt+F11>), выберите рабочую книгу в окне Project и выполните команду Inserts –> UserForm). Формы UserForm получают такие имена, как UserForm1, UserForm2 и т.д. Можно переименовать форму, изменив свойство Name в окне Properties (см. рис. 1). Если это окно не отображается, нажмите в VBE клавишу <F4>. В рабочей книге может быть произвольное количество форм UserForm, а каждая форма включает единственное пользовательское диалоговое окно.
Добавление элементов управления в пользовательское диалоговое окно
Чтобы добавить элементы управления в форму UserForm, воспользуйтесь панелью Toolbox. Обратите внимание, что в VBE отсутствуют команды меню, предназначенные для добавления элементов управления. Если панель Toolbox не отображена на экране, пройдите по меню View –> Toolbox (рис. 2).
Рис. 2. Окно Toolbox для добавления элементов управления в пользовательскую форму
Щелкните на той кнопке в панели Toolbox, которая соответствует добавляемому элементу управления. После этого щелкните внутри диалогового окна для создания элемента управления (используется размер элемента по умолчанию). Также можно щелкнуть на элементе управления и, перетащив его границы в диалоговом окне, задать необходимый размер в пользовательском диалоговом окне. Добавленному элементу управления назначается имя, которое состоит из названия типа элемента управления и числового кода. Рекомендуется их переименовать, чтобы в коде VBA было понятно, с чем вы имеете дело. Согласитесь, что РrоductListBox звучит лучше, чем ListBox1.
Элементы управления в окне Toolbox
Форма UserForm, которая показана на рис. 3, размещена в файле all userform controls.xlsm.
Рис. 3. Эта форма UserForm содержит 15 элементов управления
Элемент управления CheckBox (6) предоставляет пользователю возможность выбрать один из двух вариантов: включить или выключить. Если галочка установлена, то CheckBox имеет значение True, в противном случае – False.
ComboBox (4) подобен объекту ListBox (5). Отличие заключается в том, что ComboBox представляет раскрывающийся список, в котором в определенный момент времени отображается только одно значение. Кроме того, пользователю в поле списка разрешено вводить значение, которое необязательно представляет одну из опций объекта ComboBox.
Каждое создаваемое диалоговое окно будет иметь как минимум один элемент управления CommandButton (10). Обычно используются кнопки ОК и Отмена.
Элемент управления Frame (9) применяется в качестве оболочки для других элементов управления. Он добавляется в диалоговое окно либо в целях эстетики, либо из соображений логического группирования однотипных элементов управления. Элемент управления Frame требуется в случае, если в диалоговом окне содержится более одного набора элементов управления OptionButton.
Элемент управления Image (15) используется для представления графического изображения, которое сохранено в отдельном файле или вставляется из буфера обмена. Графическое изображение сохраняется вместе с рабочей книгой. Таким образом, вместе с рабочей книгой передавать другому пользователю копию графического файла необязательно. Некоторые графические файлы занимают много места, поэтому их включение в рабочую книгу приведет к радикальному увеличению ее размера.
Элемент управления Label (2) отображает текст в диалоговом окне.
Элемент управления ListBox (5) предоставляет список опций, из которого пользователь может выбрать один вариант (или несколько). Вы вправе указать диапазон на листе, который содержит элементы списка. Этот диапазон может состоять из нескольких столбцов. Кроме того, элемент управления ListBox может заполняться с помощью кода VBA.
Элемент управления MultiPage (12) позволяет создавать диалоговые окна с несколькими вкладками, которые подобны появляющимся после выбора команды Формат ячеек. По умолчанию элемент управления MultiPage состоит из двух вкладок.
Элемент управления OptionButton (7) применяется при выборе пользователем одного варианта из нескольких. Эти элементы управления всегда группируются в диалоговом окне в наборы, содержащие не менее двух опций. Когда один элемент управления OptionButton выбран, все остальные элементы управления OptionButton текущей группы автоматически становятся неактивными. Если в пользовательском диалоговом окне содержится более одного набора элементов управления OptionButton, то каждый из таких наборов должен иметь собственное значение свойства GroupName. В противном случае все элементы управления OptionButton в диалоговом окне рассматриваются как члены одной группы. Также можно вставить элементы управления OptionButton в объект Frame, что приведет к их автоматическому группированию.
Элемент управления RefEdit (16) используется тогда, когда пользователь должен выделить диапазон ячеек на листе.
Элемент управления ScrollBar (13) в некотором смысле подобен элементу управления SpinButton. Разница заключается в том, что пользователь может перетаскивать ползунок объекта ScrollBar для изменения значения с большим приращением. Элемент управления ScrollBar рекомендуется использовать при выборе значения из большого диапазона.
Элемент управления SpinButton (14) позволяет выбрать значение после щелчка на одной из двух кнопок со стрелками. Одна из них применяется для увеличения значения, а вторая — для уменьшения. Элемент управления SpinButton часто используется совместно с элементами управления TextBox и Label, которые содержат текущее значение элемента управления SpinButton.
Элемент управления TabStrip (11) подобен элементу управления MultiPage, однако использовать его сложнее. Элемент управления TabStrip, в отличие от MultiPage, не выступает контейнером для других объектов. Как правило, элемент управления MultiPage обладает более широкими возможностями.
Элемент управления TextBox (3) позволяет пользователям вводить текст в диалоговом окне.
Элемент управления ToggleButton (8) имеет два состояния: включен и выключен. Щелчок на кнопке приводит к изменению состояния на противоположное и к изменению внешнего вида кнопки. Этот элемент управления может иметь значение True (активен) или False (неактивен). Он не относится к «стандартным» элементам управления, поэтому использование двух элементов управления OptionButton или одного CheckBox может оказаться более удачным вариантом.
Использование элементов управления на рабочем листе
Элементы управления пользовательскими диалоговыми окнами могут встраиваться в рабочий лист (без использования UserForm). Доступ к элементам управления можно получить, пройдя в Excel Разработчик –> Элементы управления –> Вставить. Для использования подобных элементов в составе рабочего листа требуется гораздо меньше усилий, чем для создания пользовательского диалогового окна. Кроме того, в данном случае можно не создавать макросы, поскольку элемент управления можно связать с ячейкой рабочего листа.
Например, если на рабочий лист вставить элемент управления CheckBox, его можно связать с нужной ячейкой, задав свойство LinkedCell. Если флажок установлен, в связанной ячейке отображается значение ИСТИНА. Если же флажок сброшен, то в связанной ячейке отображается значение ЛОЖЬ. Например, на рис. 4 переключатель «Фикс. Ставка 20%» связан с ячейкой Н15. Рисунок отображает рабочий лист, содержащий некоторые элементы управления ActiveX (см. файл activex worksheet controls.xlsx). Книга включает связанные ячейки и не содержит макросов.
Рис. 4. Элементы управления ActiveX без макросов
Элементы управления на рабочем листе могут происходить из двух источников:
- Элементы управления формами. Эти элементы управления являются внедряемыми объектами.
- Элементы управления ActiveX. Эти элементы управления являются подмножеством элементов, доступных в пользовательских диалоговых окнах.
Эти элементы управления работают не одинаково. После добавления элемента управления ActiveX в рабочий лист Excel переходит в режим конструктора. В этом режиме можно настраивать свойства любого элемента управления рабочего листа, добавлять или изменять процедуры обработки событий для элемента управления, а также изменять его размер или положение. Для отображения окна свойств элемента управления ActiveX воспользуйтесь командой Разработчик –> Элементы управления –> Свойства.
Для создания простых кнопок можно использовать элемент управления Button (Кнопка), который находится на панели инструментов Формы (Form). В этом случае обеспечивается возможность запуска макроса. Если же воспользоваться элементом управления CommandButton, который относится к группе элементов управления ActiveX, то после щелчка на нем вызывается связанная процедура обработки событий (например, CommandButton1_Click), которая находится в модуле кода объекта Лист (Sheet). Связать макрос с этой процедурой нельзя.
Если Excel находится в режиме конструктора, тестирование элементов управления невозможно. В этом случае нужно выйти из режима конструктора, щелкнув на кнопке Разработчик –> Элементы управления –> Режим конструктора. Эта кнопка работает, как переключатель.
Настройка элементов управления пользовательского диалогового окна
Продолжим описание использования элементов управления в UserForm. После того, как элементов управления помещен в диалоговое окно, его можно переместить и изменить размер. Можно выделить несколько элементов управления. Для этого следует удерживать нажатой клавишу <Shift> и щелкать на объектах либо обвести указателем мыши необходимые элементы управления.
В форме UserForm содержатся вертикальные и горизонтальные направляющие, которые помогают выровнять добавленные в диалоговое окно элементы управления. При добавлении или перемещении элемент управления привязывается к направляющим, что облегчает упорядочение таких элементов в окне. Если вы не используете направляющие, можете их отключить, выбрав в VBE команду Tools –> Options. В диалоговом окне Options перейдите на вкладку General и выберите соответствующие параметры в разделе Form Grid Settings.
Меню Format окна VBE предоставляет несколько команд, которые позволяют точно разместить и выровнять элементы управления в диалоговом окне. Перед использованием этих команд необходимо указать элементы управления, к которым они будут применяться (рис. 5).
Рис. 5. Выравнивание элементов в форме UserForm
Если выделено несколько элементов управления, на выделяющей рамке одного из них (обычно последнего) вместо обычных черных маркеров появляются белые. Это означает, что этот элемент управления играет роль основы, на базе которой определяются размеры и расположение других элементов управления.
Изменение свойств элементов управления
Каждый элемент управления характеризуется набором параметров, которые определяют внешний вид и поведение элемента управления. Свойства элемента управления можно изменять в следующих случаях:
- В момент проектирования при разработке пользовательского диалогового окна. Для этого используется окно Properties.
- В процессе выполнения, когда пользовательское диалоговое окно отображается на экране. Для этого воспользуйтесь инструкциями VBA.
Работа с окном Properties. В VBE окно Properties позволяет изменять свойства выделенного элемента управления (это может быть обычный элемент управления или сама форма UserForm, рис. 6).
Рис. 6. Окно Properties для выделенного элемента управления OptionButton
В окне Properties есть две вкладки. На вкладке Alphabetic свойства выбранного объекта отображаются в алфавитном порядке. На вкладке Categorized эти свойства сгруппированы по категориям. Обе вкладки отображают одни и те же свойства.
Для того чтобы изменить свойство, необходимо щелкнуть на нем и ввести новое значение. Некоторые свойства могут принимать только ограниченный набор допустимых значений, выбираемых из соответствующего списка. После щелчка на таком свойстве в окне Properties будет отображена кнопка со стрелкой, указывающей вниз. Щелкните на этой кнопке, чтобы выбрать значение из предложенного списка. Например, свойство TextAlign может принимать одно из следующих значений: 1 — fmTextAlignLeft, 2 — fmTextAlignCenter и 3 — fmTextAlignRight.
После выделения отдельных свойств (например, Font и Picture) рядом с ними отображается небольшая кнопка с троеточием. Щелчок на этой кнопке приводит к вызову диалогового окна настройки свойства.
Для свойства Picture элемента управления Image необходимо указать графический файл или вставить изображение из буфера обмена. В последнем случае следует сначала скопировать его в буфер обмена, а затем выбрать свойство Picture элемента управления Image и нажать комбинацию клавиш <Ctrl+V> для вставки содержимого буфера обмена. Если выделить два или более элементов управления одновременно, в окне Properties отобразятся только те свойства, которые являются общими для этих объектов.
Объекту UserForm присущ ряд свойств, значения которых можно изменять. Эти свойства применяются в качестве значений, заданных по умолчанию, для элементов управления, которые добавляются в пользовательские диалоговые окна. Например, если изменить свойство Font пользовательского диалогового окна, все добавленные в окно элементы управления будут применять этот шрифт.
Общие свойства. Каждый элемент управления имеет как собственный набор уникальных свойств, так и ряд общих свойств, присущих другим элементам управления. Например, все элементы управления имеют свойство Name и свойства, определяющие его размер и расположение на форме (Height, Width, Left и Right). Если вы собираетесь работать с элементом управления с помощью кода VBA, присвойте ему значащее имя. Например, первый элемент управления OptionButton, который добавлен в пользовательское диалоговое окно, по умолчанию получит имя ОрtionButton1. В коде ссылка на этот объект будет выглядеть следующим образом: OptionButton1.Value = True. Но если элементу управления OptionButton присвоить описательное имя (например, obLandscape), то можно использовать такой оператор: obLandscape.Value = True.
Многие пользователи предпочитают имена, которые указывают на тип объекта. В предыдущем примере был использован префикс ob, который указывает на то, что объект является элементом управления OptionButton.
Можно изменять значения свойств нескольких элементов управления одновременно. Например, вы вправе создать на форме несколько элементов управления OptionButton и выровнять их по левому краю. Для этого достаточно выделить все элементы управления OptionButton и изменить значение свойства Left в окне Properties. Все выделенные элементы управления примут новое значение свойства Left.
Чтобы получить доступ к справочной информации о свойствах различных элементов управления, щелкните на свойстве в окне Properties и нажмите клавишу <F1>.
Советы по использованию клавиатуры. Многие пользователи предпочитают перемещаться по диалоговым окнам с помощью клавиатуры. Комбинации клавиш <Таb> и <Shift+Tab> позволяют циклически переключаться между элементами управления. Чтобы удостовериться, что диалоговое окно корректно реагирует на команды с клавиатуры, обратите внимание на такие моменты: порядок просмотра элементов управления и комбинации клавиш.
Порядок просмотра определяет последовательность, в которой активизируются элементы управления после нажатия пользователем клавиши <Таb> или комбинации клавиш <Shift+Tab>. Кроме того, порядок активизации указывает, какой элемент управления по умолчанию выделяется на форме первым. Если пользователь вводит текст в элемент управления TextBox, то этот элемент считается активным. Если после этого щелкнуть на элементе управления OptionButton, то именно он станет активным. Элемент управления, назначенный первым для просмотра, будет активным в момент открытия диалогового окна.
Для того чтобы указать порядок активизации, выберите команду View –> Tab Order. Кроме того, можно щелкнуть правой кнопкой мыши на UserForm и выбрать пункт Тab Order из появившегося контекстного меню. Excel отобразит диалоговое окно Tab Order (Порядок просмотра, рис. 7).
Рис. 7. В диалоговом окне Tab Order измените порядок просмотра элементов управления
Также можно указать порядок активизации элемента управления с помощью окна Properties (см. рис. 6, самое последнее из отраженных свойств). Первый активизируемый элемент управления будет иметь свойство Tablndex = 0. Изменение значения свойства Tablndex текущero объекта приведет к изменению значений свойств Tablndex других элементов правления. Изменения вносятся автоматически. Вы можете удостовериться в том, что значения свойства Tablndex всех элементов управления не больше количества элементов управления в диалоговом окне. Если нужно удалить элемент управления из списка активизируемых объектов, то присвойте его свойству TabStop значение False.
Одни элементы управления, такие как Frame и MultiPage, служат контейнерами для других элементов управления. Элементы управления в таком контейнере имеют собственный порядок просмотра (активизации). Для установки порядка просмотра группы элементов управления OptionButtons, находящихся внутри элемента управления Frame, выделите элемент управления Frame до того, как будет выполнена команда View –> Tab Order.
Большинству элементов управления диалогового окна можно назначить комбинацию клавиш. Таким образом, пользователь получит доступ к элементу управления, нажав <Alt> и указанную клавишу. Применив свойство Accelerator в окне Properties, можно определить клавишу для активизации элемента управления.
Некоторые элементы управления, например, TextBox, лишены свойства Accelerator, поскольку не отображают значение свойства Caption. Но к таким элементам можно получить доступ с помощью клавиатуры, воспользовавшись свойством Label. Присвойте клавишу элементу управления Label и расположите его в порядке просмотра перед элементом TextBox.
Отображение пользовательского диалогового окна
Для того чтобы отобразить пользовательское диалоговое окно с помощью VBA, необходимо создать процедуру, которая вызывает метод Show объекта UserForm. Форму UserForm невозможно отобразить, не выполнив как минимум одну строку кода VBA:
Sub ShowForm() UserForm1.Show End Sub |
Данная процедура должна располагаться в стандартном модуле VBA, а не в модуле формы UserForm. При отображении пользовательская форма остается на экране до тех пор, пока ее не скроют. Обычно в нее добавляют элемент управления CommandButton, который запускает процедуру закрытия формы. Эта процедура либо выгружает пользовательскую форму с помощью метода Unload, либо удаляет ее с экрана с помощью метода Hide объекта UserForm.
Отображение немодальной формы. По умолчанию отображается модальная форма. Это означает, что форма должна исчезнуть с экрана прежде, чем пользователь выполнит какие-либо действия на рабочем листе (т.е. редактирование данных невозможно). Немодальную форму также можно отобразить. В этом случае вы вправе продолжать работу в Excel, не скрывая саму форму. Для отображения немодальной формы используется следующий синтаксис:
UserForm1.Show vbModeless
Тестирование пользовательского диалогового окна. Обычно в процессе разработки возникает необходимость в тестировании формы UserForm. Для этого можно воспользоваться одним из способов:
- выполните команду Run –> Run Sub/UserForm;
- нажмите <F5>;
- щелкните на кнопке Run Sub/UserForm, которая находится на стандартной панели инструментов.
Выбор одного из этих методов приводит к запуску события инициализации диалогового окна. Как только диалоговое окно будет отображено в тестовом режиме, можно проверить порядок активизации объектов, а также поддержку комбинаций клавиш.
Отображение пользовательского диалогового окна на основе значения переменной. В некоторых случаях приходится выбирать, какое окно UserForm будет отображено. Если название пользовательского диалогового окна хранится в виде строковой переменной, можно воспользоваться методом Add для добавления объекта UserForm в коллекцию UserForms с последующим обращением к методу Show из коллекции UserForms. В приведенном ниже примере название объекта UserForm присваивается переменной MyForm, после чего отображается пользовательское диалоговое окно.
MyForm = «UserForm1» UserForms.Add(MyForm).Show |
Загрузка пользовательского диалогового окна. В VBA поддерживается оператор Load. Загрузка пользовательского диалогового окна приводит к сохранению объекта формы в памяти. Однако до тех пор пока не будет выполнен метод Show, форма останется невидимой для остальной части программы. Для загрузки окна UserForm1 воспользуйтесь оператором:
Load UserForm1
Если вы применяете сложное диалоговое окно, то вам может понадобиться предварительно загрузить его в память, чтобы в случае необходимости быстро отобразить его с помощью метода Show. Как правило, использовать метод Load в подобном случае не имеет смысла.
О процедурах обработки событий. Как только диалоговое окно появляется на экране, пользователь начинает с ним взаимодействовать, т.е. генерирует события. Например, щелчок на элементе управления CommandButton приводит к возникновению события Click объекта CommandButton. Вам необходимо создать процедуры (обработчики событий), которые будут выполняться при возникновении соответствующих событий.
Процедуры обработки событий находятся в модуле кода объекта UserForm. Наряду с этим процедура обработки события может вызывать другие процедуры, которые находятся в стандартном модуле VBA.
В коде VBA можно изменять свойства элементов управления, пока пользовательское диалоговое окно отображается на экране (т.е. на этапе выполнения). Например, можно назначить элементу управления ListBox процедуру, которая изменяет текст элемента управления Label при выборе элемента списка.
Закрытие пользовательского диалогового окна
Для закрытия формы UserForm1 воспользуйтесь командой: Unload UserForm1. Если же код находится в модуле кода формы UserForm, воспользуйтесь оператором: Unload Me. В этом случае ключевое слово Me применяется для идентификации пользовательской формы.
Обычно в коде VBA команда Unload выполняется только после того, как форма UserForm выполнит все свои функции. Например, форма UserForm может содержать элемент управления CommandButton, который используется в качестве кнопки ОК. Щелчок на этой кнопке приводит к выполнению заранее определенного макроса. Одна из функций макроса заключается в выгрузке формы UserForm из памяти. В результате пользовательское диалоговое окно отображается на экране до тех пор, пока макрос, содержащий оператор Unload, не завершает свою работу.
Когда форма UserForm выгружается из памяти, элементы управления, содержавшиеся на ней, возвращаются в первоначальное состояние. Другими словами, в коде нельзя обращаться к значениям, указываемым пользователем, после того как форма будет выгружена из памяти. Если значения, введенные пользователем, будут применяться позже (после выгрузки диалогового окна UserForm), то необходимо присвоить их переменной с областью действия Public, которая определена в стандартном модуле VBA. Кроме того, значение всегда можно сохранить в ячейке листа.
Окно формы UserForm автоматически выгружается из памяти после того, как пользователь щелкает на кнопке Закрыть (обозначается символом х в заголовке окна). Это действие также приводит к возникновению события QueryClose объекта UserForm, за которым следует событие Terminate пользовательского диалогового окна. Объект UserForm может использовать метод Hide. После его вызова диалоговое окно исчезает, но остается в памяти, поэтому в коде можно получить доступ к различным свойствам элементов управления:
UserForml.Hide
Если ваш код находится в модуле кода объекта UserForm, можно воспользоваться оператором:
Me.Hide
Если по какой-либо причине пользовательское диалоговое окно должно быть немедленно скрыто в процессе выполнения макроса, воспользуйтесь методом Hide в самом начале процедуры, а затем укажите команду DoEvents. Например, в следующей процедуре форма UserForm немедленно исчезнет после того, как пользователь щелкнет на кнопке CommandButton1. Последний оператор процедуры выгружает пользовательское диалоговое окно из памяти.
Private Sub CommandButton1_Click() Me.Hide Application.ScreenUpdating = True For r = 1 To 10000 Cells(r, 1) = r Next r Unload Me End Sub |
В рассматриваемом примере переменной ScreenUpdating присвоено значение True, в результате чего Excel полностью скрывает окно UserForm. Если этот оператор не использовать, окно UserForm остается видимым.
Пример создания пользовательского диалогового окна
В примере представлено диалоговое окно, предназначенное для получения имени и пола пользователя. В диалоговом окне вы найдете элемент управления TextBox, используемый для ввода имени, и два элемента управления OptionButton для указания пола. Информация, полученная в диалоговом окне, заносится в пустую строку рабочего листа.
Создание пользовательской формы. Создайте рабочую книгу, содержащую только один рабочий лист. Нажмите комбинацию клавиш <Alt+F11> для активизации VBE. В окне Project выберите проект рабочей книги и выполните команду Inserts –> UserForm. Воспользуйтесь окном Properties для изменения значения свойства Caption формы UserForm на Укажите имя и пол (если окно Properties не отображается, нажмите <F4>).
Рис. 8. Создание пользовательской формы
Добавьте элемент управления Label и настройте его свойства (рис. 9):
Свойство Значение
Accelerator И
Caption Имя:
Tablndex 0
Рис. 9. Пользовательская форма с элементами управления
Добавьте элемент управления TextBox и измените его свойства:
Name TextName
Tablndex 1
Добавьте элемент управления Frame и измените его свойства:
Caption Пол
Tablndex 2
Добавьте элемент управления OptionButton в состав элемента Frame и измените его свойства:
Accelerator М
Caption Мужчина
Name OptionMale
Tablndex 0
Добавьте еще один элемент управления OptionButton в состав элемента Frame и измените его свойства:
Accelerator Ж
Caption Женщина
Name OptionFemale
Tablndex 1
Добавьте элемент управления CommandButton за пределами элемента Frame и измените его свойства:
Caption OK
Default True
Name OKButton
Tablndex 3
Добавьте еще один элемент управления CommandButton и настройте его свойства:
Caption Отмена
Default False
Name CloseKButton
Tablndex 4
При создании нескольких похожих элементов управления может оказаться, что быстрее копировать существующий элемент управления, чем создавать новый. Для копирования элемента управления удерживайте нажатой клавишу <Ctrl> при перетаскивании элемента управления, что приведет к созданию копии. После этого останется изменить свойства скопированного элемента управления.
Создание кода для отображения диалогового окна. После создания элементов управления на лист необходимо добавить элемент управления ActiveX, называемый Кнопка (CommandButton). Эта кнопка будет запускать процедуру, которая предназначена для отображения формы UserForm. Для этого выполните следующие действия:
- Перейдите в окно Excel (например, воспользуйтесь комбинацией клавиш <Alt+F11>).
- Выберите команду Разработчика –> Элементы управления –> Вставить и щелкните на значке Кнопка (CommandButton), который находится в разделе Элементы ActiveX.
- Разместите кнопку на рабочем листе. Чтобы измените ее подпись, щелкните на кнопке правой кнопкой мыши и выберите в контекстном меню команду Объект CommandButton –> Edit. Для изменения других свойств объекта щелкните на нем правой кнопкой мыши и выберите команду Properties.
- Дважды щелкните на объекте CommandButton. Это приведет к активизации VBE. При этом отобразится модуль кода для листа с открытой пустой процедурой обработки событий объекта CommandButton, который расположен на рабочем листе.
- Введите единственный оператор в процедуру CommandButton1_Click (рис. 10). В процедуре используется метод Show объекта UserForml для отображения пользовательского диалогового окна.
Рис. 10. Процедура CommandButton1_Click вызывается после щелчка на кнопке рабочего листа
Тестирование диалогового окна. После щелчка на кнопке, находящейся на рабочем листе, ничего не произойдет. Точнее, кнопка будет выделена, но это не приведет к инициализации каких-либо действий. Причина этого заключается в том, что программа Excel по-прежнему остается в режиме конструктора, в который она переходит автоматически после добавления элемента управления ActiveX. Для выхода из режима конструктора щелкните на кнопке Разработчик –> Элементы управления –> Режим конструктора. Если же требуется изменить кнопку, снова перейдите в режим конструктора. После выхода из режима конструктора щелчок на кнопке приведет к отображению пользовательского диалогового окна.
Когда диалоговое окно будет отображено, введите произвольный текст в текстовом поле и щелкните на кнопке ОК. В результате ничего не произойдет, что совершенно естественно, так как для объекта UserForm не создано ни одной процедуры обработки событий. Для закрытия диалогового окна щелкните на крестике в его заголовке.
Добавление процедур обработки событий. Перейдите в VBE. Удостоверьтесь в том, что пользовательское окно отображено на экране, и дважды щелкните на кнопке Отмена. Активизируется окно кода для формы UserForm, а также добавляется пустая процедура CloseButton_Click. Обратите внимание, что название процедуры состоит из имени объекта, символа подчеркивания и названия обрабатываемого события. Добавьте в процедуру единственный оператор:
Private Sub CloseButton_Click() Unload UserForm1 End Sub |
Эта процедура, которая вызывается после щелчка на кнопке Отмена, выгружает из памяти форму UserForm1.
Щелкните на значке View Object в верхней части окна Project Explorer или дважды кликните на строке UserForm1, чтобы отобразить форму UserForm1. Дважды щелкните на кнопке ОК и введите код процедуры – обработчика событий для события Click объекта OKButton:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Private Sub OKButton_Click() Dim NextRow As Long ‘ Проверка активности листа Лист1 Sheets(«Лист1»).Activate ‘ Проверка ввода имени If TextName.Text = «» Then MsgBox «Введите имя.» TextName.SetFocus Exit Sub End If ‘ Определение следующей пустой строки NextRow = _ Application.WorksheetFunction.CountA(Range(«A:A»)) + 1 ‘ Передача имени Cells(NextRow, 1) = TextName.Text ‘ Передача пола If OptionMale Then Cells(NextRow, 2) = «Мужчина» If OptionFemale Then Cells(NextRow, 2) = «Женщина» ‘ Очистка элементов управления для ввода следующей записи TextName.Text = «» TextName.SetFocus OptionMale = False OptionFemale = False End Sub |
Перейдите в Excel и щелкните на кнопке еще раз, чтобы отобразить пользовательское диалоговое окно. С его помощью можно добавлять новые имена в рабочий лист.
Процедура OKButton_Click работает следующим образом. Сначала она проверяет, активен ли лист Лист1, введено ли имя. После этого запускается функция Excel СЧЁТЗ (CountA) для определения следующей пустой ячейки в столбце А. Затем текст из текстового поля TextBox передается в определенную ячейку столбца А. С помощью операторов If определяется выделенный элемент управления OptionButton, что обеспечивает запись соответствующего текста в столбец В (пол). Далее элементы диалогового окна очищаются и окно перезапускается, чтобы обеспечить возможность введения следующей записи. Заметим, что щелчок на кнопке ОК не приведет к закрытию диалогового окна. Для завершения ввода данных (и выгрузки пользовательского диалогового окна) щелкните на кнопке Отмена.
Проверьте работоспособность комбинаций клавиш: Alt+М – активизирует мужской пол, Alt+Ж – женский. Рабочая книга с рассмотренным примером находится в файле get name and sex.xlsm.
События объекта User Form
Каждый элемент управления в форме UserForm (а также сам объект UserForm) разрабатывается для того, чтобы реагировать на определенные события. Эти события возникают в результате действий пользователя или генерируются программой Excel. Можно создать код, который будет выполняться при возникновении определенного события. Некоторые действия приводят к возникновению сразу нескольких событий. Например, щелчок на кнопке со стрелкой, направленной вверх, в элементе управления SpinButton приведет к возникновению события SpinUp и события Change. После того как пользовательское диалоговое окно будет отображено с помощью метода Show, Excel сгенерирует события Initialize и Activate объекта UserForm. В Excel также поддерживаются события, связанные с объектами Sheet (Лист), Chart (Диаграмма) и ThisWorkbook (ЭтаКнига).
Получение дополнительных сведений о событиях. Для того чтобы получить информацию о событиях, которые генерируются конкретным элементом управления, выполните следующее:
- Добавьте элемент управления в пользовательское диалоговое окно.
- Дважды щелкните на элементе управления, чтобы открыть модуль кода для объекта UserForm. VBE вставит пустую процедуру обработки события, принятого по умолчанию.
- Щелкните на раскрывающемся списке в правом верхнем углу окна модуля и просмотрите полный список событий, которые поддерживаются текущим элементом управления (на рис. 11 показан список событий для элемента управления CheckBox).
- Выберите событие из списка, и VBE создаст пустой обработчик события.
Рис. 11. Список событий для элемента управления CheckBox
Имя процедуры обработки событий включает имя объекта, который сгенерировал событие. Таким образом, если изменить имя элемента управления, придется внести соответствующие изменения и в имя процедуры обработки события. Имя процедуры не изменяется автоматически! Чтобы облегчить работу, присвойте описательные имена элементам управления до того, как приступите к созданию процедуры обработки соответствующих событий.
События объекта UserForm. Несколько событий непосредственно связано с отображением и выгрузкой объекта UserForm:
- Происходит перед загрузкой и отображением формы UserForm. Не происходит, если объект UserForm до этого был скрыт.
- Происходит в момент активизации объекта UserForm.
- Происходит в момент деактивизации объекта UserForm. Не происходит при сокрытии формы UserForm.
- Происходит перед выгрузкой объекта UserForm.
- Происходит после выгрузки объекта UserForm.
Важно правильно выбрать подходящее событие для процедуры обработки событий, а также проанализировать порядок выполнения событий. Использование метода Show приводит к возникновению событий Initialize и Activate (в указанном порядке). Применение команды Load приводит к вызову события Initialize. Команда Unload вызывает события QueryClose и Terminate (в указанном порядке). Метод Hide не приводит к вызову каких-либо событий.
В файле userform events.xlsm описанные события перехватываются и в момент возникновения события возникает окно сообщения. Если изучение событий объекта UserForm вызывает у вас затруднения, то, проанализировав код этого примера, вы получите ответы на многие вопросы.
События элемента управления SpinButton. Для того чтобы разобраться в концепции событий, мы подробно рассмотрим события, связанные с элементом управления SpinButton (рис. 12). Файл spinbutton events.xlsm демонстрирует применение событий, генерируемых объектами SpinButton и UserForm (первый содержится во втором). Рабочая книга включает несколько процедур обработки событий — по одной для каждого события элемента управления SpinButton и объекта UserForm. Каждая из этих процедур добавляет текст в столбце А с описанием события.
Рис. 12. События элемента управления SpinButton
Пользователь может управлять объектом SpinButton с помощью мыши или (если элемент управления активен) клавиш управления курсором. Когда пользователь щелкает мышью на верхней кнопке элемента управления SpinButton, происходят следующие события: Enter (генерируется только в том случае, если элемент управления неактивен); Change; SpinUp.
Пользователь может нажать клавишу <Таb> для того, чтобы сделать активным элемент управления SpinButton. Только после этого можно использовать клавиши управления курсором для изменения значения элемента управления. Если все именно так и происходит, то события генерируются в следующем порядке: Enter; KeyDown; Change; SpinUp (или SpinDown); KeyUp.
Элемент управления SpinButton может изменяться в коде VBA, что также провоцирует возникновение соответствующих событий. Например, оператор SpinButton1.Value = 0 устанавливает свойство Value элемента управления SpinButton1 равным 0, а это приводит к возникновению события Change. Такой результат достигается только в том случае, если исходное свойство Value не равно нулю.
Вы вправе предположить, что выполнить отмену генерирования событий можно, установив свойство EnableEvents объекта Application равным False. Но это свойство поддерживается только объектами, которые являются «истинными» в Excel: Workbook, Worksheet и Chart.
Совместное использование элементов управления SpinButton и TextBox. Элемент управления SpinButton имеет свойство Value, но не может отображать значение этого свойства. В большинстве случаев требуется, чтобы пользователь мог изменить значение элемента управления SpinButton непосредственно, а не многократно щелкая на элементе управления. Эффективным решением может стать объединение элемента управления SpinButton с элементом управления TextBox, что позволяет пользователю вводить значение элемента управления SpinButton непосредственно, используя для этого поле элемента управления TextBox. Кроме того, щелчок на элементе управления SpinButton позволит изменить значение, отображаемое в элементе управления TextBox.
На рис. 13 приведен пример (см. также файл spinbutton and textbox.xlsm). Свойство Min элемента управления SpinButton имеет значение 1, а свойство Мах— значение 100. Таким образом, щелчок на одной из стрелок элемента управления SpinButton приведет к изменению значения в пределах от 1 до 100. Код, реализующий «связывание» элементов управления SpinButton и TextBox сводится к созданию процедур обработки событий, которые будут синхронизировать свойство Value элемента управления SpinButton и свойство Text элемента управления TextBox.
Рис. 13. Комбинирование элементов управления SpinButton и TextBox
Представленная процедура выполняется каждый раз при возникновении события Change элемента управления SpinButton. Таким образом, процедура выполняется тогда, когда пользователь щелкает на элементе управления SpinButton или изменяет его значение, нажав одну из клавиш управления курсором.
Private Sub SpinButton1_Change() TextBox1.Text = SpinButton1.Value End Sub |
Если пользователь введет значение непосредственно в элемент управления TextBox, то будет сгенерировано событие Change, после чего должен выполняться следующий код:
Private Sub TextBox1_Change() Dim NewVal As Integer NewVal = Val(TextBox1.Text) If NewVal >= SpinButton1.Min And _ NewVal <= SpinButton1.Max Then _ SpinButton1.Value = NewVal End Sub |
Эта процедура начинается с вызова функции VBA Val, которая преобразует текст элемента управления TextBox в числовое значение (если элемент управления TextBox содержит строку, то функция Val возвращает значение 0). Следующий оператор определяет, попадает ли значение в указанный диапазон допустимых значений. Если это так, то свойство Value элемента управления SpinButton устанавливается равным значению, которое введено в поле элемента управления TextBox.
Пример организован таким образом, что щелчок на кнопке ОК (которая называется OKButton) передает значение элемента управления SpinButton в активную ячейку. Процедура обработки события Click элемента управления CommandButton выглядит следующим образом:
Private Sub OKButton_Click() ‘ Enter the value into the active cell If CStr(SpinButton1.Value) = TextBox1.Text Then ActiveCell = SpinButton1.Value Unload Me Else MsgBox «Некорректная запись.», vbCritical TextBox1.SetFocus TextBox1.SelStart = 0 TextBox1.SelLength = Len(TextBox1.Text) End If End Sub |
Данная процедура выполняет проверку: анализируются текст, введенный в поле элемента управления TextBox, и значения элемента управления SpinButton. Такая процедура обрабатывает ситуации неверного ввода данных. Например, если пользователь введет в поле элемента управления TextBox текст Зt, то значение элемента управления SpinButton не изменится, а результат, который помещается в активную ячейку, будет отличным от ожидаемого. Обратите внимание, что значение свойства Value элемента управления SpinButton преобразуется в строку с помощью функции CStr. Это позволяет предотвратить ошибку, которая возникает, когда числовое значение сравнивается с текстовым. Если значение элемента управления SpinButton не соответствует содержимому элемента управления TextBox, то на экране отображается специальное сообщение. Причем объект TextBox активен, а его содержимое — выделено (с помощью свойств SelStart и SelLength). Таким образом, пользователю проще исправить неправильные значения.
О свойстве Tag. Каждый объект UserForm и каждый элемент управления имеет свойство Tag. Оно не представляет конечные данные и по умолчанию не имеет значения. Свойство Tag можно использовать для хранения информации, которая будет применена в программе. Например, можно создать набор элементов управления TextBox в пользовательском диалоговом окне. От пользователя требуется ввести текст только в некоторые из них. В отдельные поля вводить текст необязательно. Можно применять свойство Tag для идентификации полей, которые нужно заполнять. В таком случае значение свойства Tag — это строка, например, Required. Поэтому при написании кода обработки введенных пользователем данных можно ссылаться на свойство Tag.
Приведенный ниже пример представляет собой функцию, которая проверяет все элементы управления TextBox объекта UserForm1 и возвращает количество пустых текстовых полей, которые требуют ввода информации.
Function EmptyCount() Dim ctl As Control EmptyCount= 0 For Each ctl In UserFormi.Controls If TypeName(ctl) = «TextBox» Then If ctl.Tag = «Required» Then If ctl.Text = «» Then EmptyCount = EmptyCount + 1 End If End If End If Next ctl End Function |
Ссылка на элементы управления пользовательского диалогового окна
При работе с элементами управления, находящимися в форме UserForm, код VBA обычно содержится в модуле кода объекта UserForm. Кроме того, на элементы управления диалогового окна можно ссылаться из модуля кода VBA общего назначения. Для выполнения этой задачи необходимо задать правильную ссылку на элемент управления, указав имя объекта UserForm. В качестве примера рассмотрим процедуру, которая введена в модуле кода VBA. Эта процедура отображает пользовательское диалоговое окно, которое называется UserForm1.
Sub GetData () UserForm1.Show End Sub |
Предположим, что в диалоговом окне UserForm1 содержится текстовое поле TextBox1 и вам необходимо указать значение текстового поля по умолчанию:
Sub GetData() UserForm1.TextBox1.Value = «Джон Доу» UserForm1.Show End Sub |
Еще одним способом установки значения по умолчанию является использование события Initialize объекта UserForm. Можно написать код процедуры UserForm_Initialize, который будет располагаться в модуле кода диалогового окна:
Private Sub UserForm_Initialize() TextBox1.Value = «Джон Доу» End Sub |
Обратите внимание, что при обращении к элементу управления из модуля кода диалогового окна необязательно вводить в ссылку имя объекта UserForm. Подобное определение ссылок на элементы управления имеет свое преимущество: всегда можно воспользоваться средством Auto List Member, которое позволяет выбирать имена элементов управления из раскрывающегося списка.
Вместо того чтобы использовать фактическое имя объекта UserForm, предпочтительнее применить имя Me. В противном случае, если имя объекта UserForm изменится, вам придется изменять все ссылки (с его участием) в коде.
Использование коллекций элементов управления. Элементы управления пользовательских диалоговых окон образуют отдельную коллекцию. Например, следующий оператор отображает количество элементов управления в форме UserForm1:
MsgBox UserForm1.Controls.Count
В VBA не поддерживаются коллекции для каждого типа элемента управления. Например, не существует коллекции элементов управления CommandButton. Но тип элемента управления можно определить с помощью функции TypeName. Следующая процедура использует структуру For Each для циклического просмотра элементов коллекции Controls. В результате отображается количество элементов управления CommandButton, которые входят в коллекцию элементов управления объекта UserForm1 (этот код вы найдете в файле all userform controls.xlsm).
Sub CountButtons() Dim cbCount As Integer Dim ctl As Control cbCount = 0 For Each ctl In UserForm1.Controls If TypeName(ctl) = «CommandButton» Then _ cbCount = cbCount + 1 Next ctl MsgBox cbCount End Sub |
Настройка панели инструментов Toolbox
Если объект UserForm активен в редакторе VBE, на панели Toolbox отображаются элементы управления, которые можно добавить в пользовательское диалоговое окно. Панель Toolbox изначально содержит одну вкладку. Щелкните на ней правой кнопкой мыши и в контекстном меню выберите параметр New Page (Добавить страницу). Кроме того, можно изменить текст, который отображается на вкладке. Для этого выберите параметр Rename (Переименовать) из контекстного меню.
Рекомендуется предварительно настроить элементы управления и сохранить их для дальнейшего использования. Можно, например, в форме создать элемент управления CommandButton, который настроен на выполнение роли кнопки ОК. Можно изменять параметры кнопки: Width (Ширина), Height (Высота), Caption (Подпись), Default (По умолчанию) и Name (Имя). После этого перетащите модифицированный элемент управления CommandButton на панель инструментов Toolbox. Это приведет к созданию элемента управления. Щелкните на элементе управления правой кнопкой мыши, чтобы переименовать его или изменить значок.
Также можно создать раздел панели Toolbox, в котором будет содержаться несколько элементов управления. Например, вы вправе создать два элемента управления CommandButton, которые будут представлять кнопки ОК и Отмена. Настройте их так, как это необходимо. Затем выберите обе кнопки и переместите их на панель инструментов Toolbox. Впоследствии можно использовать новый элемент управления панели Toolbox для быстрого создания необходимых кнопок.
Этот метод также применим к элементам управления, которые используются в качестве контейнера. Например, создайте элемент управления Frame и добавьте в него четыре модифицированных элемента управления OptionButton (соответствующим образом расположив их на форме). После этого перетащите элемент управления Frame на панель инструментов Toolbox, чтобы создать модифицированный элемент управления Frame.
Можно разместить модифицированные элементы управления на отдельной вкладке панели Toolbox. Таким образом, появляется возможность экспортировать вкладку панели Toolbox для совместного применения другими пользователями Excel. Для экспорта вкладки панели Toolbox щелкните на ней правой кнопкой мыши и выберите пункт меню Export Page.
Среди прилагаемых к заметке файлов находится страничный файл под именем newcontrols.pag, который включает некоторые настроенные элементы управления. Можно импортировать этот файл в качестве новой вкладки окна Toolbox. Щелкните правой кнопкой мыши на вкладке и выберите команду Import Page. В результате панель Toolbox будет как на рис. 14.
Рис. 14. В окне Toolbox появилась страница с новыми элементами управления
Добавление элементов управления ActiveX
В пользовательском диалоговом окне содержатся и другие элементы управления ActiveX, разработанные компанией Microsoft и независимыми производителями. Для того чтобы добавить дополнительные элементы управления ActiveX на панель инструментов Toolbox, щелкните правой кнопкой мыши на ней и выберите пункт Additional Controls (Дополнительные элементы управления). В результате будет отображено диалоговое окно, показанное на рис. 15.
Рис. 15. В диалоговом окне Additional Controls можно найти дополнительные элементы управления ActiveX
В диалоговом окне Additional Controls содержатся все элементы управления ActiveX, установленные в системе. Выберите элементы управления, которые необходимо добавить на панель инструментов. После этого щелкните на кнопке ОК для добавления значков каждого из выбранных элементов управления. Не все элементы управления ActiveX, установленные в системе, поддерживаются пользовательскими диалоговыми окнами. Более того, большая их часть не поддерживается, к тому же некоторые элементы управления требуют лицензии на использование в приложениях. Если лицензия отсутствует, на экране появится сообщение об ошибке.
Создание шаблонов диалоговых окон
Зачастую при создании пользовательского диалогового окна каждый раз на форму добавляются одни и те же элементы управления. Например, все пользовательские диалоговые окна имеют два элемента управления CommandButton, используемых в качестве кнопок ОК и Отмена. В предыдущем разделе рассматривались методы комбинирования элементов управления с целью получения одного элемента управления, обладающего функциями двух. Еще одной программной уловкой может служить шаблон диалогового окна, который при необходимости импортируется для последующего создания на его основе других проектов. Преимущество шаблонного подхода заключается в следующем: процедуры обработки событий сохраняются вместе с шаблоном.
Начните с создания пользовательского диалогового окна, содержащего все элементы управления и настройки, которые необходимо повторно использовать в других проектах. После этого убедитесь, что диалоговое окно выделено. Выберите команду File –> Export File (или нажмите комбинацию клавиш <Ctrl+E>). После этого на экране появится запрос на ввод имени файла. Затем для создания проекта на основе шаблона выполните команду File –> lmport File, чтобы загрузить ранее сохраненное диалоговое окно.
Имитация диалоговых окон Excel. Внешний вид и поведение диалоговых окон Windows изменяются от программы к программе. При разработке приложений для Excel рекомендуется придерживаться стиля диалоговых окон Excel. Наилучшим методом изучения эффективных способов создания диалоговых окон является повторное создание одного из стандартных диалоговых окон Excel. Например, удостоверьтесь, что вы правильно определили комбинации клавиш и активизировали элементы управления. Для создания копии одного диалогового окна Excel следует протестировать его в различных условиях. Один только анализ диалоговых окон Excel поможет улучшить познания в вопросах структуры окон и методов создания элементов управления. Со временем вы убедитесь, что невозможно повторить отдельные диалоговые окна Excel даже с помощью VBA.
[1] По материалам книги Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA. – М: Диалектика, 2013. – С. 405–438.
Практическая работа2 Тема: Разработка программ с использованием математических процедур и функций (линейные программы)
Цель: приобрести навыки программирования с использованием встроенных функций ввода/вывода языка Visual Basic for Application. Осуществить вывод полученных результатов, используя элемент управления текстовое поле (TextBox)
Задание. Найти значение функции: y=sin5x+cos3x при любом заданном х.
Содержание занятия:
-
Откройте приложение MS Word.
-
Выполните команду Разработчик — Visual Basic или нажмите Alt+F11.
-
Добавьте форму (команда Insert UserForm)
-
Для изменения размеров формы используйте указатель мыши помещённый в правый нижний угол окна Формы(UserForm)
-
Разработайте пользовательский интерфейс, расположив на форме с помощью панели инструментов управления (Toolbox), следующие объекты управления: Label (Метка), TextBox (Текстовое поле), CommandButton (Командная кнопка).
-
В окне Properties (Свойства) для каждого объекта управления установить свойства, приведённые в таблице 1.
Таблица 1.
Элемент управления |
Свойства |
Значения |
UserForm |
Caption |
Задание 2 |
Label1 |
Caption |
Вычисление значения функции y=sin5x+cos3x |
Label2 |
Caption |
X= |
Label3 |
Caption |
Y= |
TextBox1 |
Name |
TextBox1 |
TextBox2 |
Name |
TextBox2 |
CommadButton1 |
Name |
cmdRun |
Caption |
Вычислить |
|
CommadButton2 |
Name |
cmdClear |
Caption |
Очистка |
-
Для перехода в окно программирования нажмите правую кнопку мыши на объекте CommandButton и в появившимся контекстом меню выбрать команду View Code или двойной щелчок мыши.
-
Между строками «Private Sub cmdRun_Click()» и «End Sub» введите следующий код программы:
Private Sub cmdRun_Click()
Dim X As Single
Dim Y As Single
X = Val(TextBox1.Text)
Y = sin(5*x)+cos(3*x)
TextBox2=Y
End Sub
-
Примерный интерфейс программы и контрольные значения:
-
Для очистки текстовых полей формы между строками «Private Sub cmdClear_Click()» и «End Sub» введите следующий код программы:
TextBox1 = «»
TextBox2 = «»
Напишите программу, которая бы вычисляла значение функции z=2x+3,5y2
Создайте в сетевой папке вашей группы свою папку под вашей фамилией и сохраните файл под именем «Функция2»
Продолжаем серию заметок по теме автоматизации документов.
Сегодня я расскажу, как добавить к вашим документам специальную форму, с помощью которой можно легко и просто вводить данные в документ. Введенные в форму данные адресата по нажатию кнопки на форме будут автоматически внесены в документ.
Предполагается, что у вас есть готовый шаблон документа, например, письма. В качестве образца можно использовать подготовленный мною шаблон официального письма вымышленной организации.
Использование шаблона необходимо, ведь на его основе вы в дальнейшем будете создавать свои документы.
Распакуйте файл из архива и поместите его в папку с шаблонами редактора Word. Как правило, эта папка находится по адресу: C:Documents and SettingsИМЯ_ПОЛЬЗОВАТЕЛЯApplication DataMicrosoftШаблоны.
Итак, шаблон документа у нас есть, открыт и готов к изменению. В первую очередь нам необходимо добавить закладки в те позиции в документе, куда вы собираетесь вставлять данные из формы. Как правило, письмо должно содержать фамилию, имя и отчество адресата, наименование организации адресата, полный почтовый адрес и приветствие.
Исходя из этого мы добавим в документ следующие закладки:
- name
- company
- address
- date
- salutation
Обратите внимание, реквизитов адресата, которые должно содержать письмо, на самом деле может быть много, а закладок мы определили всего пять. Это логично, так как в дальнейшем мы будем подставлять несколько реквизитов к одной закладке (например, адрес, который будет состоять из индекса, названия города, области, улицы).
После добавления закладок (и если у вас включен режим отображения меток закладок), наш документ будет выглядеть примерно как на рисунке ниже (щелкните по картинке для ее увеличения):
Эти метки закладок после нажатия кнопки «Внести данные» будут заменены на конкретные тексты.
Не забывайте сохранять сделанные вами изменения в шаблоне на всякий «пожарный» случай.
На втором шаге мы создадим специальную форму с текстовыми полями, которая будет открываться при создании каждого нового документа на основе вашего шаблона письма. Кратко расскажу, как добавить в шаблон форму.
- Откройте редактор Visual Basic с помощью сочетания клавиш «Alt»+«F11». Убедитесь, что в окне проектов выделен ваш шаблон:
- В меню Insert выберите команду UserForm. В окне проектов будет создан новый объект Forms с пустой формой или просто добавлен в проект модуль userForm.
- Разместите на форме необходимые элементы. Например, как на рисунке ниже:
Текстовые поля (со стандартными именами TextBox1) были мною переименованы с учетом их назначения. Обратите внимание в нижеприведенном коде, как они теперь называются.
Третий шаг — написание кода для элементов нашей формы.
- В меню Insert выберите команду Module. В окне проектов будет создан новый модуль Module1. Дважды щелкните по модулю и перейдите в окно редактирования кода. Вставьте следующий код:
- Перейдите на модуль UserForm1. Переименуйте его в MyForm.
- Нажмите клавишу «F7» и в окне редактора кода вставьте следующий код (содержит процедуры для действий с элементами формы):
- Ниже этого кода вставьте следующий код:
- Сохраните проект и попробуйте создать на основе вашего шаблона новый документ. Введите необходимые данные в поля формы и нажмите кнопку «Внести данные».
Sub AutoNew() Dim oF As MyForm Set oF = New MyForm oF.Show Set oF = Nothing End Sub
Этот код запускает форму каждый раз при создании нового документа на основе вашего шаблона.
Private Sub CommandButton1_Click() 'Действия формы по нажатию кнопки "Ввести данные" Dim bm As Bookmarks Dim rng As Word.Range Dim addr As String Dim sText As String Dim sResult1 As String Dim sResult2 As String Dim arName() As String Set bm = ActiveDocument.Bookmarks sText = Me.tbName.Text 'присваиваем переменной текст из текстового поля "Имя адресата" arName = Split(sText) 'создаем массив из отдельных слов, вместе составляющих ФИО адресата 'Действия с полем "Дата" With Me.tbDate If Not IsDate(.Text) Then 'если данные введены не в формате даты, то MsgBox "В поле ""Дата"" неверно введены данные." 'выводим сообщение .Text = Format(Now, "dd MMMM yyyy") 'автоматически заполняем поле текущей датой .SetFocus 'фокус на поле "Дата" .SelStart = 0 ' .SelLength = Len(.Text) 'выделяем весь текст в поле, начиная с левого края Exit Sub Else Set rng = bm("date").Range 'присваиваем переменной rng ссылку на закладку "date" rng.Text = .Text & " г." 'определяем новый текст закладки bm.Add "date", rng 'заменяем закладку End If End With Set rng = bm("name").Range 'присваиваем переменной rng ссылку на закладку "name" sResult1 = arName(0) & " " 'присваиваем переменной значение первого слова из поля "Имя адресата" и добавляем пробел sResult1 = sResult1 & Left(arName(1), 1) & ". " 'добавляем к первому слову первую букву Имени и точку sResult1 = sResult1 & Left(arName(2), 1) & "." 'добавляем первую букву Отчества и точку rng.Text = sResult1 'определяем новый текст закладки bm.Add "name", rng 'заменяем закладку Set rng = bm("company").Range 'присваиваем переменной rng ссылку на закладку "company" rng.Text = Me.tbCompany 'определяем новый текст закладки bm.Add "company", rng 'заменяем закладку If Len(sText) > 0 Then 'если в поле "Имя адресата" есть какие-то символы, то sText = sResult1 & vbCr 'присваиваем переменной текст закладки "name" и переводим строку End If If Len(Me.tbCompany.Text) > 0 Then 'если в поле "Организация" есть какие-то символы, то Me.tbCompany.Text = Me.tbCompany.Text & vbCr 'присваиваем переменной текст из поля и переводим строку End If If Len(Me.tbAddress.Text) > 0 Then 'если в поле "Адрес" есть какие-то символы, то Me.tbAddress.Text = Me.tbAddress.Text 'присваиваем переменной текст из поля End If If Len(Me.tbIndex.Text) > 0 Then 'если в поле "Индекс" есть какие-то символы, то Me.tbIndex.Text = Me.tbIndex.Text & "," 'присваиваем переменной текст из поля и добавляем запятую End If If Len(Me.tbCity.Text) > 0 Then 'если в поле "Город" есть какие-то символы, то Me.tbCity.Text = Me.tbCity.Text & "," 'присваиваем переменной текст из поля и добавляем запятую End If If Len(Me.tbOblast.Text) > 0 Then 'если в поле "Область" есть какие-то символы, то Me.tbOblast.Text = Me.tbOblast.Text & "," 'присваиваем переменной текст из поля и добавляем запятую End If 'присваиваем переменной фрагментов текста из полей "Индекс", "Город", "Область" и "Адрес" addr = Me.tbIndex.Text & " " & Me.tbCity.Text & " " & Me.tbOblast.Text & " " & Me.tbAddress.Text Set rng = bm("address").Range 'присваиваем переменной rng ссылку на закладку "address" rng.Text = addr 'определяем новый текст закладки из переменной addr bm.Add "address", rng 'заменяем закладку Set rng = bm("salutation").Range 'присваиваем переменной rng ссылку на закладку "salutation" rng.Text = Me.tbSalutation.Text 'определяем новый текст закладки bm.Add "salutation", rng 'заменяем закладку Unload Me 'Закрываем форму ActiveDocument.Range.Fields.Update 'Обновляем все поля в документе End Sub
Private Sub CommandButton2_Click() 'Выход из формы и закрытие окна документа при нажатии кнопки "Отменить" On Error GoTo ErrLabel Unload Me 'Закрываем форму ActiveDocument.Close 'Закрываем текущий документ ErrLabel: End Sub Private Sub tbIndex_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Устанавливаем правила заполнения поля "Индекс" With Me.tbIndex If Not IsNumeric(.Text) Or Len(.Text) <> 6 Then 'если в поле "Индекс" данные не цифры и меньше 6, то MsgBox "Ошибка!" & " " & "Введите 6 цифр индекса города или района." 'выводим сообщение Cancel = True 'возвращаемся к полю .Text = "" 'очищаем поле .SetFocus End If End With End Sub Private Sub tbName_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'При выходе из поля "Имя адресата" его имя подставляется в поле "Приветствие" sText = Me.tbName.Text arName = Split(sText) sResult2 = arName(1) & " " sResult2 = sResult2 & arName(2) Me.tbSalutation = "Уважаемый " & sResult2 & "!" End Sub Private Sub UserForm_Initialize() Me.tbDate = Format(Now, "dd MMMM yyyy") With Me.tbName .Text = "Фамилия Имя Отчество" .SetFocus .SelStart = 0 .SelLength = Len(.Text) End With End Sub
Вы можете скачать уже готовый шаблон письма и подредактировать его под свои нужды.
В этом шаблоне есть небольшой недостаток: в текстовые поля нужно вводить информацию в правильном формате и регистре, иначе в итоговом письме придется вручную править недочеты.
Образцом для шапки шаблона послужила картинка из шаблона городского письма редактора Word 2007.
Образцом кода для данного макроса и формы послужила заметка Gregory Maxey Address a Letter Using as UserForm.
Страница в данный момент перерабатывается! Возможно море опечаток и несвязанность!
Введение
Чтобы дать указания макросу для выполнения действий со сложными условиями, необходимо создание экранных форм, так как обычных диалогов уже не хватает.
Точнее, придется выводить множество запросов, что явно не отвечает требованиям эргономики интерфейса.
Они ничем не отличаются от любых диалогов во всех программах, кроме возможности добавления управляющих элементов.
Но! Вспомните, сколько раз вам приходилось выискивать нужный пункт в диалоге или пытаться осознать, о чем вас спрашивают?
Учтите это при разработке собственных форм.
Правила создания диалогов крайне просты: всё запрошено, но сделано это кратко и понятными словами.
Использование форм достаточно сложно и вошло в основной курс изучения только в 2021 году.
Более подробно, чем изложено здесь, это будет обсуждаться только с профильными группами или в элективном курсе.
Создание формы
Форма должна быть сохранена в каком-либо проекте (project): шаблоне или документе.
Перейдем в окно VBE нажатием горячей клавиши Alt+F11.
Сразу ещё раз акцентирую ваше внимание на том, что редактор написан на английском языке, хотя используется русская версия Word!
Щелчком правой клавишей мыши в любом месте перечня объектов проекта (выберем текущий документ) в окне Project Explorer (в левом верхнем углу)
вызовем контекстное меню, через которое и происходит добавление формы.
Будет создана категория Forms, в которой разместится новая форма, получающая название по умолчанию UserForm1.
Появится инструментальная панель Toolbox, содержащая элементы управления для вставки в форму.
Сама форма активизируется, то есть появится рамка с точками выделения, за которые (белые) можно изменять размеры, что мы и сделаем для удобства вывода на сайт.
Впоследствии, к активации окна формы приведет щелчок мышью на свободном месте или заголовке.
Щелкнем на ней правой кнопкой мыши и выберем пункт контекстного меню Properties (Свойства), в результате чего откроется окно под списком проектов.
(Если оно не было открыто ранее.)
Всего свойств 34, но обсуждаться они пока будут только по необходимости.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Private Sub CommandButton1_Click() End Sub
Разберем подробно каждый элемент, так как именно на них основано всё программирование форм.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Теперь создадим аналогичную команду для кнопки Cancel, пойдя наиболее сложным путем, чтобы проиллюстрировать, как создаются программы для методов, не формируемые автоматически.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Сотрем лишние пустые программы, которые скорее всего создались во время ваших экспериментов и отредактируем нужную нам.
Чтобы понять, как, необходимо определить, какой из двух возможных способов обработки формы вы будете использовать.
Способ 1. Все необходимые действия производятся в процедурах нажатия кнопок, после чего форма скрывается (Hide) или уничтожается (Unload).
Вариант является очевидным и стандартным, но не всегда приемлемым.
Способ 2. Форма скрывается (Hide), после чего происходит обработка из вызвавшей форму программы.
Вариант требует дополнительных усилий, но именно он понадобится для подавляющего большинства случаев.
Разберем их реализацию по порядку.
Выполнения действий из формы
Наверно, этот вопрос является ключевым для написания начальных программ с задействованием формы.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Во-вторых, вместо MsgBox нужно ввести код, нужный для данного случая.
В-третьих, If…Else хватило только потому, что выбираем один вариант из двух. Иначе потребуется более сложная конструкция.
Выполнения действий в вызвавшей процедуре
Такой способ будет наиболее эффективен, если форму придется открывать много раз.
Первый вопрос, который возникает, касается того, какая же кнопка была нажата для закрытия формы: подтверждение или отказ.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
В данном случае использован объектный метод
ИмяФормы.Hide
Заметьте, команда скрывает форму, а не удаляет ее.
В результате можно программно обратиться к отдельным элементам и изучить, что они содержат.
То есть проанализировать выбор и/или ввод пользователя.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Все приведенные комментарии для предыдущего способа, действительны и здесь.
Побочный эффект будет заключаться в том, что все изменения, произведенные в форме, сохранятся при ее повторном показе.
С этим придется либо бороться, либо, наоборот, удастся воспользоваться.
Для более сложных диалогов можно создавать кнопки, изменяющие настройки других элементов.
В качестве классического примера можно привести кнопку, восстанавливающую значения по умолчанию.
Примеры форм
Диалог обратной связи интеллектуальной системы выделения авторов в списке литературы.
Производит анализ текста и расширение/уменьшение выделения справа и слева в зависимости от нажатой кнопки диалога.
Примитивное информирование пользователя о шаблоне, построенное на базе MsgBox, где сообщение принудительно разбито на строки.
Работа со списком научных журналов (3792 штуки). Доступно добавление, удаление, редактирование.
Накапливается информация о вариантах написания и правильном сокращенном написании, включая его версии в разные периоды.
Элемент системы проверки списков литературы, позволяющий выявлять некоторые часто встречающиеся проблемы библиографических списков
с безошибочной эффективностью на 5–10 порядков выше, чем у профессионального редактора.
Объекты управления и методы
Ниже приведены основные объекты, связанные с формами, и перечислены их методы (не свойства!).
Найти даже эту информацию достаточно сложно. Так что, не обессудьте, обсуждаться они пока не будут.
Восклицательным знаком обозначены методы, создаваемые автоматически при двойном щелчке на элементе управления.
Методы UserForm
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Методы Label
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Методы SpinButton
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Методы CommandButton
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Методы TextBox
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Проверка введенных данных
Для начала хочется отметить, что многие программисты либо совсем игнорируют подобное действие, либо доводят его до абсурда, вводя пользователей в бешенство.
Учтите эти две крайности и постарайтесь их избежать. Лучшим помощником в этом будет многократное испытание на собственной шкуре.
Это действие разумнее всего производить в самой форме, не загромождая программу.
Прежде чем погружаться в реализацию, надо разобраться, какие варианты проверки и/или ограничений можно использовать.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
Для того, чтобы помочь пользователю, можно заранее запрограммировать наиболее часто используемые варианты, оставив и для него возможность ввести нечто отличное.
Для этих целей можно использовать комбинированный список или радиокнопки, дополненные полем ввода.
Обращение к форме из программы
Это уже обсуждено в примерах, но, все же, уточним еще раз.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
В пределах модуля программного кода самой формы, такой префикс не требуется.
Удаление формы из памяти
Производится командой (инструкцией):
Unload Test1
После выгрузки объекта, он полностью удаляется из памяти, освобождая ее.
Но обращение к нему также становится невозможным.
Элементы управления формы
Обсудим все элементы, которые вынесены на панель Toolbox и могут быть использованы в форме на примере Office 2019.
(Часть задействованных выше скриншотов относились к Word 2003, работа элементов которого комментироваться не будет, хотя отличия и есть.)
Как вы можете увидеть, по умолчанию активирован инструмент выделения (Select Objects, стрелка ).
Для получения названия элемента нужно навести на него курсор мыши.
Если панель была отключена, то за её вывод отвечает пункт меню View⇒Toolbox.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Технология ввода элементов
Сразу отмечу, что технология использования инструментов из Toolbox довольно нестандартна и несколько раз изменялась в ходе развития.
К счастью, во многом в лучшую сторону.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
Общие замечания, свойства и настройки
N.B.! Общие свойства описаны здесь, а частные — в соответствующих элементах.
Предпринята попытка не повторять одно и то же 10 раз, а приводить при первом упоминании.
При необходимости можно воспользоваться поиском по имени на данной странице.
Говоря о подготовке форм, неизбежно приходится обсуждать множество противоречий, крайне затрудняющих принятие конкретных решений.
Дизайн, эстетика, функциональность, привычки, логика, самодурство наконец…
Попробуем здесь разобрать основные свойства, понятия, смыслы.
Окончательные решения принимать вам, но лучше, если они будут опираться на некоторую базовую позицию.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Label (надпись)
Относится к стандартно пассивным элементам, единственное назначение которых — вывод пояснений пользователю перед активным элементом.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
TextBox (поле ввода текста)
Элемент, необходимый для ручного ввода значения пользователем.
В упрощенном понимании, заменяет InputBox.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
ComboBox
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
CommandButton
Командная кнопка () — самый стандартный активный элемент, нажатие которого в норме производит запуск программы.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
TabStrip
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
MultiPage
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
ScrollBar
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
SpinButton
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
Image (картинка)
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
Порядок обхода элементов формы (Tab Order)
Создание формы однозначно относится к творческому виду работ.
Отсюда вытекает определенный неизбежный «хаос» в процессе вставки и размещения управляющих элементов.
Оставление их в таком виде, как есть, безусловно следует считать недопустимой неряшливостью.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
Возможные ошибки при задействовании форм
Многие из них некритичны или даже нужны, но как результат осознанного выбора.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Вывод: нужно всё время думать о соблюдении баланса и принимать обоснованные и спланированные решения.
Интерфейс относится к наиболее ответственным элементам программы, определяющим отношение к ней.
….
См. также Диалоги.
Довольно часто при создании макросов может понадобиться придать им некой “динамичности”. Как и рядовые приложения, редактор VBA предоставляет объект UserForm, который отвечает за создание формы.
По своей природе, объект vba UserForm представляет из себя пустое диалоговое окно, на поверхность которого можно добавить различные элементы управления (кнопки, списки и так далее). В отличии от тех объектов, с которыми мы работали в сценариях сервера Windows Script Host, объекты VBA помимо свойств и методом, обладают еще и событиями, кроме этого, объекты класса UserForm vba содержат в себе модуль класса, который может хранить собственные методы и свойства, или код для обработки событий.
Что бы добавить новую форму к vba проекту, воспользуйтесь меню Insert, пункт UserForm. Обратите внимание: в окне Проектов есть папка Forms, в которой хранятся все формы, добавленные в проект, имя для формы назначается автоматически, например, UserForm1, UserForm2,…,UserFormN. Если вы случайно закроете окно формы, то его можно вновь запустить, выбрав нужную форму в окне Проектов. Можете также прочитать предыдущую стать «Знакомство с редактором VBA»
Содержание
- Некоторые свойства класса UserForm vba языка
- Некоторые методы класса UserForm vba языка
- Некоторые события класса UserForm vba языка
Некоторые свойства класса UserForm vba языка
Name – данное свойство содержит имя формы, или, точнее сказать, имя объекта. Нужно понимать, что данное значение доступно только в теле программы и никак не влияет на конечный результат.
BackColor – содержит цвет фона.
BorderColor – цвет рамки
BorderStyle – стиль рамки, принимает только два возможных значения.
Caption – свойство определяет заголовок формы, фактически, это то т же заголовок окна программы. По умолчанию, данное свойство содержит то же значение, что и свойство Name.
Enabled – принимает логическое True или False, и определяет, доступна ли форма. Если значение свойства ровно False, то ни один из элементов управления не доступен.
ShowModal – как и предыдущее свойство, ShowModal может принимать логические значения. True – по умолчанию, “модальный” режим, пока не будет закрыта текущая форма, другая форма или возврат в документ будут недоступны.
Font – определяет шрифт.
ForeColor – определяет цвет переднего плана формы, например, цвет текста.
Некоторые методы класса UserForm vba языка
Hide – данный метод убирает из видимости форму, делая ее скрытой. Все ее параметры и элементы управления остаются неизменными.
Repaint – позволяет перерисовать отображаемую форму.
Show – метод противоположен методу Hide, он делает форму видимой, если она еще не загружена в память, то происходит ее загрузка.
И так, что бы не томить душу, давайте создадим простую форму, назовем ее “Первая программа” (свойство Caption), у меня имя формы UserForm1. Хорошо, теперь нам нужно написать макрос, при запуске которого будет выводиться форма. Для этого добавляем в проект новый модуль и в окне кода пишем следующее:
Sub Module1() UserForm1.Show End Sub
Тут Module1 – имя процедуры, оно совпадает с именем модуля, оно хранится в свойстве Name. Sub … End Sub – это блок процедуры. UserForm1.Show – тут мы вызываем метод Show объекта UserForm1 для отображения формы, помните, UserForm1 – имя моей формы, его тоже можно изменить.
Все, теперь если запустить текущий макрос, то пользователю просто выведется пустая форма. Можете поэкспериментировать с ее свойствами.
Некоторые события класса UserForm vba языка
Если новичок и может справиться со свойствами и методами, то события ему могут показаться чем-то из области пятого пространства. Давайте рассмотрим основные события формы, а потом напишем небольшой пример:
Activate – событие возникает каждый раз, когда окно формы становится активным.
Click – происходит клик мышью по поверхности, не занятой элементами управления.
DblClick – аналог предыдущему событию, только тут происходит двойной клик по форме.
Deactivate – событие возникает каждый раз, как окно формы переходит в неактивное состояние.
Initialize – возникает как только происходит загрузка формы в память с помощью метода Show или оператора Load.
Resize – происходит изменение размеров формы
Terminate – событие происходит каждый раз, как только форма выгружается из памяти.
Помним, что для вызова метода или события, сперва идет имя объекта, а потом, после точки, имя метода или свойства. С событиями все по-другому: нам нужно создать процедуру и присвоить ей имя в стиле “Объект_Событие”, то есть, сначала мы пишем имя объекта (например, UserForm1), потом идет символ подчеркивания и имя события.
Ладно, откройте редактор формы и дважды щелкнете по полю формы, вас сразу перенаправит в редактор кода, где содержатся следующие строки:
PrivateSub UserForm_Click() End Sub
Видим, что данная процедура рассчитана для события Click, давайте в ней пропишем:
MsgBox "Вы кликнули по форме!!!"
Если теперь запустить макрос на выполнение, то появится форма, и при клике по ее поверхности, будет выдано сообщение » Вы кликнули по форме «.
Обратите внимание, что у вас в проекте есть форма и два редактора кода, один содержит строки:
Sub Module1() UserForm1.Show End Sub
Это фактически и есть наш макрос, он отображается в окне проекта. Что бы получить доступ к редактору кода для самой формы, выберите в редакторе vba, в окне Проекта нужную форму и нажмите на крайнюю левую кнопку вверху (View Code), или просто выберите аналогичный пункт в меню View. Также, обратите внимание, что теперь вы можете выбрать нужное событие в окне кода для данной формы, список находится вверху справа.
Ладно, на этом пока все, тут мы рассмотрели класс языка vba UserForm, впереди нас ждет еще много материала, поэтому, я не хочу сразу впихивать все подробности в одну статью.