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

2 семестр / vba_2002

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

If ListBoxl.Value = ListBox2.List(i) Then

Beep

Exit Sub

End If

Next i

End If

ListBox2.Addltem ListBoxl.Value

End Sub

Код для управления кнопкой Delete еще проще;

Private Sub DeleteButton_Click(}

If LiatBox2.Listlndex = -1 Then Exit Sub ListBox2.Removeltem ListBox2.Listlndex

End Sub

Обратите внимание, что обе процедуры проверяют существование выделенного элемента. Если значение свойства L i s t l n d e x элемента управления L i s t B o x равно -1, значит, не выделен ни один элемент. В результате процедура завершается.

Перемещение опции в списке элемента управления ListBox

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

На рис. 14.13 показано диалоговое окно, которое содержит элемент управления L i s t B o x и два элемента управления CommandButton. Щелчок на кнопке Вверх приведет к перемещению выделенной опции вверх по списку элемента управления L i s t B o x . Щелчок на кнопке Вниз приведет к перемещению выделенной опции вниз по списку.

Рис.14.13.Кнопкипозволяютпользователю перемещать опции списка в элементе управления Li s tBox

Процедуры обработки событий двух элементов управления CoinmandButton выглядят следующим образом.

Private Sub MoveUpButton_Click()

If ListBoxl.Listlndex <= 0 Then Exit Sub Numltems = ListBoxl.ListCount

Dim TempList()

ReDim TempList(0 To Numltems - 1)

1Заполнить массив опциями списка For i = 0 To Numltems - 1

TempList(i) = ListBoxl.List(i)

Next i

1Выделенные опции

itemNuiti = ListBoxl .Listlndex Обменять элементы

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

379

 

Templtem = TempList(ItemNum)

 

TempList(ItemNum) = TempList(ItemNum - 1)

 

TempList(ItemNum - 1) = Templtem

 

ListBoxl-List = TempList

1

Изменить индекс списка

 

ListBoxl.Listlndex = ItemNum - 1

End Sub

 

 

Private ЭиЪ MoveDownButton__Click()

 

If ListBoxl.Listlndex = ListBoxl.ListCount - 1 Then Exit Sub

 

Wumltems

= ListBoxl.ListCount

 

Dim TempList()

 

 

ReDim TempList(0 To Numltems - 1)

1

Заполнить массив

опциями списка

 

For i = 0 To Nvmltems - 1

 

TempList(i) = ListBoxl.List(i)

 

Next i

 

 

1

Выделенные пункты

 

 

ItemNum =

ListBoxl.Listlndex

1

Обменять

элементы

 

 

Templtem = TempList(ItemNum)

 

TempList (ItemNum)

= TempList (ItiemNum + 1)

 

TempList(ItemNum + 1) = Templtem

 

ListBoxl.List = TempList

1

Изменить

индекс списка

 

ListBoxl.Listlndex = ItemNum + 1

End Sub

 

 

Эти процедуры выполняются достаточно неплохо, но может оказаться, что по неизвестной причине, достаточно быстрые щелчки на кнопке не приводят к требуемому результату. Например, можно трижды быстро щелкнуть на кнопке Вниз, но элемент списка переместится только на две позиции вниз, Решением этой проблемы является добавление обработчика события DblClick для каждого элемента управления CommandButton. Процедуры, которые всего лишь вызывают процедуры обработки события Click, выглядят следующим образом:

P r i v a t e

Sub MoveUpButton_DblClick _

{ByVal Cancel As MSForms.ReturnBoolean)

Call

MoveUpButton_Click

End Sub

 

Private Sub MoveDovmB\itton_DblClick _

(ByVal Cancel As MSForms.ReturnBoolean)

Call MoveDownButton_Click

End Sub

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

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

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

Рыс. /4.74. Этот элемент управления ListBox отображает данные в виде спискаизтрехстолбцов,длякаждогоизкоторыхуказанзаголовок

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

1.Удостоверьтесь, что свойство ColumnCount элемента управления L i s t B o x установлено в правильное значение, которое соответствует количеству столбцов в элементе управления.

2.Укажите правильный исходный диапазон данных из нескольких столбцов, присвоив

соответствующее значение свойству RowSource элемента управления L i s t B o x .

3.Если необходимо отобразить заголовки столбцов, как это показано на рис. 14.14, установите свойство ColuronHeads в значение True. He включайте заголовки столбцов в диапазон рабочего листа, указанный в свойстве RowSource. VBA автоматически использует для них строку, которая находится сразу над строкой, указанной в значении свойства RowSource.

4.Измените ширину столбцов, присвоив свойству ColumnWidths значения, которые указываются в пунктах (1/72 часть дюйма) и разделены точками с запятой. Например, следующее значение свойства ColumnWidths определяет ширину трех столбцов списка элемента yпpaвлeнияListBox:

100Г 40;30

5.Укажите столбец в качестве значения свойства BoundColumn. Это свойство опреде-

ляет столбец, на который указывает ссылка при обращении к свойству V a l u e элемента yrrpaBTteHHffListBox.

Чтобы заполнить элемент управления L i s t B o x данными из нескольких столбцов без использования диапазона, необходимо создать двухмерный массив, после чего присвоить массив свойству L i s t элемента управления ListBox . Следующий оператор отображает названия месяцев в столбце 1, а количество дней — в столбце 2 (рис. 14.15). Обратите внимание, что процедура устанавливает свойство ColumnCount в значение 2.

Private Sub UserForm_Initialize()

 

1

Заполнить элемент

управления ListBox

 

 

Dim Data(l To 12,

1 То 2)

 

 

For i = 1 То 12

 

 

 

D a t a ( i , 1) =

F o r m a t ( D a t e S e r i a l ( 2 0 0 1 , i, 1 ) ,

"mmram")

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

381

Next i

For i = 1 To 12

Data(i, 2} = Day(DateSerial(2001,

Next i

ListBoxl .ColuimCount = 1

ListBoxl.List = Data

End Sub

Рис.14,15.Заполненныйданнымидвухмерногомассиваэлементуправления ListBoxc двумя столбцами

Не существует способа определить заголовки столбцов в свойстве colmnnHeads, когда в качестве источника списка применяется массив VBA.

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

Пример, приведенный в этом разделе, поможет вам в решении различных практических задач. Он позволяет отображать элемент управления ListBox, который состоит из полностью занятого диапазона на текущем листе (рис. 14.16). Пользователь может выбрать несколько опций списка в элементе управления ListBox . Щелкнув на кнопке Все. вы выберете все опции, а щелкнув на кнопке Сброс — вызовете отмену выбора всех опций. Щелчок на кнопке ОК приводит к выделению строк, которые соответствуют выделенным опциям элемента управления ListBox . Конечно, можно выделить несколько несмежных диапазонов непосредственно на листе. Эта задача выполняется с помощью клавиши <Ctrl>. Но со временем становиться понятно, что метод, предложенный в этом разделе, намного удобнее.

Рис.14.16.Этотэлементуправления ListBox упрощает выделение строк нарабочемлисте

Выбор нескольких элементов возможен благодаря тому, что свойство M u l t i S e l e c t элемента управления L i s t B o x установлено в значение 1 - fmMultiSelectMulti. Напротив каждого пункта отображаются "флажки", так как свойство L i s t s t y l e элемента управления L i s t B o x установлено в значение 1 - fniListStyleOplion. Ниже приведена процедура объекта UserForm для обработки события I n i t i a l i z e ; . Эта процедура создает объект rng, который

382

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

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

Private

Sub userForm^lnitializeO

 

 

ColCnt = ActiveSheet.UsedRange.Columns.Count

 

Set

rng = ActiveSheet.UsedRange

 

 

With

ListBoxi

 

 

 

.ColumnCount = ColCnt

 

 

 

.RowSource = rng.Address

 

 

 

cw = ""

 

 

 

For с - 1 To .ColumnCount

 

 

 

cw = cw & rng.Columns(c).Width & ";"

 

 

Next с

 

 

 

.ColumnWidths = cw

 

 

 

.Listlndex = 0

 

 

End With

 

 

End Sub

 

 

 

Кнопки Все и Сброс (называющиеся SelectAllButton и SelectNoneButton) име-

 

ют простые процедуры обработки событий, которые показаны ниже:

 

Private Sub SelectAllButton_Click()

 

 

For r = 0 To ListBoxl.ListCount -

1

 

 

ListBoxl.Selected(r) = True

 

 

Next r

 

 

End Sub

 

 

 

Private Sub SelectNoneButton_Click()

 

 

For r = 0 To ListBoxl.ListCount -

1

 

 

ListBoxl.Selected<r) - False

 

 

Next r

 

 

End Sub

 

 

 

Далее приведена процедура обработки события OKButton_Click. Эта процедура созда-

 

ст объект Range, называющийся RowRange. Он состоит из строк, соответствующих выде-

 

ленным опциям в элементе управления ListBox. Для того чтобы определить факт выделе-

 

ния опции, в коде проверяется значение свойства Selected элемента управления ListBox.

 

Обратите внимание, что используется функция Union для добавления дополнительных диа-

 

пазонов к объекту RowRange.

 

 

Private Sub OKButton_Click(}

 

 

Dim RowRange As Range

 

 

RQwCnt = 0

 

 

For r = 0 To ListBoxl.ListCount -

1

 

 

If ListBoxl.Selected(r) Then

 

 

 

RowCnt = RowCnt + 1

 

 

 

If RowCnt = 1 Then

 

 

 

Set RowRange = ActiveSheet.Rows{r + 1)

 

 

Else

 

 

 

Set RowRange = _

 

 

 

Union(RowRange, ActiveSheet.Rows(r + 1})

 

 

End If

 

 

 

End If

 

 

Next r

 

 

If Not RowRange Is Nothing Then RowRange.Select

 

Unload Me

 

 

End Sub

 

 

 

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

383

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

Пример, приведенный в этой главе, и полезен, к познавателен. В кем использован элемент управления L i s t B o x с несколькими столбцами для отображения списка рабочих листов активной рабочей книги. Столбцы содержат следующие данные.

Имя листа.

Состояние листа.

Тип листа (рабочий лист, диаграмма

Количество непустых ячеек в листе,

 

или диалоговый лист Excel 5/95).

 

 

На рис. 14.17 показан пример такого диалогового окна.

Рис. 14.17.Этодиалоговоеокно позволяет пользователю активизироватьвыбранныйлист

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

Private Sub UserForm_Initialize()

 

 

 

Dim SheetData() As

String

 

 

 

 

Set

OriginalSheet =

ActiveSheet

 

ShtCnt = ActiveVJorkboo*. Sheets. Count

ReDim SheetData(l To ShtCnt,

 

1 To 4)

ShtNum = 1

 

 

 

 

 

 

For

Each Sht

In ActiveWorkbook.Sheets

 

If Sht.Name = ActiveSheet.Name Then „

 

Lis tРо:з = ShtNum -

1

 

 

 

 

SheetData(ShtNum, 1) = Sht.Name

 

Select Case TypeName(Sht)

 

 

 

 

Case

"Worksheet"

 

 

 

 

 

SheetData(ShtNum,21="Лист"

 

SheetData{ShtNum,

 

3]

= _

 

 

Application.CauntA(Sht.Cells)

 

Case

"Chart"

 

 

 

 

 

SheetData(ShtNum,

21

= "Диаграмма"

 

SheetData(ShtNum,

3)

= "N/A"

 

Case

"DialogSheet"

 

 

 

 

SheetData (ShtMum,

2)

= "Диалог"

 

SheetData(ShtNum,

3;

= "N/A"

 

End Select

 

 

 

 

 

 

If Sht.Visible Then

 

 

 

 

 

SheetData(ShtNum,

4}

= "Истина"

 

Else

 

 

 

 

 

 

 

SheetData(ShtNum,

4)

= "Ложь"

 

End If

 

 

 

 

 

 

 

ShtNum = ShtNum + 1

 

 

 

 

Next

Sht

 

 

 

 

 

 

With

ListBoxl

 

 

 

 

 

 

384

 

 

 

 

 

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

-ColumnWidths = "100 pt;50 pt;40 pt;50 pt"

.List = SheetData

.Listlndex = ListPos End With

End Sub

Ниже приведена процедура ListBoxl_click:

Private Sub ListBoxl_Click() If cbPreview Then _

Sheets(ListBoxl.Value)-Activate

End Sub

Значение элемента управления CheckBox (с названием cbPreview) определяет необходимость предварительного просмотра листа после того, как пользователь щелкнет на соответствующей опции списка элемента управления ListBox.

Щелчок на кнопке ОК (объект OKButton) приводит к выполнению процедуры OKButton_ Click, которая отображена далее:

Private Sub OKButton_Click(} Dim UserSheet As Object

Set UserSheet = Sheets(ListBoxl.Value) If UserSheet.Visible Then

UserSheet-Activate

Else

If MsgBox("Отобразить листы? и г _ vbQuestion + vbYesNoCancel) = vbYes Then

UserSheet.Visible = True UserSheet.Activate

Else

OriginalSheet.Activate End If

End If Unload Me

End Sub

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

Двойной щелчок на опции списка в элементе управления ListBox приводит к тому же результату, что и щелчок на кнопке ОК. Процедура ListBoxl_DblClick, которая отображена ниже, вызывает процедуру OKButton_Click:

Private Sub ListBoxl_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Call OKButton_click End Sub

Применение элемента управления MultiPage

Элемент управления M u l t i P a g e используется в тех диалоговых окнах UserForm, которые содержат большое количество элементов управления. Он позволяет группировать элементы управления и размещать каждую такую группу на отдельной вкладке.

Элемент управления M u l t i P a g e очень гибкий, он представляет возможность управления внешним видом и поведением окна. Он имеет ранее не описываемое свойство T a b O r i e n t a t i o n , принимающее одно ш четырех значений.

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

385

Окно Toolbox содержит элемент управления, называющийся TabStrip, Элемент управления MultiPage является более гибким, поэтому вам вряд ли придется использовать элемент управления TabStrip.

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

Вкладка (или страница), которая отображается поверх всех остальных, определяется значением свойства Value элемента управления MultiPage. Значение 0 соответствует первой вкладке. Значение 1 вызывает отображение второй вкладки и т.д.

По умолчанию элемент управления MultiPage состоит из двух страниц. Для того чтобы добавить дополнительные вкладки, щелкните на любой вкладке правой кнопкой мыши и выберите New Page из появившегося контекстного меню.

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

Порой сложно выделить сам элемент управления MultiPage, так как щелчок на этом элементе приводит к выделению страницы элемента управления. Для того чтобы выделить только элемент управления, щелкните на его границе. Кроме того, можно воспользоваться клавишей <ТаЬ> для циклического перемещения между элементами управления. Еще одним вариантом выделения элемента управления является выбор MultiPage из выпадающего списка окна Properties.

Если элемент управления MultiPage содержит много вкладок, то можно установить его свойство MultiRow в значение True, чтобы отображать вкладки в несколько строк.

Если необходимо, то вместо вкладок можно отображать кнопки. Достаточно изменить значение свойства Style на 1. Если значение свойства Style равно 2, элемент управления MultiPage не будет отображать ни вкладки, ни кнопку.

Свойство TabOrientation определяет расположение вкладок на элементе управления MultiPage.

Для каждой страницы можно устанонить эффект перехода. Для этого воспользуйтесь свойством TransitionEf f ect. Например, щелчок на вкладке приведет к тому, что "новая" страница "отодвинет" старую. Применяйте свойство TransitionPeriod с целью установить скорость эффекта перехода.

Вследующей главе приведены примеры, в которых используется элемент управленияMultiPage.

Резюме

Данная глава содержит примеры использования диалоговых окон UserForm. Вы имели возможность узнать распространенные методики работы с такими диалоговыми окнами в коде VBA. Кроме того, в главе приведены примеры использования элемента управления Li stBox.

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

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

Использование диалоговых окон UserForm

Отображение индикатора текущего состояния

Одним из самых волнующих вопросов для разработчиков приложений Excel является возможность использования индикатора текущего состояния. Индикатор текущего состояния — это графический "измеритель", который отображает текущее состояние выполняемой задачи, например, долго работающего макроса.

До Excel версии 97 создание индикатора текущего состояния было сложной задачей. Теперь все намного проще. В настоящем разделе рассматриваются методы создания индикаторов текущего состояния.

Макрос, который запускается за пределами диалогового окна' UserForm (отдельный индикатор текущего состояния).

Макрос, который запускается из диалогового окна User - Form. В этом случае диалоговое окно UserForm использует элемент управления M u l t i P a g e для отображения индикатора текущего состояния, пока выполняется другой макрос.

Макрос, который запускается из диалогового окна User - Form. В этом случае диалоговое окно UserForm увеличивает свою высоту, а индикатор текущего состояния отображается в верккей части окна.

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

Отображение текущего состояния в строке состоянияокна

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

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

A p p l i c a t i o n . S t a t u s B a r = "Пожалуйста, подождите ... "

Вы вправе обновлять строку состояния в процессе работы макроса. Например, если в макросе используется переменная Pet, которая представляет состояние задачи, то можно создать код, который будет периодически выполнять представленный далее оператор;

Application.StatusBar = "Выполнение.. . " & Pet & "% завершено"

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

Application.StatusBar = False

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

Создание отдельного индикатора текущего состояния

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

Этот пример находится на Web-узле издательства.

Создание диалогового окна UserForm

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

1.Добавьте новое диалоговое окно Ust=rForm и измените значение свойства Caption наСостояние.

2.Добавьте элемент управления Frame и назовите его FrameProgress.

3.Внутри элемента управления Frame создайте элемент управления Label и назовите его LabelProgress. Удалите заголовок этого элемента управления и сделайте фон элемента управления красным (с помощью свойства BackColor). На данный момент размер и расположение этого элемента управления не важны.

4.Добавьте еще один элемент управления Label над элементом, чтобы иметь возможность описывать происходящее.

5.Измените размер и расположение элементов управления и диалогового окна UserForm— они должны выглядеть, как показано на рис. 15.1,

388

Глава 15. Использование диалоговых окон UserForm

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