Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 2720 / 260 | Оценка: 4.03 / 3.74 | Длительность: 19:48:00
Специальности: Программист, Менеджер
Лекция 6:

Офисное программирование. Специфика и примеры

Разработка шапки электронного бланка

Как уже говорилось, шапка бланка будет включать логотип офиса, его название и другие реквизиты. Так как шапка может применяться при создании разных бланков, стоит разработать для нее отдельный шаблон. Более того, используя Macrorecorder, будет создан макрос, строящий эту шапку. Сразу же замечу, что это будет не один макрос, а серия небольших макросов, отражающих отдельные этапы работы. Я полагаю, что это правильная технология использования MacroRecorder. Макросы должны быть небольшими и соответствовать отдельным функциям, которые можно выделить естественным образом. В этом случае набор таких макросов допускает переиспользование и процесс создания нового шаблона во многом может свестись к сборке из набора готовых макросов. Мы пойдем по этой дороге, и созданные макросы помогут нам проследить за каждым шагом работы вручную, даже если мы и не опишем подробно его на словах.

Выделим следующие этапы в создании шапки:

  • форматирование листа бланка на рабочем листе Excel;
  • рисование графического образа, задающего логотип - торговую марку офиса;
  • оформление названия офиса с помощью WordArt;
  • создание рамки, окаймляющей реквизиты офиса.
Форматирование листа бланка.

Обычный лист Excel содержит "лишние" для бланка детали. Пользователь, работающий с бланком, может и не подозревать, что он работает с рабочим листом Excel, он должен видеть перед собой "обычный" лист с именованными полями, в которые заносится нужная информация. Поэтому я отключил такие элементы рабочего листа, как сетку, выделяющую ячейки, заголовки столбцов и строк, а также строку листа Excel, в которой отображаются имена ячеек и формулы, записанные в них. Это достигается установкой соответствующих переключателей в окне Options (Параметры) из меню Tools (Сервис). Следующим шагом работы является выделение области ячеек, соответствующих размеру электронного бланка и выделение ее подходящим цветом фона. На этом этапе я использовал возможности, предоставляемые для задания фона в окне Patterns (Вид) при выборе команды Cells (Ячейки) из меню Format (Формат). Замечу, что хотя совершенно естественно начинать описание процесса создания бланка с его форматирования, реально форматирование следует выполнять на п оследнем этапе, когда бланк полностью готов и осталось убрать лишние детали.

Итак, вот моя программа действий по форматированию бланка с записью соответствующего макроса:

  • открыл чистый рабочий лист Excel;
  • вызвал запись макроса, которому дал имя "ФорматированиеБланка ";
  • удалил "лишние" элементы рабочего листа: сетку и заголовки строк и столбцов;
  • выделив область ячеек, соответствующую размеру бланка, залил ее подходящим цветом;
  • закончил запись макроса.

Приведу текст полученного макроса с добавленными мной комментариями:

Sub ФорматированиеБланка()
'
' ФорматированиеБланка Macro
' Macro recorded 27.11.1999 by Vladimir Billig
' Этот макрос удаляет сетку, заголовки строк и столбцов, строку формул,
	'показ нулей в ячейках рабочего листа. Выделяет подходящим фоном рабочую
	'область бланка. В данном примере: A1:K56

	Range("A1:K56").Select
	With Selection.Interior
		.ColorIndex = 15	'серый цвет
		.Pattern = xlSolid
		.PatternColorIndex = xlAutomatic
	End With
	With ActiveWindow
		.DisplayGridlines = False	'сетка
		.DisplayHeadings = False	'заголовки
		.DisplayFormulas = False	'показ формул
		.DisplayZeros = False		'отображение нулей
	End With
	Application.DisplayStatusBar = False	'строка статуса
End Sub
Листинг 6.18.

MacroRecorder помещает все создаваемые макросы в отдельный модуль, который я переименовал, назвав его "БланкСчетФактура".

Создание логотипа

Каждый приличный офис имеет логотип. Наш офис, который мы будем называть "Родная Речь" такой логотип имеет. Под логотипом мы понимаем графический образ, являющийся символом организации и размещаемый на ее бланках. Допустим, рисунок логотипа уже создан, и нам остается только поместить его в нужном месте бланка, возможно, согласовав размеры. Есть две возможности размещения его на бланке. При создании логотипа офиса "РР" я нашел рисунок бабочки и пририсовал в графическом редакторе на каждом из ее крылышек букву "Р", затем привел рисунок к нужным размерам. Чтобы поместить его на бланк, можно вставить рисунок в ячейку рабочего листа. Для этого нужно выделить подходящую ячейку и указать имя файла в окне, раскрывающемся при выборе команды From File (Из Файла) пункта Picture (Рисунок) меню Insert (Вставить). Но лучше идти более сложным путем: разместить на бланке элемент управления "Image", а затем, используя свойство Picture этого элемента, указать, где хранится рисунок. Несомненным преимуществом такого подхода является возможность использования рисунка произвольного размера. Меняя его свойства, можно его растянуть или сжать до приемлемых размеров. Кроме того, этот элемент управления реагирует на события и можно написать процедуру, которая, например, будет выдавать дополнительную информацию, скажем, о "главных" людях офиса, в тот момент, когда пользователь щелкнет кнопкой по области, занятой логотипом. Обращаем Ваше внимание на то, что при помещении на рабочий лист Excel элемента управления, он вставляется как OLE-объект и становится частью коллекции OLEObjects.

Я выбрал путь, использующий OLE-объекты. Мои действия записывал макрос, который был назван "Логотип":

Sub Логотип()
'
' Логотип Macro
' Macro recorded 27.11.1999 by Vladimir Billig
	'Этот макрос создает элемент управления Image
	'и помещает его в нужную позицию рабочего листа.

	ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
		DisplayAsIcon:=False, Left:=23.25, Top:=15, Width:=63, Height:=61.5). _
		Select
End Sub
Листинг 6.19.

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

  • Image получил имя Логотип;
  • включив свойство Picture, в появившемся окне я указал файл, содержащий образ с логотипом (бабочку РР);
  • свойству PictureSizeMode приписал значение 3 (PictureSizeModeZoom), при котором картинка распахивается на все окно, отведенное образу;
"Красивое имя"

Рядом с логотипом поместим название офиса: "Издательство Родная Речь". Чтобы эта надпись выглядела незаурядно, воспользуемся возможностями, которые предоставляет инструментальная панель WordArt для художественного исполнения надписей. При написании слов "Издательство" и "Родная Речь" я использовал разные стили. С объектной точки зрения каждая из этих надписей представляет объект класса Shape. Я визуально менял свойства этих объектов, а Macrorecorder фиксировал мои действия в макросе с именем "КрасивоеИмя". Вот текст этого макроса:

Sub КрасивоеИмя()
'
' КрасивоеИмя Macro
' Macro recorded 27.11.1999 by Vladimir Billig
	'Этот макрос включает инструментальную панель WordArt
	'и с ее помощью создает два рисованных объекта класса Shape
	'первый из них задает слово "Издательство", второй -"Родная Речь"

	ActiveSheet.Shapes.AddTextEffect(msoTextEffect10, "Издательство", _
	"Arial Black", 24#, msoFalse, msoFalse, 177.75, 138.75).Select
	Selection.ShapeRange.IncrementLeft -34.5
	Selection.ShapeRange.IncrementTop -126#
	ActiveSheet.Shapes.AddTextEffect(msoTextEffect4, _
		"Р о д н а я	Р е ч ь ", _
		"Impact", 20#, msoFalse, msoFalse, 197.25, 138.75).Select
	Selection.ShapeRange.IncrementLeft -30#
	Selection.ShapeRange.IncrementTop -80.25
End Sub
Листинг 6.20.
Формирование рамки с реквизитами офиса

Заключительный шаг в формировании шапки - заполнение полей с реквизитами офиса: адресом, телефоном и др. Визуально эту операцию выполнить просто. В одной ячейке записывается название реквизита, а в ячейке справа его значение. Обычно одной ячейки для значения не хватает, и требуется расширить это поле до нужных размеров. Чтобы не менять размеры столбцов, проще всего слить идущие подряд ячейки. Вручную для этого нужно выделить ячейки и включить переключатель MergeCells (Объединение ячеек) на вкладке Alignment (Выравнивание) из пункта Cells (Ячейки) меню Format (Формат).

Чтобы объединить поля с реквизитами и придать им некоторую структуру, их, как правило, заключают в рамку. Подходящую рамку можно выбрать из набора готовых Shape объектов, доступ к которым можно получить, включив инструментальную панель Рисование (Drawing) с элементами рисования; одна из ее кнопок - Автофигуры (AutoShapes) - позволяет добраться до базисных Shape-фигур. Когда рамка накладывается на поля с реквизитами, поля перестают быть видимыми. Рамку следует сделать прозрачной. Для этого нужно, выделив ее, щелкнуть правой кнопкой мыши, из контекстного меню выбрать пункт FormatAuto Shape и в появившемся окне в разделе заполнения (Fill) выбрать из списка значение для цвета NoFill (без заполнения). В этот момент при желании можно изменить стиль начертания границ рамки.

Я проделал все описанные выше операции и получил законченную шапку, отвечающую нашему эскизу. Макрос "РеквизитыИРамка" позволит проследить за моими действиями последнего этапа - формирования реквизитов офиса. Заметьте, в завершение шапки я подвел черту, подчеркнув сформированную часть яркой линией.

Sub РеквизитыИРамка()
'
' РеквизитыИРамка Macro
' Macro recorded 27.11.1999 by Vladimir Billig

'Именование полей реквизитов
	Range("D9:E9").Select
	Selection.MergeCells = True
	ActiveCell.FormulaR1C1 = "Адрес"
	Range("D10:E10").Select
	Selection.MergeCells = True
	ActiveCell.FormulaR1C1 = "Телефон, Факс"
	Range("D11:E11").Select
	Selection.MergeCells = True
	ActiveCell.FormulaR1C1 = "Email"
	Range("D12:E12").Select
	Selection.MergeCells = True
	ActiveCell.FormulaR1C1 = "ИНН"
	
	'Запись реквизитов
	Range("F9:K9").Select
	Selection.MergeCells = True
	ActiveCell.FormulaR1C1 = "Москва, ул. Филевская, 15"
	Range("F10:J10").Select
	Selection.MergeCells = True
	ActiveCell.FormulaR1C1 = "175-3434, 175-3480"
	Range("F11:J11").Select
	Selection.MergeCells = True
	ActiveCell.FormulaR1C1 = "rr@red.ru"
	Range("F12:J12").Select
	Selection.MergeCells = True
	Selection.HorizontalAlignment = xlLeft
	ActiveCell.FormulaR1C1 = "198712345"
	Range("F9:J12").Select
	Selection.Font.Italic = True
	
	'Построение рамки
	ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, _
		105#, 96#, 369.75, 63.75).Select
	Selection.ShapeRange.Fill.Visible = msoFalse
	
	'Линия отчеркивания
	ActiveSheet.Shapes.AddLine(48.75, 189#, 475.5, 189#).Select
	Selection.ShapeRange.Line.ForeColor.SchemeColor = 48
	Selection.ShapeRange.Line.Visible = msoTrue
	Selection.ShapeRange.Line.Style = msoLineThinThin
	Selection.ShapeRange.Line.Weight = 3#
End Sub
Листинг 6.21.

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

Макрос "Шапка"

Мы выполнили всю работу по созданию шапки, разделив ее на четыре этапа. На каждом из этих этапов Macrorecorder создал соответствующий макрос. Осталось объединить эти макросы в один, - мы назвали его "Шапка". Он очень прост: последовательно вызывает уже созданные макросы каждого шага:

Sub Шапка()
	'Объединение четырех макросов для построения шапки бланка
	ФорматированиеБланка
	Логотип
	КрасивоеИмя
	РеквизитыИРамка
End Sub
Листинг 6.22.

Запустив этот макрос на чистом листе, мы получим заполненную шапку. Точнее, почти заполненную, поскольку макрос "Логотип" не записал действий с объектом класса Image по изменению его свойств. Так что нужно приложить некоторые усилия и повторить действия по установлению свойств объекта, чтобы увидеть картинку, связанную с объектом Image. Взгляните на результат работы макроса "Шапка":

Построение шапки

увеличить изображение
Рис. 6.6. Построение шапки