_Форма бронирования курса — это простая форма, иллюстрирующая принципы дизайна UserForm и связанного с ним кодирования VBA. _

_Он использует набор элементов управления, включая текстовые поля, поля со списком, переключатели, сгруппированные в рамке, флажки и кнопки управления. _

_Когда пользователь нажимает кнопку ОК, его ввод вводится в следующую доступную строку на листе. _

Описание формы Excel:

Есть два простых текстовых поля (Name: _ и _Phone: _), в которые пользователь может вводить произвольный текст, и два поля со списком (_Department и Course)

которые позволяют пользователю выбрать элемент из списка.

Есть три кнопки выбора (Introduction, Intermediate и Advanced), сгруппированные в рамке (Level), так что пользователь может выбрать только один из вариантов.

Есть два флажка (Lunch Required и Vegetarian), которые, поскольку они не сгруппированы во фрейме, могут быть выбраны при необходимости.

Однако, если человек, делающий заказ, не хочет обед, нам не нужно знать, вегетарианец он или нет. Таким образом, флажок Vegetarian неактивен, пока он не потребуется.

Есть три командные кнопки (OK, Cancel и Clear Form), каждая из которых выполняет предопределенную функцию при нажатии.

Настройки свойств элемента управления:

Control

Type

Property

Setting

UserForm

UserForm

Name

frmCourseBooking

Caption

Course Booking Form

Name

Text Box

Name

txtName

Phone

Text Box

Name

txtPhone

Department

Combo Box

Name

cboDepartment

Course

Combo Box

Name

cboCourse

Level

Frame

Name

fraLevel

Caption

Level

Introduction

Option Button

Name

optIntroduction

Intermediate

Option Button

Name

optIntermediate

Advanced

Option Button

Name

optAdvanced

Lunch Required

Check Box

Name

chkLunch

Vegetarian

Check Box

Name

chkVegetarian

Enabled

False

OK

Command Button

Name

cmdOk

Caption

OK

Default

True

Cancel

Command Button

Name

cmdCancel

Caption

Cancel

Cancel

True

Clear Form

Command Button

Name

cmdClearForm

=== Создание форм в Excel. Если вы хотите создать форму самостоятельно, просто скопируйте макет, показанный на иллюстрации выше. Выполните следующие действия:

  1. Откройте книгу, к которой должна принадлежать форма (пользовательские формы, такие как макросы, должны быть прикреплены к книге), и переключитесь в редактор Visual Basic.

  2. В редакторе Visual Basic нажмите кнопку «Вставить пользовательскую форму» (или выберите «Вставить»> «Пользовательская форма»).

  3. Если панель инструментов не появляется сама по себе (сначала щелкните форму, чтобы убедиться, что она не скрывается), нажмите кнопку «Панель инструментов» (или перейдите в меню «Просмотр»> «Панель инструментов»).

  4. Чтобы разместить элемент управления в форме, нажмите соответствующую кнопку на панели инструментов, затем щелкните форму. Элементы управления можно перемещать, перетаскивая их за края, или изменять размер, перетаскивая кнопки по их периметру.

  5. Чтобы изменить свойства элемента управления, убедитесь, что выбранный элемент управления выбран, а затем внесите соответствующие изменения в окне «Свойства». Если вы не видите окно свойств, выберите «Просмотр»> «Окно свойств».

  6. Чтобы удалить элемент управления из формы, выберите его и нажмите клавишу «Удалить» на клавиатуре.

Пользовательская форма фактически ничего не будет делать, пока не будет создан код, управляющий формой и ее различными элементами управления. Следующим шагом будет написание кода, который управляет самой формой.

Добавление кода: 1 Инициализация формы === == Инициализация формы:

Большинство форм требуют настройки при открытии. Это может быть установка значений по умолчанию, проверка того, что поле пусто, или построение списков полей со списком. Этот процесс называется Initialising the Form, и о нем заботится макрос UserForm_Initialize (если вас смущает мое разное написание слова «initialis (z) e», это потому, что я говорю по-английски, а VBA — по-американски, но не волнуйтесь, VBA сделает это за вас!). Вот как создать код для инициализации формы бронирования курса:

  1. Чтобы просмотреть окно кода формы, выберите «Просмотр»> «Код» или нажмите F7.

  2. Когда окно кода открывается впервые, оно содержит пустую процедуру UserForm_Click (). Используйте раскрывающиеся списки в верхней части окна кода, чтобы выбрать UserForm и Initialize. Это создаст необходимую вам процедуру. Теперь вы можете удалить процедуру UserForm_Click ().

  3. Введите в процедуру следующий код:

Private Sub UserForm_Initialize()

txtName.Value = ""

txtPhone.Value = ""

With cboDepartment

.AddItem "Sales"

.AddItem "Marketing"

.AddItem "Administration"

.AddItem "Design"

.AddItem "Advertising"

.AddItem "Dispatch"

.AddItem "Transportation"

End With

cboDepartment.Value = ""

With cboCourse

.AddItem "Access"

.AddItem "Excel"

.AddItem "PowerPoint"

.AddItem "Word"

.AddItem "FrontPage"

End With

cboCourse.Value = ""

optIntroduction = True

chkLunch = False

chkVegetarian = False

txtName.SetFocus

End Sub

Как работает код инициализации:

Цель процедуры UserForm_Initialize () — подготовить пользовательскую форму в VBA к использованию, установить значения по умолчанию для различных элементов управления и создать списки, которые будут отображаться в полях со списком.

Эти строки устанавливают пустое содержимое двух текстовых полей:

txtName.Value = ""

txtPhone.Value = ""

Далее следуют инструкции для полей со списком. Сначала указывается содержимое списка, затем начальное значение поля со списком устанавливается пустым.

With cboDepartment

.AddItem "Sales"

.AddItem "Marketing"

(as many as necessary…)

End With

cboDepartment.Value = «»

При необходимости первоначальный выбор может быть сделан из группы опций, в этом случае:

optIntroduction = True Для обоих флажков установлено значение False (т.е. нет галочки). Установите значение True, если вы хотите, чтобы флажок был уже отмечен:

chkLunch = False chkVegetarian = False Наконец, фокус перемещается на первое текстовое поле. Это помещает курсор пользователя в текстовое поле, так что им не нужно щелкать поле, прежде чем они начнут печатать:

txtName.SetFocus === Добавление кода: 2 Заставляем кнопки работать На форме есть три командные кнопки, каждая из которых должна работать с помощью своей собственной процедуры. Начиная с простых…

Кодирование кнопки отмены:

Ранее мы использовали окно «Свойства», чтобы установить для свойства «Отмена» кнопки «Отмена» значение True. Когда вы устанавливаете для свойства Cancel командной кнопки значение True, это дает эффект «нажатия» этой кнопки, когда пользователь нажимает клавишу Esc на своей клавиатуре. Но само по себе это ничего не вызовет с формой. Вам необходимо создать код для события нажатия кнопки, которая в этом случае закроет форму. Вот как:

  1. Открыв UserForm для редактирования в редакторе Visual Basic, дважды щелкните кнопку «Отмена». Окно кода формы открывается с процедурой cmdCancel_Click (), готовой к редактированию.

  2. Код для закрытия формы очень простой. Добавьте в процедуру строку кода, чтобы она выглядела так:

Private Sub cmdCancel_Click()

Unload Me

End Sub

Кодирование кнопки очистки формы:

Я добавил кнопку, чтобы очистить форму на случай, если пользователь захочет передумать и все сбросить, а также чтобы упростить задачу, если у него было несколько бронирований одновременно. Все, что ему нужно сделать, это снова запустить процедуру инициализации. Макросу можно приказать запустить другой макрос (или, если необходимо, серию макросов), используя ключевое слово Call:

  1. Дважды щелкните кнопку «Очистить форму». Окно кода формы открывается с процедурой cmdClearForm_Click (), готовой к редактированию.

  2. Добавьте в процедуру строку кода так, чтобы она выглядела так:

Private Sub cmdClearForm_Click()

Call UserForm_Initialize

End Sub

Кодирование кнопки ОК:

Это фрагмент кода, который должен выполнять работу по переносу выбора пользователя и ввода текста на рабочий лист. Когда мы устанавливаем для свойства Cancel кнопки Cancel значение True, мы также устанавливаем для свойства Default кнопки OK значение True. Это касается нажатия кнопки ОК, когда пользователь нажимает клавишу Enter (или Return) на своей клавиатуре (при условии, что они не использовали свою клавишу Tab для перехода к другой кнопке).

Вот код, заставляющий кнопку работать:

  1. Дважды щелкните кнопку ОК. Окно кода формы открывается с процедурой cmdOK_Click (), готовой к редактированию.

  2. Отредактируйте процедуру, добавив следующий код:

Private Sub cmdOK_Click()

ActiveWorkbook.Sheets("Course Bookings").Activate

Range("A1").Select

Do

If IsEmpty(ActiveCell) = FalseThen

ActiveCell.Offset(1, 0).Select

End If

Loop Until IsEmpty(ActiveCell) = True

ActiveCell.Value = txtName.Value

ActiveCell.Offset(0, 1) = txtPhone.Value

ActiveCell.Offset(0, 2) = cboDepartment.Value

ActiveCell.Offset(0, 3) = cboCourse.Value

If optIntroduction = True Then

ActiveCell.Offset(0, 4).Value = "Intro"

ElseIf optIntermediate = True Then

ActiveCell.Offset(0, 4).Value = "Intermed"

Else

ActiveCell.Offset(0, 4).Value = "Adv"

End If

If chkLunch = True Then

ActiveCell.Offset(0, 5).Value = "Yes"

Else

ActiveCell.Offset(0, 5).Value = "No"

End If

If chkVegetarian = True Then

ActiveCell.Offset(0, 6).Value = "Yes"

Else

If chkLunch = False Then

ActiveCell.Offset(0, 6).Value = ""

Else

ActiveCell.Offset(0, 6).Value = "No"

End If

End If

Range("A1").Select

End Sub

Как работает код CmdOK_Click:

Первые две строки проверяют, активна ли нужная книга, и перемещают выделение в ячейку A1:

ActiveWorkbook.Sheets("Course Bookings").Activate

Range("A1").Select

The next few lines moves the selection down the worksheet until it finds an empty cell:

Do

If IsEmpty(ActiveCell) = False Then

ActiveCell.Offset(1, 0).Select

End If

Loop Until IsEmpty(ActiveCell) = True

Следующие четыре строки начинают записывать содержимое формы на рабочий лист, используя активную ячейку (которая находится в столбце A) в качестве ссылки и перемещая _ вдоль строки_ ячейку за раз:

ActiveCell.Value = txtName.Value

ActiveCell.Offset(0, 1) = txtPhone.Value

ActiveCell.Offset(0, 2) = cboDepartment.Value

ActiveCell.Offset(0, 3) = cboCourse.Value

Теперь мы подошли к кнопкам выбора. Они помещены в рамку формы, поэтому пользователь может выбрать только один. Оператор IF используется для указания Excel, что делать для каждого параметра:

If optIntroduction = True Then

ActiveCell.Offset(0, 4).Value = "Intro"

ElseIf optIntermediate = True Then

ActiveCell.Offset(0, 4).Value = "Intermed"

Else

ActiveCell.Offset(0, 4).Value = "Adv"

End If

Операторами IF в VBA гораздо проще управлять, чем с функцией IF в Excel.

У вас может быть столько вариантов, сколько хотите, просто вставьте дополнительный ElseIf для каждого из них. Если бы было только два варианта, вам не понадобился бы ElseIf, хватило бы только If и Else (не забывайте — всем им нужен End If).

Для каждого флажка есть еще один оператор IF. Для флажка «Требуется обед» отметка в поле означает «Да», человек требует обед, а отсутствие отметки означает «Нет», если он этого не делает.

If chkLunch = True Then

ActiveCell.Offset(0, 5).Value = "Yes"

Else

ActiveCell.Offset(0, 5).Value = "No"

End If

Мы могли бы использовать аналогичный оператор IF для флажка «Вегетарианец», но если человеку не нужен обед, не имеет значения, вегетарианец он или нет. В любом случае было бы неправильно предполагать, что они не были вегетарианцами просто потому, что им не требовался обед. Следовательно, оператор IF содержит второй вложенный оператор if:

If chkVegetarian = True Then

ActiveCell.Offset(0, 6).Value = "Yes"

Else

If chkLunch = False Then

ActiveCell.Offset(0, 6).Value = ""

Else

ActiveCell.Offset(0, 6).Value = "No"

End If

End If

Галочка в поле означает «Да», человек вегетарианец. Если в этом поле нет галочки, вложенный оператор IF проверяет флажок «Обед требуется». Если в поле «Требуется обед» стоит флажок, то отсутствие флажка в поле «Вегетарианец» означает, что человек не вегетарианец, поэтому в ячейку вставляется «Нет». Однако, если в поле для флажка «Требуется обед» нет галочки, мы не знаем, является ли человек вегетарианцем (в любом случае, это не имеет значения), поэтому ячейка остается пустой («»).

Наконец, выбор возвращается в начало рабочего листа, готовый для следующей записи:

Диапазон («A1»). Выберите === Добавление кода 3: Управление формой Наконец, пример того, как можно управлять элементами управления формы во время ее использования. Когда свойства элемента управления были установлены, свойство Enabled флажка Vegetarian было установлено на False. Когда элемент управления не включен, user не может ввести в него значение, хотя он может содержать значение, которое уже было, а VBA может добавлять, удалять или изменять значение.

Нам не нужно знать, является ли человек вегетарианцем (даже если это так!), Если он не заказывает обед. Таким образом, флажок «Вегетарианец» остается отключенным, если не установлен флажок «Требуется обед». Затем пользователь может установить флажок «Вегетарианец», если он хочет. Если они отметят это, мы будем знать, что они ответили «Да», а если нет, мы знаем, что они ответили «Нет».

Мы можем переключить свойство Enabled с False на True, имея процедуру, которая запускается автоматически при изменении значения флажка Lunch Required. К счастью, в других элементах управления есть процедура Change, и мы используем здесь chkLunch_Change (). Мы будем использовать это, чтобы включить флажок Вегетарианец, когда установлен флажок Требуется обед, и отключить его, когда флажок Требуется обед не установлен.

Нам нужно сделать еще кое-что. Предположим, что кто-то поставил галочку в поле «Требуется обед», а также в поле «Вегетарианский». Затем они передумали и сняли галочку с флажка «Обеденный обед». Флажок «Вегетарианский» будет отключен, но установленный ранее флажок останется.

Дополнительная строка кода может гарантировать, что галочка снята, когда поле отключено. Вот и все:

Private Sub chkLunch_Change()

If chkLunch = True Then

chkVegetarian.Enabled = True

Else

chkVegetarian.Enabled = False

chkVegetarian = False

End If

End Sub

Открытие формы Форма теперь готова к использованию, поэтому ее нужно открыть с помощью простого макроса. Его можно прикрепить к настраиваемой кнопке панели инструментов, кнопке команды, нарисованной на листе, или любому графическому объекту (щелкните правой кнопкой мыши рисунок и выберите «Назначить макрос»). При необходимости создайте новый модуль для книги и добавьте эту процедуру:

Sub OpenCourseBookingForm()

frmCourseBooking.Show

End Sub

Если вам понравились наши блоги, поделитесь ими с друзьями на Facebook. А также вы можете подписаться на нас в Twitter и Facebook .

Мы будем рады услышать от вас, дайте нам знать, как мы можем улучшить, дополнить или усовершенствовать нашу работу и сделать ее лучше для вас. Напишите нам на [email protected]