Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metod_VBA_1.doc
Скачиваний:
37
Добавлен:
03.05.2019
Размер:
1.01 Mб
Скачать

Практические задания Задание 9.1

Поместите на рабочий лист таблицу:

A

B

C

D

1

ФИО

Отдел

Должность

Стаж

2

Иванов И.И.

1

нач. отдела

19

3

Васильева В.В.

1

менеджер

11

4

Петров П.П.

2

нач. отдела

10

5

Коваль К.К.

2

рук. группы

5

6

Акимов А.А.

3

менеджер

8

7

Белов Б.Б.

2

менеджер

3

8

Волков В.В.

3

нач. отдела

12

9

Голиков Г.Г.

2

менеджер

7

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

Операция "Загрузить все данные" предполагает, что все строки таблицы за исключением заголовка и все столбцы помещаются в список сотрудников, имеющийся на форме (элемент ListBox1).

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

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

Операция "Таблица из выделенных" формирует на новом листе таблицу точно такой же структуры, содержащую выделенные строки списка сотрудников. Чтобы в списке можно было выделять несколько произвольных элементов, значение свойства MultiSelect у списка должно быть равно 1.

Кроме элемента ListBox на форме имеются 3 элемента ComboBox. Они содержат список отделов, список должностей и список операций. Выбранная операция выполняется при нажатии на кнопку «Выполнить».

Далее приведен текст модуля формы. Разберитесь, как работает программа. Особое внимание обратите на реализацию работы со списками. Значения всех списков формируются по-разному. Это сделано специально, чтобы показать имеющиеся возможности. Узнать номер выбранного элемента списка можно, используя свойство ListIndex. Для анализа выбранной операции в примере использована инструкция Select Case. Проверка условия запрограммирована в виде специальной функции Условие. Процедура НоваяТаблица добавляет в рабочую книгу новый рабочий лист и копирует на него шапку таблицы.

Dim MyRng As Range

Dim RMin As Integer, RMax As Integer

Dim CMin As Integer, CMax As Integer

Dim CCount As Integer

Dim MySheet As Worksheet

Dim NewSheet As Worksheet

Private Sub CommandButton1_Click()

Select Case ComboBox3.ListIndex

Case 0 'Загрузить все данные

MySheet.Activate

ListBox1.RowSource = Range(Cells(RMin, CMin), _

Cells(RMax, CMax)).Address

ListBox1.ListIndex = 0

Case 1 'Загрузить с учетом условий

ListBox1.RowSource = ""

j = 0

For i = RMin To RMax

If Условие(MySheet.Cells(i, 2), MySheet.Cells(i, 3), _

MySheet.Cells(i, 4)) Then

ListBox1.AddItem MySheet.Cells(i, 1)

ListBox1.List(j, 1) = MySheet.Cells(i, 2)

ListBox1.List(j, 2) = MySheet.Cells(i, 3)

ListBox1.List(j, 3) = MySheet.Cells(i, 4)

j = j + 1

End If

Next

ListBox1.ListIndex = 0

Case 2 'Hовая таблица с учетом условий

НоваяТаблица

j = RMin - 1

For i = RMin To RMax

If Условие(MySheet.Cells(i, 2), MySheet.Cells(i, 3), _

MySheet.Cells(i, 4)) Then

j = j + 1

For k = CMin To CMax

NewSheet.Cells(j, k) = MySheet.Cells(i, k)

Next k

End If

Next

Case 3 'Таблица из выделенных

НоваяТаблица

j = RMin - 1

For i = 0 To ListBox1.ListCount - 1

If ListBox1.Selected(i) Then

j = j + 1

For k = CMin To CMax

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

Next k

End If

Next i

End Select

End Sub

Private Sub UserForm_Initialize()

Dim Отделы(3) As String

Set MyRng = ActiveCell.CurrentRegion.Cells

Set MySheet = ActiveSheet

RMin = MyRng.Rows(1).Row + 1

RMax = MyRng.Rows(MyRng.Rows.Count).Row

CMin = MyRng.Columns(1).Column

CMax = MyRng.Columns(MyRng.Columns.Count).Column

CCount = MyRng.Columns.Count

'Для заполнения списка используется свойство RowSource

ListBox1.ColumnCount = CCount

ListBox1.RowSource = _

Range(Cells(RMin, CMin), Cells(RMax, CMax)).Address

ListBox1.ListIndex = 0

ListBox1.MultiSelect = fmMultiSelectMulti

'Для заполнения списка используется массив,

'созданный в программе

Отделы(0) = "все": Отделы(1) = "1"

Отделы(2) = "2": Отделы(3) = "3"

ComboBox1.List = Отделы

ComboBox1.ListIndex = 0

'Для заполнения списка используется метод AddItem

ComboBox2.AddItem "все"

For i = RMin To RMax

НетДолжности = True

For j = 0 To ComboBox2.ListCount - 1

If ComboBox2.List(j) = Cells(i, 3) Then

НетДолжности = False: Exit For

End If

Next j

If НетДолжности Then ComboBox2.AddItem Cells(i, 3)

Next

ComboBox2.ListIndex = 0

'Для заполнения списка используется массив фиксированных значений

ComboBox3.Style = fmStyleDropDownList

ComboBox3.List = Array("Загрузить все данные", _

"Загрузить с учетом условий", "Новая таблица с учетом условий", _

"Таблица из выделенных")

ComboBox3.ListIndex = 0

End Sub

Private Function Условие(Отдел As String, Должность As String, Стаж As Single)

If TextBox1.Text = "" Then СтажМ = 0 Else СтажМ = CSng(TextBox1.Text)

If TextBox2.Text = "" Then СтажБ = 0 Else СтажБ = CSng(TextBox2.Text)

Условие = ((ComboBox1.Value = "все") Or (ComboBox1.Value = Отдел)) And _

((ComboBox2.Value = "все") Or (ComboBox2.Value = Должность)) And _

((TextBox1.Text = "") Or (Стаж < СтажМ)) And _

((TextBox2.Text = "") Or (Стаж > СтажБ))

End Function

Public Sub НоваяТаблица()

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

Sheets(Worksheets.Count).Name = InputBox("Введите имя листа")

Set NewSheet = Sheets(Worksheets.Count)

n = RMin - 1

For k = CMin To CMax

NewSheet.Cells(n, k) = MySheet.Cells(n, k)

NewSheet.Columns(k).ColumnWidth = MySheet.Columns(k).ColumnWidth

Next k

End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]