- •1.Введение в программирование на vba Понятие объекта
- •Среда программирования
- •Типы данных
- •Переменные
- •Стандартные элементы управления. Объект Форма(UserForm) и элемент Кнопка(CommandButton)
- •Элемент Кнопка
- •Стандартные окна ввода и вывода сообщений
- •Окно сообщения
- •Окно ввода
- •Практические задания Задание 1.1
- •Задание 1.2
- •Задание 1.3
- •Задание 1.4
- •2.Реализация линейных алгоритмов Программирование арифметических выражений
- •Математические операции
- •Стандартные математические функции
- •Элементы Надпись(Label) и Поле(TextBox) Элемент Поле
- •Элемент Надпись
- •Практические задания Задание 2.1
- •Задание 2.2
- •Задание 2.3
- •3.Реализация алгоритмов с условиями Программирование условий Операторы сравнения
- •Логические операции
- •Инструкция If…Then…Else
- •Инструкция Select Case
- •Функции, используемые при программировании условий
- •Элементы Рисунок(Image), Счетчик и Полоса прокрутки(ScrollBar) Элемент Рисунок
- •Элемент Счетчик
- •Элемент Полоса прокрутки
- •Практические задания Задание 3.1
- •Задание 3.2
- •З адание 3.3
- •4.Реализация циклических алгоритмов Программирование циклов Цикл For…Next
- •Цикл Do While…Loop / Do…Loop While
- •Цикл Do Until...Loop / Do…Loop Until
- •Практические задания Задание 4.1
- •Задание 4.2
- •5.Использование процедур и функций в программах на vba Процедуры и функции
- •Элементы Рамка(Frame), Флажок(CheckBox), Переключатель(OptionButton), Выключатель(ToggleButton) Элемент Рамка
- •Элемент Флажок
- •Элемент Выключатель
- •Элемент Переключатель
- •Практические задания Задание 5.1
- •6.Использование структурированных типов данных на примере массивов Понятие массива. Работа с массивами
- •Практические задания Задание 6.1
- •Практические задания Задание 7.1
- •Задание 7.2
- •Задание 7.3
- •Задание 7.4
- •Задание 7.5
- •Задание 7.6
- •Задание 7.7
- •Задание 7.8
- •8.Работа с макросами в ms Excel Основные объекты ms Excel
- •Понятие макроса. Создание, редактирование, выполнение макросов
- •Цикл For Each
- •Инструкция With
- •Практические задания Задание 8.1
- •Задание 8.2
- •Задание 8.3
- •9.Создание приложений, управляемых с помощью диалоговых окон Элементы Поле со списком (ComboBox), Список (ListBox)
- •Практические задания Задание 9.1
- •Задание 9.2
- •10.Рекомендуемая литература
Задание 9.2
Создадим форму, которая позволяет редактировать имеющуюся на листе таблицу: добавлять, удалять, изменять значения строк (записей). Для просмотра таблицы в форме имеется элемент ListBox. Свойство MultiSelect этого элемента рано 2, что позволяет выделять любое количество записей. Кнопка «Удалить» предназначена для удаления выделенных записей. Кнопка «Новая запись» позволяет добавить новую запись перед текущей, причем одновременно в элемент ListBox и на рабочий лист. Кнопка «Изменить» служит для редактирования текущей записи. В этом случае выводится другая форма (она приведена ниже), на которой имеются элементы, показывающие значения полей. Кнопка «Выход», как обычно, используется для завершения работы.
Далее приведен текст модуля этой формы. Обратите внимание, что переменные в начале модуля описаны как Public. Это нужно для того, чтобы мы могли их использовать в другом модуле. Для загрузки элементов в список применен метод AddItem. Свойство RowSource в данном случае использовать нельзя, так как тогда будет невозможно удалять элементы списка. Удаление ячеек рабочего листа выполняется со сдвигом оставшихся ячеек вверх, при этом удаляются только те ячейки, которые относятся к таблице.
'Модуль UserForm2
Public MyRng As Range
Public RMin As Integer, RMax As Integer
Public CMin As Integer, CMax As Integer
Public CCount As Integer
Public NewI As Boolean
Private Sub CommandButton1_Click() 'Кнопка "Удалить"
For i = ListBox1.ListCount - 2 To 0 Step -1
If ListBox1.Selected(i) Then
'Удаляем элементы из списка
ListBox1.RemoveItem (i)
'удаляем элементы с рабочего листа
Range(Cells(RMin + i, CMin), _
Cells(RMin + i, CMax)).Delete Shift:=xlUp
End If
Next i
End Sub
Private Sub CommandButton2_Click() 'Кнопка "Новая запись"
NewI = True
UserForm3.Show
End Sub
Private Sub CommandButton3_Click() 'Кнопка "Изменить"
NewI = False
UserForm3.Show
End Sub
Private Sub CommandButton4_Click() 'Кнопка "Выход"
UserForm2.Hide
End Sub
Private Sub UserForm_Initialize()
Set MyRng = ActiveCell.CurrentRegion.Cells
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
ListBox1.ColumnCount = CCount
'Загружаем список
For i = RMin To RMax + 1
ListBox1.AddItem Cells(i, CMin)
ListBox1.List(i - RMin, 1) = Cells(i, CMin + 1)
ListBox1.List(i - RMin, 2) = Cells(i, CMin + 2)
ListBox1.List(i - RMin, 3) = Cells(i, CMin + 3)
Next
ListBox1.ListIndex = 0
ListBox1.MultiSelect = fmMultiSelectMulti
End Sub
Эта форма используется для ввода в таблицу новой записи и для редактирования существующих. На форме имеются 4 элемента Надпись, 4 текстовых поля и 2 кнопки.
В приведенном тексте модуля обратите внимание на то, как можно сослаться на элементы и переменные, находящиеся в другом модуле. Значение переменной NewI определяется в модуле UserForm2. Оно устанавливает вид операции (True – добавить запись, False – редактировать запись). Тексты надписей (названия полей) берутся с рабочего листа при загрузке формы. При добавлении записи в таблицу сначала вставляются новые ячейки, при этом существующие сдвигаются вниз, а затем в эти ячейки заносится информация.
'Модуль UserForm3
Dim n As Integer
Dim RMin As Integer
Dim CMin As Integer, CMax As Integer
Private Sub CommandButton1_Click()
'Добавляем или редактируем запись в элементе ListBox1
If UserForm2.NewI Then
UserForm2.ListBox1.AddItem TextBox1.Text, n
Else
UserForm2.ListBox1.List(n, 0) = TextBox1.Text
End If
UserForm2.ListBox1.List(n, 1) = TextBox2.Text
UserForm2.ListBox1.List(n, 2) = TextBox3.Text
UserForm2.ListBox1.List(n, 3) = TextBox4.Text
'Добавляем или редактируем запись на рабочем листе
If UserForm2.NewI Then
Range(Cells(RMin + n, CMin), _
Cells(RMin + n, CMax)).Insert Shift:=xlDown
End If
Cells(RMin + n, CMin) = TextBox1.Text
Cells(RMin + n, CMin + 1) = TextBox2.Text
Cells(RMin + n, CMin + 2) = TextBox3.Text
Cells(RMin + n, CMin + 3) = TextBox4.Text
UserForm3.Hide
End Sub
Private Sub CommandButton2_Click()
UserForm3.Hide
End Sub
Private Sub UserForm_Activate()
n = UserForm2.ListBox1.ListIndex
If UserForm2.NewI Then
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
Else
TextBox1.Text = Cells(RMin + n, CMin)
TextBox2.Text = Cells(RMin + n, CMin + 1)
TextBox3.Text = Cells(RMin + n, CMin + 2)
TextBox4.Text = Cells(RMin + n, CMin + 3)
End If
End Sub
Private Sub UserForm_Initialize()
n = UserForm2.ListBox1.ListIndex
RMin = UserForm2.RMin
CMin = UserForm2.CMin: CMax = UserForm2.CMax
Label1.Caption = Cells(RMin - 1, CMin)
Label2.Caption = Cells(RMin - 1, CMin + 1)
Label3.Caption = Cells(RMin - 1, CMin + 2)
Label4.Caption = Cells(RMin - 1, CMin + 3)
End Sub