Опубликован: 13.09.2006 | Уровень: для всех | Доступ: свободно
Лекция 7:

Создание интерактивных офисных документов в Excel

Чистка полей

Чтобы закончить рассмотрение вопросов, связанных с приданием интерактивности той части документа, где речь идет о реквизитах заказчика, нам осталось рассмотреть самую простую задачу - чистки соответствующих полей документа. Эта задача является частью более общей задачи чистки всех полей документа, но она может возникать и в процессе работы с разделом "Реквизиты заказчика". Понятно, что с программистской точки зрения особых проблем здесь возникать не может. Тем не менее, приведу текст обработчика события Click командной кнопки "Очистить":

Private Sub CommandButton4_Click()
	'Чистка полей бланка с реквизитами заказчика
	ClearCustomerFields
End Sub	
Public Sub ClearCustomerFields()
	'Чистка полей бланка с реквизитами заказчика
	Dim curField As Range
	Set curField = Range("D19:J22")
	curField.ClearContents
	Set curField = Range("D21")
	curField = "tel:			Email: "
End Sub

Единственное, о чем стоит упомянуть, это то, что при чистке сохраняется формат, который следует выдерживать при задании новой информации в поле, отведенном для указания телефона и Email адреса.

Раздел "Сотрудники"

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

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

Для реализации этого подхода я добавил в документ элемент управления класса Combobox, предназначенный для хранения списка сотрудников. Сразу же скажу еще об одном элементе управления, добавленном мною в документ, - класса Label, метке или надписи, предназначенной для хранения текущей даты. Понятно, что без текущей даты не обходится ни один из документов, и эта дата должна создаваться автоматически, используя соответствующую встроенную функцию Date, возвращающую текущую дату в нужном формате. Конечно в документах, создаваемых на основе Excel, для хранения даты можно использовать любую из ячеек рабочего листа, и я применю этот подход чуть позже при формировании листа печати. Сейчас же хочу продемонстрировать использование различных элементов управления, и потому я предпочел для отображения даты ввести отдельный элемент управления. Взгляните, как выглядит интерфейс этой части документа с добавленными элементами управления:

Документ с элементами управления для хранения текущей даты и списка сотрудников

увеличить изображение
Рис. 7.7. Документ с элементами управления для хранения текущей даты и списка сотрудников

Добавленным элементам управления я дал соответственно имена - AccountDate и ListOfTeam, и установил подходящее форматирование и другие свойства этих элементов. Останавливаться на этих деталях не буду, отмечу только, что для списка свойство Style я установил, равным 0, что запрещает вносить данные в поле ввода списка в момент работы с документом, - разрешен только выбор из заранее сформированного списка.

Главный вопрос при работе с этими элементами, - как и когда задавать текущую дату и формировать список фамилий на основе сведений из базы данных. Вопрос "когда" решается очевидным способом, - разумнее всего инициализацию отдельных элементов документа проводить в момент общей инициализации, то есть в момент открытия документа. На вопрос "как" проще всего ответить, приведя программный код. Поскольку, благодаря принятой стратегии построения обработчиков событий, текст их остается неизменным, то мне достаточно показать дополнения, сделанные в процедуре InitAccount, вызываемой в обработчике события Open нашего документа:

Public Sub InitAccount()
	'Установить соединение с базой данных
	CreateConnection
	'Конфигурирование команды
	ConfigCommand
	'Очистить поля бланка
	ClearFields
	'Задать дату и создать список сотрудников
	CreateListOfTeam
End Sub

Сделанные изменения подсвечены, и, как видите, они состоят из вызова процедуры CreateListOfTeam, текст которой сейчас приведу:

Public Sub CreateListOfTeam()
	'Задать дату и создать список сотрудников
	Dim myDate As Object
	Dim myCombo As ComboBox
	'Установить дату
	Set myDate = ThisWorkbook.Worksheets(1).OLEObjects("AccountDate").Object
	myDate.Caption = Date
	'Создать список сотрудников
	Set myCombo = ThisWorkbook.Worksheets(1).OLEObjects("ListOfTeam").Object
	Cmd1.CommandText = "Select [ФИО] From [Сотрудники]"
	Set Rst1 = Cmd1.Execute
	With Rst1
		.MoveFirst
		Do While Not .EOF
			myCombo.AddItem .Fields(0)
			.MoveNext
		Loop
	End With
End Sub

Приведу краткие комментарии:

  • Оба добавленных в документ элемента управления входят в коллекцию OLEObjects того рабочего листа, на котором расположены элементы. Добраться до них в коллекции можно по данным им именам. Чтобы работать с ними, как с объектами, я создал в процедуре два объекта myDate и myCombo соответствующих классов.
  • Дату я установил, задав свойство Caption объекта myDate, вызвав функцию Date в качестве значения этого свойства.
  • Формирование списка по информации базы данных рассматривалось уже неоднократно, поэтому ничего принципиально нового нет - формируется текст команды, позволяющий читать данные из таблицы "Сотрудники", команда выполняется и создается набор записей. Обычная схема прохождения по набору записей позволяет сформировать по значениям полей записи элементы списка объекта myCombo. Результаты работы можно видеть на рис. 7.7.

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

Раздел "Заказы"

Интерактивность, которую я добавлю в этом разделе документа, должна обеспечить, по крайней мере, решение двух основных задач:

  • Сформировать простым и естественным способом заказ на нужные пользователю товары. При этом, естественно, предполагается, что пользователь решает только "творческие" задачи - выбирает товары из списка, задает нужное ему количество товара. Все же вычисления производятся автоматически, и все поля, всюду, где это можно, также заполняются автоматически.
  • Сохранить сформированный заказ в базе данных.

Займемся этими задачами. И первое, с чего начнем, добавим в этот раздел документа три инструментальные кнопки с надписями "Сформировать заказ", "Сохранить заказ", "Очистить Заказ" и именами - "FormOrder", "SaveOrder", "ClearOrder". Вот как выглядит интерфейс документа с добавленными кнопками:

Командные кнопки в разделе "Заказы"

увеличить изображение
Рис. 7.8. Командные кнопки в разделе "Заказы"
Ольга Гафарова
Ольга Гафарова
Непонятен ход решения задачи
Серегй Лушников
Серегй Лушников
Может ли объект Recordset быть потомком объекта Record?
Геннадий Шестаков
Геннадий Шестаков
Беларусь, Орша
Светлана Ведяева
Светлана Ведяева
Россия, Саратов