- •Л.Н. Лядова, н.В. Фролова, в.В. Ланин, е.Б. Замятина, м.А. Плаксин, б.А. Ермолаев
- •Часть 2. Основы офисного программирования
- •Оглавление
- •Глава 6. Использование Win32 api 113
- •Глава 7. Использование шаблонов и надстроек 118
- •Глава 8. Разработка приложений с помощью Excel 122
- •Глава 9. Разработка приложений с помощью Word 223
- •Глава 10. Использование Automation при интегрировании компонентов Microsoft Office 256
- •Глава 11. Организация доступа к внешним данным 279
- •Глава 12. Общие рекомендации по разработке приложений 297
- •Глава 13. Разработка справочной системы 298
- •Глава 14. Дополнительные рекомендации 301
- •Пояснительная записка
- •Уровень предварительной подготовки слушателей
- •Образовательные цели и задачи
- •Знания и навыки, получаемые в ходе изучения курса
- •Содержание занятий
- •Вопросы для самостоятельного изучения
- •Содержание лабораторных работ
- •Итоговые работы
- •Введение
- •Глава 1.Общая характеристика возможностей vba
- •Глава 2.Основные принципы разработки приложений
- •Глава 3.Основные правила разработки интерфейса
- •Глава 4.Visual Basic для приложений
- •Глава 5.Введение в язык и редактор Visual Basic
- •5.1.Окно Редактора Visual Basic
- •5.2.Основные правила записи программ на vba
- •5.2.1. Описания в программах на языке vba
- •5.2.2. Структуризация программ vba и правила записи кода процедур
- •5.2.3. Использование параметров
- •5.2.4. Типы данных vba
- •5.2.5. Описания переменных
- •5.2.6. Объекты в программах на vba и объектные переменные
- •5.2.7. Создание объектов пользователя
- •5.2.8. Описание и использование констант
- •5.2.9. Массивы в vba
- •5.2.10. Описание типов данных пользователя
- •5.2.11. Запись выражений на vba
- •5.2.12. Рекурсивные вычисления
- •5.2.13. Процедуры-подпрограммы
- •5.2.14. Процедуры-функции
- •5.2.15. Процедуры-свойства
- •5.2.16. Создание процедур
- •5.2.17. Управляющие структуры vba и события
- •5.3.Запуск программ
- •5.4.Отладка программ
- •5.5.Обработка ошибок
- •5.6.Преобразования типов
- •5.7.Функции для работы с датами и временем
- •5.8.Управление файлами
- •5.9.Функции проверки
- •5.10.Функции работы со строками
- •5.11.Взаимодействие с пользователем
- •5.12.Пользовательские формы и диалоговые окна
- •5.13.Создание пользовательских меню и панелей инструментов
- •5.14.Разработка контекстного меню
- •5.15.Открытие проектов, экспорт и импорт
- •Глава 6.Использование Win32 api
- •Глава 7.Использование шаблонов и надстроек
- •Глава 8.Разработка приложений с помощью Excel
- •8.1.Иерархия объектов Excel
- •8.2.Обзор основных объектов Excel
- •8.2.1. Объект Application
- •8.2.2. Объект Workbook
- •8.2.3. Объект WorkSheet
- •8.2.4. Объект Range
- •8.2.5. Графические объекты
- •8.2.6. Элементы управления и обработка событий
- •8.3.Представление данных и вычисления в таблицах Excel
- •8.3.1. Ссылки на ячейки рабочих листов Excel
- •8.3.2. Работа с формулами
- •8.3.3. Использование функций
- •8.3.4. Создание пользовательских функций рабочего листа
- •8.3.5. Массивы Excel
- •8.3.6. Определение связей между таблицами
- •8.3.7. Консолидация данных
- •8.3.8. Форматирование данных в таблицах
- •8.4.Анализ данных и подведение итогов
- •8.4.1. Создание сводных таблиц
- •8.4.2. Подведение промежуточных итогов
- •8.4.3. Определение частичных сумм
- •8.4.4. Создание диаграмм
- •8.4.5. Работа со структурой данных
- •8.5.Подбор параметров и поиск решения
- •8.6.Использование сценариев
- •8.7.Поиск и отбор данных в таблицах Excel
- •8.7.1. Использование автофильтра
- •8.7.2. Работа с расширенным фильтром
- •8.7.3. Поиск данных по подписям строк и столбцов
- •8.8.Упорядочение данных в таблицах
- •8.9.Защита приложений Excel
- •8.9.1. Защита от ошибок при вводе данных
- •8.9.2. Защита данных от несанкционированного доступа
- •Глава 9.Разработка приложений с помощью Word
- •9.1.Модель объектов Word
- •9.1.1. Объект Document
- •9.1.2. Другие дочерние объекты приложения Word
- •9.2.Работа с полями
- •9.3.Переменные документа
- •9.4.Использование формул в документах Word
- •9.5.Использование элементов управления в документах Word
- •9.6.Создание шаблонов документов на основе таблиц
- •9.7.Защита документов Word и кода
- •Глава 10.Использование Automation при интегрировании компонентов Microsoft Office
- •10.1.Технология ActiveX
- •10.2.Компонентная модель объектов, внедрение и связывание
- •10.3.Создание объектов Automation
- •10.4.Получение доступа к объекту
- •10.5.Пример вычислений в Access с помощью Excel
- •10.6.Управление связанными и внедренными объектами с помощью программного кода
- •Глава 11.Организация доступа к внешним данным
- •11.1.Доступ к данным из клиентских приложений
- •11.2.Интерфейс odbc
- •11.3.Использование dao для доступа к данным
- •11.3.1. Модель объектов dao
- •11.3.2. Создание рабочей области и открытие источника данных
- •11.3.3. Исследование структуры таблиц бд
- •11.3.4. Операции над данными
- •11.4.Интеграция данных и работа в сети
- •11.4.1. Доступ к данным Excel из субд Access
- •11.5.Выбор метода доступа к данным
- •Глава 12.Общие рекомендации по разработке приложений
- •Глава 13.Разработка справочной системы
- •13.1.Использование всплывающих подсказок
- •13.2.Контекстная справка «Что это такое?»
- •13.3.Подготовка файла справки
- •Глава 14.Дополнительные рекомендации Установка приложения
- •14.1.Повышение эффективности работы приложения
- •Приложение 1. Система автоматизации подготовки документов на основе пакета Microsoft Office
- •Требования к системе Office case
- •Интеллектуальность документа
- •Однократный ввод данных и их совместное использование
- •Дружественный интерфейс – «ориентация на человека»
- •Мобильность
- •Независимость от версии Microsoft Office
- •Поддержка языка разметки документов xml
- •Общий сценарий использования
- •Структура Office case
- •Структура скрытого раздела документа
- •В. Таблица ограничений
- •Подсистемы программного проекта документа Менеджер закладок
- •Менеджер классификаторов
- •Подсистема управления интерфейсом пользователя
- •Подсистема контроля данных
- •Подсистема информационного обмена
- •Дизайнер системы документов
- •Редактор классификаторов
- •Редактор правил
- •Редактор закладок
- •Редактор блоков данных
- •Пример применения Office case Постановка задачи
- •Реализация Документы «Подсистемы автоматизации подготовки отчетов»
- •Требования к квалификации пользователей
- •Установка приложения и подготовка к работе
- •Интерфейс первичных документов
- •Интерфейс сводных документов
- •Приложение 2. Автоматизированное рабочее место «Оператор автозаправочной станции»
- •Разработка структуры рабочей книги
- •Настройка пользовательского интерфейса
- •Разработка экранных форм
- •Приложение 3. Автоматизация заполнения бланка с помощью программы текстового процессора Word Постановка задачи
- •Разработка документа
- •Разработка экранной формы
- •Список литературы
Разработка экранных форм
Следующим шагом в построении нашего приложения будет разработка экранных форм и программного кода, поддерживающего их функционирование. Использование экранных форм дает значительные преимущества. Работая с формой, пользователь не может нарушить целостность данных, изменить структуру таблиц. Также при использовании форм возможна, интерактивная проверка введенных пользователем, можно организовать проверку условий любой сложности. Применение специальных элементов управления позволяет упростить ввод данных.
Добавим форму «Отпускные цены», служащую для изменения текущих отпускных цен на топлива. Разместите элементы управления как показано на рисунке ниже. При нажатии на кнопку «Изменить», прежде всего, надо организовать проверку введенных пользователем данных, затем сохранить их в диапазоне rgFuelPrice.
Рис. ХХ. Экранная форма «Отпускные цены»
Private Sub cmdChange_Click()
If Not IsNumeric(txtPrice76.Text) Then
SetFocusToError txtPrice76
Exit Sub
End If
If Not IsNumeric(txtPrice92.Text) Then
SetFocusToError txtPrice92
Exit Sub
End If
If Not IsNumeric(txtPrice95.Text) Then
SetFocusToError txtPrice95
Exit Sub
End If
If Not IsNumeric(txtPriceDT.Text) Then
SetFocusToError txtPriceDT
Exit Sub
End If
With Worksheets("Главный").Range("rgFuelPrice")
.Cells(1, 1).Value = CDbl(txtPrice76.Text)
.Cells(2, 1).Value = CDbl(txtPrice92.Text)
.Cells(3, 1).Value = CDbl(txtPrice95.Text)
.Cells(4, 1).Value = CDbl(txtPriceDT.Text)
End With
End Sub
Public Sub SetFocusToError(ctrl As Control)
ctrl.SelStart = 0
ctrl.SelLength = Len(ctrl.Text)
ctrl.SetFocus
End Sub
С помощью встроенной функции IsNumeric мы производим проверку, можно ли рассматривать введенной значение как число. Если нет, то производится вызов специально разработанной функции SetFocusToError, которая устанавливает фокус на элемент управления с неверным значением. Также в код необходимо добавить вывод на экран сообщения об ошибке c помощью функции MsgBox. При проверке всех значений данные сохраняются на рабочем листе в требуемом диапазоне.
Добавим еще один обработчик события для данной формы: при открытии формы необходимо загрузить текущие значения цен в элементы управления.
Private Sub UserForm_Initialize()
With Worksheets("Главный").Range("rgFuelPrice")
txtPrice76.Text = .Cells(1, 1).Text
txtPrice92.Text = .Cells(2, 1).Text
txtPrice95.Text = .Cells(3, 1).Text
txtPriceDT.Text = .Cells(4, 1).Text
End With
End Sub
Подобным образом строятся остальные формы изменения данных на рабочих листах, основные действия, которые необходимо реализовать на форме: загрузка текущих данных, контроль данных и сохранение новых данных.
Экранная форма «Продажа» вызывается при нажатии на одну из восьми кнопок. За каждой их колонок закреплен определенный вид топлива. При продаже топлива должна измениться информация в таблице «Резервуары», находящаяся на втором листе. С данной таблицей связана диаграмма, таким образом, оператор сможет визуально контролировать объем топлива, находящегося резервуаров. Форма позволяет ввести необходимое клиенту количество либо в литрах, в таком случае автоматически вычисляется цена, либо указать сумму, на которую он совершает покупку, в таком случае количество литров также вычисляется автоматически. Перед продажей необходимо проверить условие: есть ли в резервуаре необходимое количество топлива.
Рис. ХХ. Экранная форма «Продажа»
На форме «Получение бензина», показанной ниже, располагаются выпадающий список и текстовое поле. При доставке бензина соответствующего типа обновляется информация в таблице «Резервуары». При получении топливо необходимо проверить, есть ли в резервуаре достаточно свободного места.
Рис. ХХ. Экранная форма «Получение бензина»
Разработаем экранные формы для работы с информацией о сотрудниках.
Форма «Персонал» содержит элемент управления ListBox и четыре командные кнопки. Для того, чтобы список отображал несколько колонок необходимо изменить свойство ColumnCount, присвоим данному свойству значение 7. Для настройки ширины столбцов используется свойство ColumnWidths, в нашем случае установим значение «49.95 pt;35 pt;49.95 pt;45 pt;67.95 pt;60 pt;40 pt». Для отображения заголовков столбцов необходимо установить свойство ColumnHeads в True.
Рис. ХХ. Экранная форма «Персонал»
Команды «Добавить», «Изменить» и «Удалить» используются для изменения данных на листе «Персонал». Таким образом, нам необходимо программно добавлять, редактировать и удалять строки таблицы. Программный код формы представлен ниже.
Public Sub UpdateListRowSource()
Dim ws As Worksheet
Set ws = Worksheets("Персонал")
lstEmloyees.RowSource = "'Персонал'!A2:G" + _
CStr(ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row)
End Sub
Private Sub cmdAdd_Click()
frmEmployee.Show
If frmEmployee.Tag = "OK" Then
Dim NewRow As Integer
Dim r As Range, ws As Worksheet
Set ws = Worksheets("Персонал")
Set r = ws.UsedRange.SpecialCells(xlCellTypeLastCell)
NewRow = r.Row + 1
SaveDataToRow NewRow
UpdateListRowSource
End If
End Sub
Private Sub SaveDataToRow(RowIndex As Integer)
With frmEmployee
Dim ws As Worksheet
Set ws = Worksheets("Персонал")
ws.Cells(RowIndex, 1).Value = .txtLastname.Text
ws.Cells(RowIndex, 2).Value = .txtName.Text
ws.Cells(RowIndex, 3).Value = .txtPatronymic.Text
ws.Cells(RowIndex, 4).Value = .cmbSex.Text
ws.Cells(RowIndex, 5).Value = .dtpDateOfBirth.Value
ws.Cells(RowIndex, 6).Value = .cmbAppointment.Text
ws.Cells(RowIndex, 7).Value = .txtGrade.Text
End With
End Sub
Private Sub cmdClose_Click()
Me.Hide
End Sub
Private Sub cmdEdit_Click()
Dim RowIndex As Integer, ws As Worksheet
RowIndex = lstEmloyees.ListIndex + 2
Set ws = Worksheets("Персонал")
With frmEmployee
.txtLastname.Text = ws.Cells(RowIndex, 1).Value
.txtName.Text = ws.Cells(RowIndex, 2).Value
.txtPatronymic.Text = ws.Cells(RowIndex, 3).Value
.cmbSex.Text = ws.Cells(RowIndex, 4).Value
.dtpDateOfBirth.Value = ws.Cells(RowIndex, 5).Value
.cmbAppointment.Text = ws.Cells(RowIndex, 6).Value
.txtGrade.Text = ws.Cells(RowIndex, 7).Value
.Show vbModal
End With
SaveDataToRow RowIndex
End Sub
Private Sub cmdDelete_Click()
If lstEmloyees.ListIndex <> -1 Then
Dim RowIndex As Integer, ws As Worksheet
RowIndex = lstEmloyees.ListIndex + 2
Set ws = Worksheets("Персонал")
ws.Rows(RowIndex).Delete
UpdateListRowSource
End If
End Sub
Private Sub UserForm_Initialize()
UpdateListRowSource
End Sub
Процедура UpdateListRowSource используется для обновления свойства RowSource списка, при добавлении и удалении строк адрес связанного диапазона необходимо обновить. Строка
ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
используется для быстрого поиска первой пустой строки. Для поиска первой пустой строки можно применить и другие методы, например, просмотреть все строки, начиная с первой, пока не будет найдена первая пустая строка. Однако, при больших объемах данных па поиск строки будет тратиться продолжительное время.
При добавлении новой строки отображается форма для ввода данных, затем с помощью рассмотренного выше метода находится первая пустая строка и с помощью специально разработанной процедуры SaveDataToRow данные с формы переносятся в таблицу. После добавления строки обновляется свойство RowSource списка, и в нем появляются данные о новом работнике.
Индекс редактируемой строки в таблице определяется с помощью индекса выделенного в данный момент элемента списка, после чего данные загружаются в форму. После изменения данных обновление свойства RowSource списка не требуется, т.к. адрес диапазона не изменился. Список на форме будет обновлен автоматически.
При удалении строки с помощью метода Delete из коллекции Rows удаляется строка с указанным индексом. После чего необходимо изменить свойство RowSource списка.
Добавьте новую форму «Работник». Разместите на ней три текстовых поля для фамилии, имени и отчества работника. Для выбора пола и должности работника добавьте два списка. Первый список мы программно заполним данными в обработчике события инициализации формы. Свойству RowSource второго списка присвойте адрес диапазона, содержащий список должностей (например, 'Данные'!B3:B6).
Для ввода даты будем использовать специальный элемент управления Microsoft Date and Time Picker Control. Данный элемент управления предлагает пользователю удобный способ работы с датами. По умолчанию данного элемента нет на панели элементов управления (Toolbox), поэтому перед использованием его необходимо туда вынести. Для чего в контекстном меню панели элементов управления выберите пункт «Additional Controls…», затем в списке «Available Controls» выберите пункт Date and Time Picker Control 6.0. На панели элементов управления появится новая пиктограмма, соответствующая добавленному элементу управления.
Рис. ХХ. Экранная форма для создания/изменения данных сотрудника
Для выбора разряда работника будем использовать элемент управления SpinButton, позволяющий выбирать числовые значения из заданного диапазона с указанным шагом. Разместите на форме текстовое поле, а рядом с ним элемент управления SpinButton, установите свойство Min равным 1, а свойство Max - 5. Программный код формы представлен ниже.
Option Explicit
Public Mode As Integer
Private Sub cmdCancel_Click()
Me.Tag = "Cancel"
Me.Hide
End Sub
Private Sub spnGrade_Change()
txtGrade.Value = spnGrade.Value
End Sub
Private Sub UserForm_Initialize()
cmbSex.AddItem "Мужской"
cmbSex.AddItem "Женский"
cmbSex.ListIndex = 0
End Sub
Private Sub cmdSave_Click()
Me.Tag = "OK"
If Trim(txtLastname.Text) = "" Then
MsgBox "Ошибка при заполнении поля: Фамилия."
Me.Tag = "Cancel"
End If
If Trim(txtName.Text) = "" Then
MsgBox "Ошибка при заполнении поля: Имя."
Me.Tag = "Cancel"
End If
If Trim(txtPatronymic.Text) = "" Then
MsgBox "Ошибка при заполнении поля: Отчество."
Me.Tag = "Cancel"
End If
Me.Hide
End Sub
Public Sub SetFocusToError(ctrl As Control)
ctrl.SelStart = 0
ctrl.SelLength = Len(ctrl.Text)
ctrl.SetFocus
End Sub
