Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
82
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Следующая процедура, которая расположена в модуле кода диалогового окна UserForm, выполняется перед закрытием формы (т.е. в момент возникновения события QueryClose}.

Private Sub UserForm_QueryClose _

(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then

MsgBox "Щелкните на кнопке ОК для закрытия формы."

Cancel = True

End If End Sub

Процедура UserForm _ QueryClose использует два аргумента. Аргумент CloseMode содержит значение, которое указывает на причину возникновения события QueryClose. Е:сли значение аргумента QueryClose равно vbFormControlMenu (встроенная константа), то это означает, что пользователь щелкнул на кнопке Закрыть. В таком случае будет отображено сообщение; аргумент Cancel устанавливается в значение True, и форма не закрывается.

Помните, что пользователь может нажать комбинацию клавиш <Ctrl+Break> для того, чтобы прекратить выполнение макроса. В этом примере нажатие комбинации <Ctrl+Break> во время отображений формы UserForm на экране приведет к тому, что пользовательское диалоговое окно будет закрыто. Чтобы этого не произошло, выполните представленный ниже оператор перед отображением диалогового окна UserForm:

Application. EnableCancelKey = xlDisabled.

Прежде, чем добавлять этот оператор, удостоверьтесь, что приложение не содержит ошибок, В противном случае возникнет ситуация, когда невозможно будет прекратить выполнение бесконечного цикла.

Изменение размера диалогового окна

Многие приложения используют окна, которые могут изменять собственный размер. Например, диалоговое окно Excel Автоформат (которое отображается после выбора команды Формат^Автоформат) увеличивается в размере после того, как пользователь щелкнет на кнопке Параметры.

Приведенный ниже пример демонстрирует предоставление пользовательскому диалоговому окну возможности динамически изменять свой размер. Изменение размера диалогового окна выполняется с помощью значений свойств Width и H e i g h t объекта UserForm.

На рис. 14.5 показан пример диалогового окна в том виде, в котором оно отображается первоначально. На рис. 14.6 отображено диалоговое окно после щелчка на кнопке Параметры, Обратите внимание на то, что надпись на кнопке изменяется в зависимости от размера диалогового окна.

Рис. M.S. Пример диалогового окна со

Рис.14.6. Толеесамоедиалоговоеокно

 

стандартнымиразмерами

с увеличенным размером для отобра-

 

 

жениядополнительныхпараметров

 

Часть IV. Работа с пользовательским» формами

369

При создании пользовательского диалогового окна определите ему максимальный размер, чтобы получить доступ ко всем элементам управления. После этого воспользуйтесь процедурой U s e r F o r m _ I n i t i a l i z e для установки размеров диалогового окна по умолчанию (меньшие за максимальные).

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

Private Sub OptionsButton_Click()

If OptionsButton.Caption = "Параметры »" Then Me.Height = 164

OptionsButton.Caption = "« Параметры"

Else

Me.Height = 12a

OptionsButton.Caption - "Параметры »"

End If End Sub

Эта процедура проверяет значение свойства C a p t i o n объекта CommandButton и устанавливает значение свойства H e i g h t объекта UserForm в соответствии с полученным значением свойства C a p t i o n ,

Если элементы управления не отображены по причине того, что они находятся за пределами границы диалогового окна, комбинации клавиш, соответствующие этим элементам управления, будут продолжать функционировать. В приводимом примере пользователь может нажать комбинацию <Alt+L> (для перехода к альбомной ориентации страницы), даже когда соответствующий элемент управления не виден на экране. Для того чтобы заблокировать доступ к невидимым элементам управления, создайте код, который будет отключать элементы управления, если они скрываются.

Масштабирование и прокрутка листа в пользовательском диалоговом окне

При отображении диалогового окна зачастую необходимо иметь возможность перемешаться по листу для проверки содержимого различных диапазонов. Обычно такая операция невозможна, если диалоговое окно отображается на экране.

Начиная с Excel 2000, диалоговое OKHD UserForm может становиться "немодальным". Это означает, что пользователь может не закрывать диалоговое окно перед тем, как активизировать рабочую книгу и выполнять другие операции в среде Excel. Метод show объекта UserForm по умолчанию определяет модальную форму отображения окна. Для того чтобы отобразить немодальное диалоговое окно, необходимо воспользоваться следующим оператором:

UserForml.Show vbModeless

Пример, приведенный в этом разделе, демонстрирует, как использовать элемент управления S c r o l l B a r для прокрутки и масштабирования листа при активном диалоговом окне. На рис. 14.7 отображено изменение масштаба рабочего листа (в диапазоне от 100% до 400%) с помощью элемента управления S c r o l l B a r , находящегося в верхней части диалогового окна. Два элемента управления S c r o l l B a r в нижней части диалогового окна позволяют прокручивать лист по горизонтали и по вертикали.

370

Глава 14. Примеры пользовательских форм

Рис.14,7.Элементыуправления ScrollBar позволяют прокручивать лист и изменять его масштаб

Код данного примера достаточно прост:

Private Sub UserForm_Initialize{) LabelZoom.Caption = ActiveWindow.Zoom

1 Масштабирование With ScrollBarZoom

.Min = 10

.Max = 400

.SmallChange = 1

.LargeChange =10

.Value - ActiveWindow.Zoom End With

' Горизонтальная прокрутка With ScrollBarColumns

.Min = 1

.Max = 256

.Value = ActiveWindow.ScrollColumn

.LargeChange = 2 5

.SmallChange = 1 End With

' Вертикальная прокрутка With ScrollBarRows

.Min = 1

.Max = ActiveSheet.Rows.Count

.Value = ActiveWindow.ScrollRow

.LargeChange = 25

.SmallChange = 1 End With

End Sub

Эта процедура устанавливает значения различных свойств элементов управления ScrollBar. Значения определяются на основе данных, полученных из активного диалогового окна.

При использовании элемента управления ScrollBarZoom выполняется процедура ScrollBarZoom__Change (которая приведена ниже). Эта процедура устанавливает нначение свойства Zoom объекта ActiveWindow равным значению свойства Value элемента управления ScrollBar. Кроме того, изменяется текст подписи с целью отразить текущий масштаб рабочего листа.

Private Sub ScrollBarZoom_Change()

With ActiveWindow

.Zoom = ScrollBarZoom.Value

LabelZoom = .zoom & "%"

End With End Sub

Прокрутка листа осуществляется с помощью двух процедур. Эти процедуры устанавливают значение свойств ScrollRow и Scrol lColuums объекта ActiveWindow равными значениям свойств Value элементов управления ScrollBar.

Часть IV. Работа с пользовательскими формами

371

Private Sub ScrollBarColumns_Change()

ActiveWindow.ScrollColumn = ScrollBarColuims.Value

End Sub

Private Sub ScrollBarRows_Change()

ActiveWindow.ScrollRow = ScrollBarRows-Value

End Sub

Использование элемента управления ListBox

Элемент управления ListBox довольно гибкий в использовании, но работа с ним может оказаться достаточно сложной. В данном разделе приведен ряд простых примеров, которые демонстрируют распространенные методики использования элемента управления ListBox.

В большинстве случаев методики, описанные в этом разделе, применяются и к элементу управления ComboBox.

Об элементе управления ListBox

Ниже изложены рекомендации, о которых необходимо помнить при работе с элементом управления ListBox. Примеры данного раздела наглядно иллюстрируют эти советы.

Опции списка элемента управления ListBox могут извлекаться из диапазона ячеек (определяемого свойством RowSource) или добавляться с помощью VBA (для этого используется метод Add It em).

Элемент управления ListBox может быть применен для выделения одной и нескольких опций. Соответствующее повеление определяется значением свойства MultiSelect .

Если элемент управления ListBox не настроен на выделение нескольких опций, то значение элемента управления ListBox может связываться с ячейкой листа с помощью свойства ControlSource .

Элемент управлений ListBox может отображаться без предварительно выбранной оп-

ции (для этого необходимо установить свойство L i s t l n d e x в значение -1). Но как только пользователь выделит одну из опций списка, снять выделение будет невозможно.

Элемент управления ListBox можег содержать несколько столбцов (что указывается в свойстве ColumnCount) и даже описательные заголовки (для этого используется свойство ColumnHeads).

Вертикальный размер элемента управления ListBox, помещенного в пользовательское диалоговое окно, не всегда совпадает с вертикальным размером объекта UserForm на экране.

Опции списка элемента управления List Box могут отображаться в виде флажков, если разрешено выделение нескольких элементов, или в виде переключателей, если под-

держивается только единичное выделение. Это поведение определяется значением свойства L i s t S t y l e .

 

Для получения полной информации о свойствах и методах элемента управления

 

ListBoxобратитеськдиалоговомусправочномуруководству.

372

Глава 14. Примеры пользовательских форм

Добавление опций в элемент управления ListBox

Перед отображением пользовательского диалогового окна, которое содержит элемент управления ListBox, необходимо заполнить элемент управления ListBox необходимыми опциями. Элемент управления ListBox заполняется на этапе разработки проекта посредством указания диапазона ячеек, которые содержат необходимые данные. Его также можно заполнить на этапе выполнения, воспользовавшись кодом VBA для добавления всех опций списка.

Примеры настоящего раздела предполагают следующее.

Используется диалоговое окно UserForrn с именем UserForml.

Диалоговое окно UserForml содержит элемент управления ListBox, который называется ListBoxl.

Рабочая книга содержит лист, называющийся Лист1, в диапазоне А1:А12 которого определены опции, отображаемые в элементе управления ListBox.

Добавление опций в элемент управления ListBox на этапе разработки

Для того чтобы иметь возможность добавить опции элемента управления ListBox на этапе разработки, элементы должны храниться в диапазоне ячеек рабочей книги. Воспользуйтесь свойством RowSource для указания диапазона, который содер-

жит опции элемента управления ListBox. На рис. 14.8 показано окно Properties для элемента управления ListBox. Свойство RowSource установлено в значение Лист1 !А1: А12. Когда диалоговое окно UserForm отображается на экране, элемент управления ListBox содержит двенадцать опций из этого диапазона. Опции добавляются в элемент управления ListBox на этапе разработки, сразу после того, как диапазон определяется в качестве значения свойства RowSource.

Рис. 14.8. Установка значения свойства RowSoarceна этаперазработки

Удостоверьтесь, что в значении свойства RowSource присутствует имя листа. В противном случае элемент управления ListBox будет применять указанный диапазон в активном рабочем листе. В некоторых случаях необходимо идентифицировать диапазон максимально точно, указав даже имя рабочей книги. Например: I Книга!, x l s ]ЛИСТ! 1А1.-А12,

Добавление опций в элемент управления ListBox на этапе выполнения

Чтобы добавить опции элемента управления L i s t B o x на этапе выполнения, необходимо реализовать следующее.

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

Создать код, используюший метод Adultem для добавления опций в элемент управ-

ления L i s t B o x .

ЧастьIV.Работаспользовательскимиформами

373

Значение свойства RowSource устанавливается с помощью кода, а ке в окне Properties. Например, представленная далее процедура устанавливает значения свойства RowSource элемента управления ListBox перед тем, как отображать диалоговое окно UserForm. В этом случае опции состоят из значений в ячейках диапазона Categories рабочего листа Budget.

UserForml.ListBoxl.RowSource = "Budget!Categories" UserForml.Show

Если опция элемента управления Listliox не содержатся в диапазоне ячеек.листа, то можно создать специальный код VBA для заполнения элемента управления ListBox перед кодом отображения диалогового окна. Следующая процедура заполняет элемент управления ListBox названиями месяцев года с помощью метода Addltem.

Sub ShowUserForm2()

' Заполнение элемента управления ListBox With UserForm2.ListBoxl

.RowSource=""

.Addltem "Январь"

.Addltem "Февраль"

.Addltem "Март"

.Addltem "Апрель"

.Addltem "Май"

.Addltem "Июнь"

.Addltem "Июль"

.Addltem "Август"

.Addltem "Сентябрь"

.Addltem "Октябрь"

.Addltem "Ноябрь"

.Addltem "Декабрь" End With UserForm2.Show

End Sub

В предыдущем коде свойство Rowsource приравнивалось пустой строке с целью избежать потенциальной ошибки, когда в окне Properties свойства RowSource элемента управления ListBox имеет определенное значение. Если попытаться добавить опции в элемент управления ListBox с ненулевым значением свойства RowSource,тобудетвыведеносообщениеобошибке("Permission denied").

Кроме того, можно использовать метод Addltem для получения опций элемента управления ListBox, хранящихся в диапазоне ячеек. Ниже рассмотрен пример заполнения элемента управления ListBox содержимым диапазона Al :А12 листа Лист!.

For Row = 1 То 12

UserForml.ListBoxl.Addltem Sheets("Лист1"}.Cells(Row, 1) Next Row

Если данные хранятся в одномерном массиве, то можно назначить массив элементу управления с помощью единственной инструкции. Предположим, что у нас есть массив dData, который содержит 50 элементов. Следующий оператор создает список из 50 опций на основе элемента управления ListBox, называющегося ListBoxl:

ListBoxl . Lis t я dData

Добавление в элемент управления ListBox только уникальных опций

В определенных случаях возникает необходимость в заполнении элемента управления ListBox уникальными (неповторяющимися; опциями из существующего списка. Предположим,

374

Глава 14. Примеры пользовательских форм

у нас есть лист, который содержит данные о потребителях. Один из столбцов может содержать названия стран (рис. 14.9). Необходимо заполнить элемент управления ListBox новациями стран, в которых проживают истребители.

Рис. 14.9. Объект Collection используется для заполнения элемента управления ListBox уни-

кальпыми значениями из столбца В

Одна из техник заполнения предполагает использование объекта C o l l e c t i o n . Элементы в объект C o l l e c t i o n добавляются с помощью следующего синтаксиса:

object.Add item, key, before, a f t e r

Аргумент key, если он используется, содержит уникальную текстовую строку, которая необходима для получения доступа к •элементам коллекцииЕсли к коллекции добавить неуникальньш ключ, то возникнет ошибка, в результате элемент добавлен не будет. Этим можно воспользоваться и создать коллекцию, которая содержит только уникальные элементы.

Представленная далее процедура демонстрирует использование этого способа. Процедура начинается с декларации нового объекта C o l l e c t i o n — NoDupes. Предполагается, что диапазон, называющийся Data, содержит список элементов, часть из которых повторяется.

В коде циклически просматриваются ячейки диапазона, и в коллекцию NoDupes добавляются значения только уникальных ячеек. Кроме того, значение ячейки (преобразованное в строку) используется в качестве значения аргумента key. Применение оператора On Error Resume Next приводит к тому, что в коде VBA игнорируется ошибка, которая возникает при добавлении в коллекцию неуникального ключа. Если возникает ошибка, элемент в коллекцию не добавляется — это именно то поведение, которого требуется добиться. Затем процедура передает элементы коллекции NoDupes в элемент управления ListBox. Диалоговое окно UserForm также содержит подпись, которая указывает количество уникальных элементов коллекции.

Sub P.emoveDuplicatesl ()

Dim AllCells As Range, Cell As Range Dim NoDupes As New Collection

On Error Resume Next

For Each Cell In Range{"Data")

NoDupes.Add Cell.Value, CStr(Cell,Value)

Next Cell

On Error GoTo 0

1Добавить уникальные элементы в элемент управления ListBox Рог Each Item In NoDupes

UserForml.ListBoxl.Addltem Item Next Item

1 Отобразить количество

Часть IV. Работа с пользовательскими формами

375

UserForml.Labell-Caption = _

"Уникальные элементы: " ь KoDupes.Count

' Отобразить диалоговое окно UserForm UserForml.Show

End Sub

Более сложная версия этой процедуры представлена на Web-узле издательства.

Определение выделенной опции

Примеры предыдущих разделов отображали диалоговое окно UserForm с элементом управления ListBox, который содержит список из нескольких опций. Эти процедуры не содержат главнойфункциональности:определенияопцииилиопций,которыевыбраныпользователем.

Далее будет использован элемент управления ListBox с выделением одной опции списка — его свойство MultiSelect должно иметь значение 0.

Для того чтобы определить, какая опция выбрана, необходимо узнать значение свойства Value элемента управления ListBox. Оператор, показанный ниже, отображает текст выделенной опции в объекте ListBoxl:

MsgBox ListBoxl.Value

Если не выделена ни одна опция, то выполнение оператора приведет к возникновению ошибки.

Чтобы узнать расположение выделенной опции в списке (а не только его содержимое), воспользуйтесь значением свойства Listlndex элемента управления ListBox. Следующий пример демонстрирует простое окно сообщения, в котором указан номер выделенной опции элемента управления ListBox:

MsgBox "Вы выбрали опцию #" & ListBoxl.Listlndex

Если не выделена ни одна опция, то свойство Listlndex будет иметь значение -1.

Нумерация опций в элементе управления ListBox начинается с 0, а не с I. Таким образом, значение свойства Listlndexдля первого элемента равно 0. Для последнего элемента списказначениесвойства равнозначениюсвойства Listcount-l.

Определение нескольких выделенных опций

Как правило, свойство MultiSelect элемента управления ListBox имеет значение 0 — таким образом, пользователь может выбрать только одну опцию в элементе управления ListBox.

Если элемент управления ListBox позволяет выделять несколько опций (т.е- его свойство MultiSelect установлено в значение I или 2), то при попытке доступа к значениям свойств Listlndex или Value элемента управления ListBox возникнет ошибка. Вместо указанных свойств необходимо использовать свойство Selected, которое возвращает массив, первый элемент которого имеет индекс 0. Например, представленный ниже оператор отображает значение True, есяи выделена первая опция элемента управления ListBox1.

MsgBox ListBoxl.Selected(O)

376

Глава 14. Примеры пользовательских форм

На Web-узле издательства содержится рабочая книга, в которой отображены принципы идентификации выделенных опций списка в элементе управления ListBox. Этот способ работает при выделении и одной, и нескольких опций.

Следующий код, взятый из примера рабочей книги, которая расположена на Web-узле издательства. В данном коде просматриваются все опции списка элемента управления ListBox . Если опция выделена, то текст опции добавляется к переменной Msg. В конце все выделенные опции отображаются в окне сообщения.

Private Sub OKButton_Click() Msg = ""

For i = 0 To ListBoxl.ListCount - 1

If ListBoxl.Selected(i) Then

Msg = Msg & ListBoxl.List(i) & vbCrLf Next i

MsgBox "Вы выбрали: " & vbCrLf & Msg Unload Me

End Sub

На рис. 14.10 показан результат выполнения этой процедуры при выделенных нескольких опциях в элементе управления ListBox .

Рис. 14.10. Это окно сообщения содержит список опций, которые выделены в элементе управления ListBox

Несколько списков в одном элементе управления ListBox

Приведенный ниже пример демонстрирует создание элемента управления ListBox, изменяющего свое содержимое в зависимости от того, какие переключатели O p t i o n B u t t o n установил пользователь.

На рис. 14.11 показан пример диалогового окна UserForm. Элемент управления L i s t - Box получает список значений из диапазона на листе. Процедуры, обрабатывающие событие C l i c k для элементов управления O p t i o n B u t t o n , устанавливают значение свойства Row- S o u r c e элемента управления L i s t B o x равным другому диапазону. Одна из таких процедур представлена далее:

Часть IV. Работа с пользовательскими формами

377

Private

Sub obMonths_Click()

 

ListBoxl.RowSource = "Лист1!Месяцы"

'

End Sub

 

 

Щелчок на элементе управления O p t i o n B u t t o n , называющемся obMonths, приводит к изменению значения свойства RowSource элемента управления ListBox, что заставляет его использовать диапазон Месяцы на листе Лмст1.

.14.11.Codep.vcu.\iaeэлементауправленияListBoxза- висит от того, какой из элементов управления OptionButton выбран в текущий момент

Передача опций элемента управления ListBox

В некоторых приложениях требуется выбрить несколько элементов списка. Зачастую следует создать новый список на основе выделенных элементов. Примером такой ситуации служит диалоговое окно Управление панелями инструментов, которое возникает при щелчке на кнопке Вложить в диалоговом окне Настройка (это диалоговое окно можно отобразить, выбрав Вид^Панели инструментов^Настройка).

На рис. 14.12 показано диалоговое окно с двумя элементами управления ListBox . Кнопка Добавить добавляет элемент, выделенный в левом элементе управления ListBox, в правый элемент управления ListBox . Кнопка Удалить удаляет выделенный элемент из правого списка. Флажок определяет поведение при добавлении в список повторяющихся элементов. Если флажок Разрешить дублирование не установлен, то в случае, если пользователь попытается добавить элемент, который уже присутствует в списке, будет отображено окно сообщения.

Рис. 14-12. Создание списка наосноведругогосписка

Код этого примера на удивление прост. Ниже приведена процедура, которая выполняется, когда пользователь щелкает на кнопке Добавить.

private Sub AddButton_Click()

If ListBoxl.Listlndex = -1 Then Exit Sub If Not cbDuplicates Then

1Проверить существование элемента For i = 0 To ListBox2.ListCount - 1

378

Глава 14. Примеры пользовательских форм

Соседние файлы в папке 2 семестр