Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2702
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Форматирование объектов приложений MS Office 203

Другой пример — свойство Borders. Обычно, в нем содержится семейство границ объекта,

его Border-объектов. Зная, как настраивать свойства границ для документа Word, можно без большого напряжения “разобраться” с границами абзаца или диапазона ячеек на рабочем листе Excel. Словом, при всей сложности и при всем многообразии форматирующих свойств объектов в приложениях MS Office, в них выдержаны четкие, единые принципы и подходы, позволяющие пользователю примерно одними и теми же способами работать с различными видимыми объектами в разных приложениях Office.

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

Пример форматирования документа Word

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

Форматирование абзаца

Сформируем его, например, следующим образом. Объявив предварительно строковую переменную MyText,

Dim MyText As String

наполним ее строкой, которая содержит в себе весь текст документа, разбитый на абзацы:

MyText = "Коммерческое предложение" + vbCr + _ "ООО Универсал" + vbCr + _

"ООО Универсал предлагает к реализации" + _ " неограниченные партии замечательного товара. " + _ "Товар предлагается в ассортименте из " + _

"трех наименований: " + vbCr + _ "Наименование товара 1" + vbCr + _ "Наименование товара 2" + vbCr + _ "Наименование товара 3" + vbCr + _ "С уважением, - И.И.Иванов" + vbCr

Использование константы vbCr

Конструкцию вида

"Строка… " + vbCr + _ "Строка… "

используют в случаях, когда необходимо получить строковое значение, состоящее из нескольких строк (константа vbCr — это символ конца строки). В случае документа Word символ vbCr рассматривается, как символ абзаца; поэтому, если сделать теперь переменную MyText содержимым документа Word, то такой документ будет состоять из нескольких абзацев. Первые два абзаца соответствуют заголовку сообщения и наименованию организации. Третий абзац в коде VBA формируется из нескольких строк, но, поскольку символ vbCr к ним не добавляется, все они вместе представляют один абзац — собственно текст сообщения. Далее следуют три абзаца, представляющие собой список из трех наименований. Наконец, завершает текст абзац-подпись.

204 Глава 8. VBA-программирование: примеры и иллюстрации

Использование метода InsertBefore

Чтобы содержащаяся в переменной MyText столь сложная строка стала содержимым документа Word (предполагается, что обсуждаемый код размещен в окне редактора Visual Basic, которое открыто из окна пустого документа Word), необходимо вызвать метод InsertBefore (“вставка вначале”):

ActiveDocument.Content.InsertBefore MyText

Свойство Content

Свойство Content активного документа представляет его текстовое содержимое. В результате такого присваивания сформированный в переменной MyText текст будет вставлен в документ Word, как семь абзацев (рис. 8.13).

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

см. в гл. 7 раздел “Семейства Paragraphs, Sentences, Words и Characters”.

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

Свойство Style

К счастью, есть более простой способ справиться с форматированием абзаца. Как и многие другие объекты в среде Office, абзац обладает свойством Style, которое задает один из предопределенных стилей. Присвоив абзацу один из стандартных стилей, можно, тем самым, определите значение сразу множества его свойств.

Рис. 8.13. В пустой документ Word вставлен простой текст, никак не отформатированный

В локализованной русской версии Office стиль можно присвоить двумя способами: использовать стандартную константу, соответствующую стилю, или же указать просто русское имя стиля.

Заголовок сообщения

Например, присвоить абзацу стиль Заголовок сообщения можно при помощи оператора:

Форматирование объектов приложений MS Office 205

Абзац.Style = “Шапка”

Или использовать стандартный способ:

Абзац.Style = wdStyleMessageHeader

Будем придерживаться стандартного способа, поскольку он более универсален. Итак, сделаем первый абзац заголовком сообщения:

ActiveDocument.Paragraphs(1).Style = wdStyleMessageHeader

Второй абзац содержит наименование организации:

ActiveDocument.Paragraphs(2).Style = wdStyleCaption

Простой текст

Далее следует большой абзац, в котором содержится собственно текст сообщения. Ему присвоим стиль “простой текст”:

ActiveDocument.Paragraphs(3).Style = wdStylePlainText

Списки

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

ActiveDocument.Paragraphs(4).Style = wdStyleListBullet2 ActiveDocument.Paragraphs(5).Style = wdStyleListBullet2 ActiveDocument.Paragraphs(6).Style = wdStyleListBullet2

Подпись

Наконец, последний абзац представляет собой подпись автора под документом. На этот случай имеется стиль, который так и называется — “подпись”:

ActiveDocument.Paragraphs(7).Style = wdStyleSignature

Изменение размера шрифта

Чтобы сделать текст легко читаемым и лучше рассмотреть форматирование абзацев, увеличим шрифт во всем документе, обратившись к свойству Font, принадлежащему Range-объекту всего документа:

ActiveDocument.Range.Font.Size = 22

В результате всех этих действий документ преобразится примерно так, как показано на рис. 8.14.

206 Глава 8. VBA-программирование: примеры и иллюстрации

Рис. 8.14. К семи абзацам текста применены стандартные стили

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

Общий вид документа: пример изменения границ документа (раздела)

Оставим пока в покое абзацы, и обратимся к общему виду страницы документа. Например, чтобы снабдить страницу границами, потребуется переменная типа Border, которую, конечно, необходимо объявить заранее:

Dim MyBorder As Border

У документа, как такового, нет семейства границ. Дело в том, что подобно колонтитулам, нумерации страниц и многому другому, границы являются принадлежностью раздела документа, а не самого документа (наверное, потому, что в каждом разделе все эти свойства могут быть определены отдельно). Поэтому, чтобы добраться до элементов форматирования страниц документа, потребуется обратиться к его первому (и, в данном случае, единственному) разделу. Общий принцип обращения к границам состоит в том, что элементы семейства Borders определяются индек- сом-константой. Не имеет значения, о границах чего идет речь — документа или абзаца, символа или текстового диапазона, столбца, ячейки или строки таблицы — в любом случае такое выражение, как, например, объект.Borders(wdBorderBottom) вернет нижнюю границу, а объ-

ект.Borders(wdBorderLeft) — левую.

Форматирование объектов приложений MS Office 207

Рис. 8.15. Страница документа снабжена границами

Пусть требуется изменить сразу все границы. Лучше всего, в этом случае, воспользоваться конструкцией For Each … Next, которая перебирает все границы (объекты семейства Border), без необходимости указывать индекс каждого объекта в отдельности. Вот код, который сразу изменяет все границы страниц первого раздела документа:

For Each MyBorder In ActiveDocument.Sections(1).Borders

MyBorder.ArtStyle = wdArtWoodwork

MyBorder.ArtWidth = 17

Next MyBorder

Свойство ArtStyle: художественный стиль границы

Свойство ArtStyle определяет “художественный стиль” границы (здесь использован “деревянный” стиль, всего же их существует несколько десятков).

Свойством ArtWidth: ширина границы

Свойством ArtWidth задается ширина границы в пунктах.

В результате документ будут снабжен художественной окантовкой, как изображено на рис. 8.15.

Границы абзаца

Продолжая разговор о границах, вернемся к абзацу. Предположим, нужно изменить вид первого абзаца, который отформатирован стандартным стилем “заголовок сообщения”. Изменим его нижнюю границу так, чтобы она как бы подчеркивала текст. Для этого обратимся к тому Border- объекту в семействе границ первого абзаца, который отвечает за нижнюю границу. Выше уже описывалось, как это сделать. Для нижней границы в качестве индекса следует использовать константу wdBorderBottom. Что именно предполагается изменить в свойствах нижней границы? Пусть линия этой границы станет тройной, вида “тонкая-толстая-тонкая с малым отступом”. Для этого необходимо загрузить соответствующую константу в свойство LineStyle Border- объекта. Вот, какое в результате получится выражение:

ActiveDocument.Paragraphs(1).Borders(wdBorderBottom).LineStyle = _

208 Глава 8. VBA-программирование: примеры и иллюстрации

wdLineStyleThinThickThinSmallGap

Рис. 8.16. Изменено форматирование первого абзаца — нижняя граница абзаца поменяла стиль и толщину линии, а интервал после абзаца увеличен

Свойство SpaceAfter: отступ снизу

Раз уж изменяется первый абзац, то освободим под ним место (оно потребуется позже), увеличив интервал после абзаца (свойство SpaceAfter):

ActiveDocument.Paragraphs(1).SpaceAfter = 31

Свойство Alignment: пример выравнивания абзаца слева

И зададим для текста в абзаце выравнивание по центру (свойство Alignment):

ActiveDocument.Paragraphs(1).Alignment = _

wdAlignParagraphCenter

Вид первого абзаца в результате, как показано на рис. 8.16, соответствующим образом изменился.

Форматирование графических объектов (семейство Shapes)

Пожалуй, самое время вспомнить, что кроме текстовых элементов, в объектах приложений Office встречается и графика различного рода. Добавим на страницу, в качестве украшения, автофигуру “вертикальный свиток”. Все автофигуры документа доступны через семейство Shapes.

Метод AddShape

Добавление автофигуры в семейство Shapes мало, чем отличается от добавления объектов в любое другое семейство — при этом используется метод AddShape — единственная особенность заключается в необходимости указать координаты и размеры новой автофигуры, а также ее тип:

ActiveDocument.Shapes.AddShape _

msoShapeVerticalScroll, 410, 110, 100, 30

Форматирование объектов приложений MS Office 209

Рис. 8.17. В интервал после первого абзаца помещена автофигура “вертикальный свиток” с надписью

Константа msoShapeVerticalScroll задает тип “вертикальный свиток”, а параметры, следующие за ним, — координаты и размеры автофигуры.

Надпись на автофигуре

Чтобы снабдить фигуру надписью, следует задать значение ее свойству

TextFrame.TextRange:

ActiveDocument.Shapes(1).TextFrame.TextRange = "Универсал"

В результате, как изображено на рис. 8.17, на странице появится своеобразная “эмблема фирмы”.

Форматирование документа посредством тем

Для режима просмотра документа Web-документ существует еще одна возможность, благодаря которой можно “одним махом” отформатировать документ, не вдаваясь ни в какие тонкости. Речь идет о темах, которые доступны по команде Формат | Тема, и которыми можно воспользоваться также из VBA-кода. Фактически, установленные на компьютере темы представляют собой подкаталоги в каталоге Program Files\Common Files\Microsoft Shared\Themes. На-

звание (английское) каждого такого подкаталога — это и есть имя соответствующей темы. Это имя не соответствует русскому наименованию, которое доступно в диалоговом окне Òåìà.

210 Глава 8. VBA-программирование: примеры и иллюстрации

Рис. 8.18. К документу применена тема “Ива“

Метод ApplyTheme

Чтобы применить к документу какую-нибудь тему, и одним действием отформатировать документ, необходимо вызвать метод ApplyTheme. В качестве параметра следует указать строку, состоящую из имени темы (английского названия соответствующего подкаталога) и символов “111”. Например, для того чтобы применить тему “Ива” (оригинальное имя — Willow), необходим следующий оператор:

ActiveDocument.ApplyTheme "willow 111"

В результате окно Word автоматически перейдет в режим просмотра Web-документ, а все свойства выбранной темы будут применены к текущему документу (рис. 8.18).

Представление данных в MS Office

Вопросы форматирования видимых объектов — не более чем часть более глобальной темы, которую можно было бы назвать “представлением данных”. Одни и те же данные, например, таблицу числовых значений, можно представить множеством различных способов. “Сухие цифры” могут предстать перед пользователем в разном виде: как таблица, оформленная одним из десятков стилей; как диаграмма, построенная одним из десятков способов. И все это можно с легкостью реализовать в коде VBA для одного и того же набора числовых значений.

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

Подготовка табличных данных

Предположим, что речь идет о прямоугольной таблице, в которой собраны сведения об объемах продаж по нескольким сотрудникам за несколько месяцев. Например, выбрав строку, “Иванов”, можно увидеть, каков был уровень продаж по данному сотруднику в каждом месяце. А в столбце, например, “март”, отображены мартовские объемы продаж по всем сотрудникам. Такую

Представление данных в MS Office 211

табличку проще всего реализовать на рабочем листе Excel. Например, она может выглядеть подобно изображенной таблице на рис. 8.19.

Рис. 8.19. Простая прямоугольная таблица содержит сведения о продажах по сотрудникам за несколько месяцев текущего года

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

Условные форматы

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

Постановка задачи

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

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

Определение диапазона условного форматирования

Диапазон, на который предполагается наложить условные форматы, можно описать выражением ActiveSheet.Range("B2:H4"). Пусть это диапазон включает в себя только ячейки с цифровыми данными, оставляя за своими границами заголовки строк и столбцов таблицы.

Объект FormatCondition

Условные форматы каждой ячейки или диапазона содержатся в объектах FormatCondition, которые объединены в семейство FormatConditions данного диапазона. Для любого диапазона, то есть Range-объекта, условные форматы можно задавать, добавляя новые элементы в его

семейство FormatConditions при помощи метода Add. Пусть создаваемое условное форматирование различает три случая: “значение в ячейке меньше или равно $500”, “значение в ячейке от $500 до $1000” и “значение в ячейке равно или больше $1000”.

ПРИМЕЧАНИЕ

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

212 Глава 8. VBA-программирование: примеры и иллюстрации

можно удалять при помощи метода Delete семейства FormatConditions или модифицировать при помощи метода Modify, принадлежащего конкретному FormatCondition-объекту.

Метод Add: добавление условного формата

Метод Add семейства FormatConditions при обращении к нему требует указать ряд параметров.

Первый параметр определяет, к чему должен относиться формат — к выражению в ячейке или к содержащемуся в ней значению. В данном примере речь должна идти о значении, определяемом константой xlCellValue.

Второй параметр задает оператор условия, то есть математическую операцию, которая выражает условие.

Далее следует формула, выражение или значение, которое играет роль второй “половинки” условия (в роли первой “половинки”, понятно, выступает само значение ячейки).

В случаях, когда требуется еще одно значение, добавляется четвертый параметр. Например, если требуется условие “значение ячейки равно 10”, то следует использовать параметры xlEqual

и 10.

Итак, чтобы наложить условный формат “значение в ячейке меньше или равно $500”, необходимо использовать параметры xlCellValue, xlLessEqual, 500. Вот как, в данном случае, выглядит добавление условного формата:

With ActiveSheet.Range("B2:H4").FormatConditions. _

Add(xlCellValue, xlGreaterEqual, 1000)

... задаются параметры форматирования для данного условия

End With

Форматирование данных удовлетворяющих условию

Каким образом можно будет изображать суммы, не превышающие $500? В данном случае можно полностью дать волю фантазии. Пусть, например, такие суммы будут заштрихованы 25%- ой штриховкой, и для их шрифта будут отменены признаки начертания курсив и полужирный. В результате получится следующая конструкция:

With ActiveSheet.Range("B2:H4").FormatConditions _

.Add(xlCellValue, xlLessEqual, 500)

With .Interior

.Pattern = xlPatternGray25

End With

With .Font

.Bold = False

.Italic = False

End With

End With

Добавление второго условного формата

Один условный формат наложен. К методу Add диапазона B2:H4 можно обратиться еще два раза, определив еще два условных формата для этих ячеек. Пусть для ячеек, значение которых больше или равно 1000, используется желтая сплошная заливка и полужирный шрифт черного цвета. Условие “больше или равно” задается константой xlGreaterEqual, а для определения

Соседние файлы в папке Книги