Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 5134 / 388 | Оценка: 4.23 / 3.83 | Длительность: 28:12:00
Специальности: Программист, Менеджер
Лекция 7:

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

Подготовка документа к печати

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

Я называю электронный документ интерактивным, - находящимся в интерактивной форме, если он содержит элементы управления и, по крайней мере, частично, заполняется автоматически. Электронный документ находится в бумажной форме, если он элементов управления не содержит и, следовательно, заполняется вручную. Может быть много причин, по которым иногда желательно преобразовать документ из интерактивной в бумажную форму. По-видимому, главная из них состоит в том, что бумажная форма, как правило, предназначается для последующего вывода на печать. Поскольку печать документа совершенно необходимая операция над документом, то необходимость в таком преобразовании очевидна.

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

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

Сформулирую цель предстоящей работы. Она в следующем - создать на отдельном листе копию документа в бумажной форме, подготовленную к печати. В процессе преобразования документа в бумажную форму выделю следующие действия:

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

Чтобы пользователь мог управлять процессом преобразования, создадим панель с инструментальными кнопками, выбор которых и будет решать ту или иную частную задачу преобразования. С создания панели с инструментальными кнопками и начну. Я не буду останавливаться на самом процессе создания панели. Полагаю, достаточно взглянуть на то, как выглядит эта панель:

Панель документа с инструментальными кнопками

Рис. 7.12. Панель документа с инструментальными кнопками
Элемент-невидимка

Вместо того чтобы удалять элементы управления из электронной формы, сделаем их невидимыми. Тогда они становятся недоступными для пользователя и одновременно не отображаются при печати. С другой стороны, в нужный момент их всегда можно включить. Так что одним щелчком форма из интерактивной преобразуется в бумажную и наоборот. Многие элементы интерфейса обладают прекрасным булевым свойством Visible. Чтобы сделать такой элемент невидимым, нужно просто выключить свойство Visible. Заметьте, что сами элементы управления - объекты класса CommandButton, Image или ComboBox таким свойством не обладают. Но при их добавлении в рабочий лист, они становятся элементами коллекции OLEObjects, каждый из элементов которой обладает этим свойством, что неоднократно использовалось в ранее приведенных макросах. Заметьте, что не только элементы коллекции, но и вся коллекция в целом обладает этим свойством. Это позволяет делать видимой или невидимой всю коллекцию одним оператором.

Помимо элементов управления я размещал на документе и некоторые объекты WordArt - линии, рамки, позволяющие улучшить оформление листа. При их добавлении в рабочий лист эти объекты становятся элементами коллекции Shapes. Коллекция Shapes не обладает свойством Visible, но ее элементы таким свойством обладают. Я решил при печати избавиться от всяческого "украшательства", и потому выключил видимость и этих элементов.

Операция выключения видимости объектов, очевидно, обратима. Поэтому на созданной панели инструментальных кнопок расположены две кнопки, позволяющие включать и выключать видимость объектов. Соответственно написаны и два макроса, запускаемые при нажатии этих кнопок. Вот текст макросов OlePlus и OleMinus, включающих и выключающих видимость OLE-объектов и Shape-объектов:

Public Sub OlePlus()
	'Эта процедура делает видимой коллекцию OLE - объектов
	'Видимой делается и коллекция Shapes
	
	Dim Ob As OLEObjects
	Set Ob = ThisWorkbook.Worksheets(1).OLEObjects
	If Ob.Count > 0 Then Ob.Visible = True
	For Each Shp In ThisWorkbook.Worksheets(1).Shapes
		Shp.Visible = msoTrue
	Next Shp
End Sub

Public Sub OleMinus()
	'Эта процедура делает невидимой коллекцию OLE - объектов
	'Невидимой делается и коллекция Shapes
	Dim Ob As OLEObjects
	Set Ob = ThisWorkbook.Worksheets(1).OLEObjects
	If Ob.Count > 0 Then Ob.Visible = False
	Dim Shp As Shape
	For Each Shp In ThisWorkbook.Worksheets(1).Shapes
		Shp.Visible = msoFalse
	Next Shp
End Sub

Макросы OlePlus и OleMinus связываются с соответствующими инструментальными кнопками созданной панели инструментов.

Включение и выключение фона

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

Public Sub FonPlus()
	'Заливает область бланка серым цветом
	Range("A1:K56").Select
	With Selection
		.Font.ColorIndex = 1
		.Interior.ColorIndex = 15
	End With
	Range("A1").Select
End Sub

Public Sub FonMinus()
	'Восстанавливает белый цвет в области бланка
	Range("A1:K56").Select
	With Selection
		.Font.ColorIndex = 1
		.Interior.ColorIndex = 2
	End With
	Range("A1").Select
End Sub
Создание листа печати

Теперь, когда некоторая предварительная работа проделана, займемся основной работой по подготовке листа печати. Замечу, что, конечно, нажав кнопки OLE- и Fon-, можно приступить к печати листа, в таком виде, как он получился. После чего, нажать кнопки OLE+ и Fon+, вернув лист в исходное состояние. Однако это не лучший способ, поскольку остались кой-какие лишние детали, а главное при выключении была потеряна важная информация. Поскольку окончательное формирование листа печати является необратимой операцией, не позволяющей вернуться к исходному состоянию, то лучшим выходом является формирование дополнительного листа, специально предназначенного для печати.

Пятая кнопка на инструментальной панели с именем "КопияП" запускает макрос, готовящий лист печати. Приведу его текст:

Public Sub CopyForPrinting()
	'подготавливает копию листа для печати
	Dim mySh As Worksheet
	Dim Ex As Boolean
	Dim curField As Range
	With ThisWorkbook
		Ex = False
		For Each mySh In .Worksheets
			If mySh.Name = "ЛистПечати" Then
				Ex = True: Exit For
			End If
		Next mySh
		If Not Ex Then
			.Worksheets.Add
			.ActiveSheet.Name = "ЛистПечати"
			.ActiveSheet.Move After:=Sheets("Заказ")
		End If
		'Очистить область листа печати
		Set curField = .Worksheets("ЛистПечати").Range("A1:K56")
		curField.Clear
		'Показ скрытых строк
		StrShow
		'Копирование листа
		Set curField = .Worksheets("Заказ").Range("A1:K56")
		curField.Copy
		.Sheets("ЛистПечати").Activate
		.ActiveSheet.Range("A1").Select
		.ActiveSheet.PasteSpecial
	End With
		'запуск макросов
		OleMinus
		FonMinus
		'Скрыть лишние строки
		StrHide
		'Дополнить нужной информацией
		AddInformation
		'Удалить сетку и другие детали
		 With ActiveWindow
			.DisplayGridlines = False	'сетка
			.DisplayHeadings = False	'заголовки
			.DisplayFormulas = False	'показ формул
			.DisplayZeros = False		'отображение нулей
		End With
	
End Sub

В работе процедуры можно выделить несколько этапов:

  • Вначале создается лист печати, если только он уже не был создан.
  • Область листа, отведенная под документ, чистится от предыдущего заполнения. Вызываемая процедура StrShow показывает строки, которые были скрыты при предыдущем заполнении. О скрытии строк я поговорю чуть позже.
  • Затем лист заказа копируется со всеми его атрибутами.
  • Теперь, когда у нас есть копия листа, над ней можно проводить все необходимые операции. Первым делом запускаются макросы OleMinus и FonMinus, удаляющие объекты OLE и Shape, также как и заливку фона.
  • На следующем этапе лист печати сжимается в размерах. Достигается это за счет того, что ряд пустых строк скрываются, - делаются невидимыми. Такими строками являются строки, разделяющие разделы нашего документа, а также незаполненные строки таблицы заказов. Выполняет операцию скрытия строк процедура StrHide. Поскольку эта операция обратима, то я написал и процедуру StrShow, показывающую скрытые строки. Она вызывается при чистке листа.
  • Вызов процедуры AddInformation позволяет дополнить лист печати необходимой информацией. В соответствующие ячейки листа печати заносятся название издательства, фамилия сотрудника, оформляющего заказ, дата заказа.
  • На последнем шаге работы процедуры удаляются ненужные при печати элементы листа - сетка, заголовки строк и столбцов.

Приведу теперь тексты процедур StrHide и StrShow:

Public Sub StrHide()
	'Эта процедура позволяет скрыть лишние строки
	Dim curField As Range, curField1 As Range
	Dim i As Integer
		Rows("1:7").Select
		Selection.EntireRow.Hidden = True
		Rows("10:14").Select
		Selection.EntireRow.Hidden = True
		Rows("17:18").Select
		Selection.EntireRow.Hidden = True
		Rows("27:28").Select
		Selection.EntireRow.Hidden = True
		Rows("48:49").Select
		Selection.EntireRow.Hidden = True
		
		'Скрыть пустые строки в таблице заказов
		Set curField = Range("A34:D34")
		Set curField1 = Rows("34:34")
		For i = 0 To 11
			If IsEmpty(curField.Offset(i)) Then
				curField1.Offset(i).Select
				Selection.EntireRow.Hidden = True
			End If
		Next i
	End Sub

В процедуре StrHide скрываются строки, не несущие информацию. При скрытии строк внутри таблицы заказа приходится проводить анализ того, заполнена ли строка таблицы информацией.

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

Public Sub StrShow()
	'Показ скрытых строк
		Rows("1:56").Select
		Selection.EntireRow.Hidden = False
End Sub

Для полноты картины осталось привести процедуру AddInformation, добавляющую информацию в ячейки листа печати. Вот ее текст:

Public Sub AddInformation()
	'Эта процедура дополняет лист печати нужной информацией
	Dim MyCombo As Object
	With ThisWorkbook
		Set curField = .Worksheets("ЛистПечати").Range("D8")
		curField.Value = "Издательство: Родная Речь"
		curField.Font.Bold = True
		curField.Font.Size = 12
		Set curField = .Worksheets("ЛистПечати").Range("H16")
		curField.Value = Date
		curField.Font.Bold = True
		curField.Font.Size = 14
		Set curField = .Worksheets("ЛистПечати").Range("H29")
		Set MyCombo = .Worksheets("Заказ").OLEObjects("ListOfTeam").Object
		curField.Value = MyCombo.Text
		curField.Font.Bold = True
		curField.Font.Size = 12
	End With
End Sub

В завершение рассказа о подготовке листа печати давайте взглянем на то, что получается при нажатии кнопки "КопияП", ответственной за выполнение этой работы:

Лист печати

Рис. 7.13. Лист печати

На этом и закончу обсуждение того, как придать интерактивность офисным документам.

Ольга Гафарова
Ольга Гафарова

Добрый день. Подскажите формулы при решении задачи на рис. 2.2 в лекции №2. Закон Ома, какие должны использоваться формулы для I и R

Курс: Основы офисного программирования и документы Excel

Серегй Лушников
Серегй Лушников