Использование элементов Поле со списком и Список

Элемент Поле со списком (ComboBox) дает возможность пользователю выбрать значение из списка или ввести его в поле списка. Список в элементе Поле со списком может содержать несколько столбцов. Строки и столбцы нумеруются с 0.

Основное событие элемента — Change. Оно возникает, когда введено или выбрано новое значение списка.

Свойства элемента Поле со списком (ComboBox):

List — элементы списка. Для доступа к конкретному элементу нужно указать номера строки и столбца (если столбец не один). Можно использовать для инициализации списка;

Listlndex — помер текущей строки. Равен — 1, если никакой элемент не выбран;

ListCount — количество строк в списке;

RowSource — источник элементов списка. В качестве значения используется ссылка на диапазон рабочего листа Microsoft Excel. Например, MyList.RowSource = “А1:А10”;

Text — значение, которое отображается в текстовом поле;

Style — определяет, как пользователь может ввести значения в иоле списка: значение 0 позволяет ввести данные, которых нет в списке, 2 не позволяет ввести новые данные.

Методы элемента Поле со списком (ComboBox):

Addltem — добавляет элемент в список: в указанную позицию или в конец списка, если позиция не указана. Значение элемента и позиция — параметры метода;

Removeltem — удаляет из списка элемент с заданным номером;

Clear — удаляет все строки из списка.

Элемент Список (ListBox) применяется для хранения списка значений. Во время работы приложения пользователь может выбрать из списка одно или несколько значений.

Основные методы и события элемента Список такие же, как у элемента Поле со списком.

Основные свойства элемента Список (ListBox):

List, ListCount, RowSource — имеют такой же смысл, как у элемента Поле со списком;

Listlndex — номер текущей строки. Равно — 1, если никакой элемент не выбран. Если выделено несколько строк, то равно номеру строки, которая имеет фокус;

MultiSelect — определяет, можно ли выделить несколько элементов списка;

Selected — массив логических значений, состоящий из того же количества элементов, что и список. Элемент массива равен True, если соответствующий элемент списка выделен, и False, если нет;

Text — значение выбранного элемента списка.

Пример 10.33

Рассмотрим, как можно поместить в список значения во время выполнения программы.

Для заполнения списка используются свойства List, RowSource и метод Addltem. Свойству List в качестве значения можно присвоить массив, свойству RowSource — строку со ссылкой на нужный диапазон (будут использованы значения из первого столбца диапазона). Если данные находятся в строке, то необходимо выполнить ее транспонирование, например с помощью стандартной функции Excel. Метод Addltem позволяет добавлять в список по одному элементу.

Создайте форму, приведенную на рис. 10.8. На этой форме элемент ListBox имеет имя List Box 1.

Форма, создаваемая в примере 10.33

Рис. 10.8. Форма, создаваемая в примере 10.33

Решение

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

'Массив констант

Private Sub OptionButtonl_Click()

ListBoxl.RowSource = ""

ListBoxl.List = Array("Значение 1", "Значение 2", "Значение 3") End Sub

'Массив

Private Sub OptionButton2_Click()

Dim A(1 To 5) As String For i = 1 To 5

A(i) = "Строка " & i Next

ListBoxl.RowSource = ""

ListBoxl.List = A End Sub

Обратите внимание, что при присваивании значения свойству List свойство RowSource должно иметь пустое значение, иначе возникнет ошибка.

В процедуре ниже используется диапазон АЗ:А7 листа с именем Лист1. Если имя листа не указывать, то будет использоваться диапазон текущего листа.

’Фиксированный диапазон Private Sub OptionButton3_Click()

ListBoxl.RowSource = "Лист1!АЗ:A7"

End Sub

'Вводимый диапазон

Private Sub OptionButton4_Click()

Dim R As Range

On Error GoTo NoDate 'Если выберут "Отмена"

ListBoxl.RowSource = ""

Set R = Application.InputBox(

Prompt:="Введите диапазон", Type:=8)

If R.Rows.Count <> 1 Then

ListBoxl.RowSource = R.Address Else

ListBoxl.List =

Application.WorksheetFunction.Transpose(R)

End If NoDate:

End Sub

В последнем случае значения берутся из первого столбца текущего диапазона.

'Неповторяющиеся значения из текущего диапазона Private Sub 0ptionButton5_Click()

Dim R As Range, S As String, p As Boolean ListBoxl.RowSource = ""

Set R = ActiveCell.CurrentRegion ListBoxl.Addltem R(l, 1)

For i = 2 To R.Rows.Count p = True

For j = 0 To ListBoxl.ListCount - 1 S = R (i, 1)

If ListBoxl.List(j) = S Then p = False: Exit For Next

If p Then ListBoxl.Addltem R(i, 1)

Next

ListBoxl.Listlndex = 0 End Sub

Заполнение значениями элемента ComboBox выполняется совершенно аналогично.

Рассмотрим, как работать со списком, который содержит несколько столбцов:

  • — свойству ColumnCount нужно присвоить значение, равное количеству столбцов;
  • — при заполнении списка можно создать двумерный массив и присвоить его свойству List элемента ListBox или присвоить свойству RowSource строку с адресом нужного диапазона;

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

— строки и столбцы в списке нумеруются с нуля, для обращения к конкретному значению используется конструкция ListBoxl.List(ij);

при обращении к свойству Value элемента ListBox будет выдаваться значение, находящееся в столбце, указанном в свойстве BoundColumn;

— ширина столбцов (в пунктах, 1 пункт = 1/72 дюйма) определяется в свойстве ColumnWidths. Значения разделяются точкой с запятой.

Пример 10.34

Пусть на рабочем листе имеется таблица, изображенная на рис. 10.9.

Данные на рабочем листе для примера 10.34

Рис. 10.9. Данные на рабочем листе для примера 10.34

Создадим форму со списком, в котором информация выводится так же, как в таблице в три колонки.

Решение

Добавьте в форму элемент ListBox и напишите процедуру обработки события Initialize. Обратите внимание, что переменная R объявляется вне процедуры. Это сделано специально, так как значение этой переменной присваивается в процедуре UserForm_Initialize, а используется оно еще и в процедуре CommandButton2_Click.

Dim R As Range

Private Sub UserForm_Initialize()

Set R = ActiveCell.CurrentRegion ListBoxl.ColumnCount = R.Columns.Count 'получаем ссылку на диапазон без строки заголовка ListBoxl.RowSource =

R.Offset(l, 0) .Resize(R.Rows.Count - 1, R.Columns.Count).

Address

ListBoxl.ColumnHeads = True ListBoxl.ColumnWidths = "60;50;40"

End Sub

Установите свойство MultiSelect элемента ListBoxl равным 1. В этом случае в списке можно выделить несколько элементов (строк), щелкая по ним мышыо или нажимая клавишу «пробел». У выделенных элементов свойство Selected имеет значение True.

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

Форма, создаваемая в примере 10.34

Рис. 10.10. Форма, создаваемая в примере 10.34

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

'Снять выделение

Private Sub CommandButtonl_Click()

For i = 0 To ListBoxl.ListCount - 1 ListBoxl.Selected(i) = False Next End Sub

'Запись на лист

Private Sub CommandButton2_Click()

S = InputBox("Введите имя листа")

If S <> "" Then 'не нажали Отмена

Sheets.Add after:=Sheets(Sheets.Count)

Sheets(Sheets.Count).Name = S

R.Resize(l, R.Columns.Count).Copy 'копируем заголовок ActiveSheet.Paste k = 2

For i = 0 To ListBoxl.ListCount - 1 If ListBoxl.Selected(i) Then

For j = 1 To ListBoxl.ColumnCount

Cells(k, j) = ListBoxl.List(i, j - 1)

Next

k = k + 1 End If Next End If End Sub

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >