2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office
.pdfАвтоматизация работы с имеющимися данными 163
.SenderCompany = "ООО Универсал"
Наконец, наименование должности отправителя:
.SenderJobTitle = "Менеджер по работе с клиентами"
На этом заполнение свойств объекта LetterContent можно завершить:
End With
Поскольку предполагается воспользоваться методом SetLetterContent, заполнение всех свойств необязательно (остался целые ряд свойств, которые не были упомянуты). При других способах создания и использования объекта LetterContent необходимо задать значения абсолютно всем свойствам объекта.
Итак, поскольку приложение Word уже запущено и доступно через переменную WD, можно создать новый документ,
WD.Documents.Add
вставить в пустой документ заготовленную строку текста письма,
WD.ActiveDocument.Content.InsertBefore LetterText
и обратиться к методу SetLetterContent активного документа, передав ему в качестве параметра подготовленный объект типа LetterContent:
WD.ActiveDocument.SetLetterContent MyLetter
В результате документ превратится в письмо, которое мог бы создать мастер писем, основываясь на шаблоне Современное письмо. Помошник Office, возможно, предложит создать также конверт или наклейку.
Программный код функции Анализ_баланса
Теперь можно свести весь разработанный код воедино и записать исходный текст функции
Анализ_баланса (листинг 6.2).
ЛИСТИНГ 6.2
Public Function Анализ_Баланса()
Dim MyDb As Database
Dim Klients As Recordset
Dim Operations As Recordset
Dim WordRunning As Boolean
Dim KodKlienta As String
Dim SQLstr As String
Dim SumIn, SumOut As Currency
Dim LetterText As String
Dim WD As Word.Application
Dim MyLetter As New LetterContent
Set MyDb = CurrentDb
Set Klients = MyDb.OpenRecordset("Клиенты")
164 Глава 6. Access: автоматизация офисной базы данных
WordRunning = False
Klients.MoveFirst
Do While Not Klients.EOF
If Klients.Fields("Фамилия") <> "" Then
KodKlienta = Klients.Fields("КодКлиента")
SQLstr = "SELECT * _
FROM Операции WHERE КодКлиента=" + KodKlienta
Set Operations = MyDb.OpenRecordset(SQLstr)
SumIn = 0
SumOut = 0
Operations.MoveFirst
Do While Not Operations.EOF
If Operations.Fields("КодОперации") = 2 Then
SumIn = SumIn + _
Operations.Fields("СуммаОперации")
Else
SumOut = SumOut + _
Operations.Fields("СуммаОперации")
End If
Operations.MoveNext
Loop
Operations.Close
Set Operations = Nothing
If SumOut > SumIn Then
If MsgBox("Отрицательное сальдо по клиенту " _ + Klients.Fields("Фамилия") + _
". Создать письмо?", vbYesNo, _ "Отрицательное сальдо") = vbYes _
Then
If Not WordRunning Then
Set WD = CreateObject("Word.Application")
WD.Visible = True
WordRunning = True
End If
LetterText = _
"Считаем необходимым обратить " + _ "Ваше внимание на то, что Ваш " + _ "баланс в операциях с нашей " + _ "компанией принял отрицательное " + _ "значение и составляет " + _
Str(SumIn - SumOut) + " руб."
Автоматизация работы с имеющимися данными 165
With MyLetter
.DateFormat = Date$
.IncludeHeaderFooter = True
.PageDesign = _
"D:\Office\Templates\1049\" + _ "Современное письмо ltr.dot"
.LetterStyle = wdModifiedBlock
.RecipientName = Klients.Fields("Имя") + _
"" + Klients.Fields("Отчество") + _
"" + Klients.Fields("Фамилия")
.RecipientAddress = _ Klients.Fields("Адрес")
.MailingInstructions = _ "ДЕЛОВАЯ КОРРЕСПОНДЕНЦИЯ"
.AttentionLine = "Внимание!"
.Subject = "Отрицательный баланс"
.ReturnAddress = _
"ООО Универсал, малая Ивановская 1"
.SenderName = "Петров П.П."
.Closing = "С уважением,"
.SenderCompany = "ООО Универсал"
.SenderJobTitle = _
"Менеджер по работе с клиентами"
End With
WD.Documents.Add
WD.ActiveDocument.Content.InsertBefore LetterText
WD.ActiveDocument.SetLetterContent MyLetter
End If
End If
End If
Klients.MoveNext
Loop
Klients.Close
Set Klients = Nothing
Set Operations = Nothing
Set MyDb = Nothing
On Error Resume Next
If WordRunning Then WD.Quit
End Function
Чтобы выполнить функцию, достаточно выбрать двойным щелчком макрос Анализ балан-
са на вкладке Макросы. Далее, если в процессе анализа обнаружится отрицательное сальдо по одному из клиентов, достаточно будет щелкнуть на кнопке Äà в окне сообщения, и в открывшемся окне Word будет создано и отформатировано “современное письмо” с заданным содержанием и реквизитами (рис. 6.7).
166 Глава 6. Access: автоматизация офисной базы данных
Рис. 6.7. Письмо сформировано методом SetLetterContent
Глава 7
В мире объектов MS Office
Кое-что об объектах MS Office уже было рассмотрено в предыдущих главах. Чтобы более полно осознать возможности макросов VBA и представить себе, какие вообще задачи можно было бы решать с их помощью, а также узнать, как выполнить ту или иную операцию над ними, посвятим отдельную главу книги краткому обзору объектов MS Office. Направленность и объем этой книги не предполагают полного и детального рассмотрения объектной модели MS Office — этого, собственно, и не требуется никому, кроме профессиональных офис-программистов. Поэтому для начала вполне достаточно познакомиться с основными объектами, которые требуются для решения часто встречающихся задач, и научиться выполнять с ними типичные операции. Более того: многие действия с объектами MS Office можно выполнить десятком способов. Здесь будут рассмотрены на примерах одно-два самых простых действий. Таким образом, эта глава должна представлять собой что-то вроде краткого путеводителя по миру объектов Office или сборника “готовых рецептов” для непрофессионального программиста, который пытается самостоятельно решать при помощи VBA задачи автоматизации, характерные для своего конкретного офиса.
Работа с объектами MS Word
Объектная модель Word, как таковая, достаточно сложна. Однако все в ней подчинено строгим правилам, которые одинаково применимы ко всем уровням ее иерархической структуры: на уровне приложения, документа, абзаца, слова или символа. По этой причине овладеть основными приемами VBA-программирования для Word не так уж и трудно: достаточно понять несколько основных принципов, и уже никакие, даже совсем незнакомые объекты Word не поставят вас в тупик.
Работа с объектами Word на уровне приложения и документа
Объект Application
Приложение Word в целом представлено объектом Application. Это так называемый глобальный объект и во многих ситуациях его имя можно не упоминать, как нечто само собой разумеющееся (то есть, в большинстве приведенных ниже примеров префикс “Application.” можно было бы опустить). В свойствах этого объекта содержатся открытые окна, документы, всевозможные параметры рабочей среды Word и многое другое.
Свойство Caption
Например, заголовок окна Word задается свойством Caption этого объекта:
Application.Caption = “Мое приложение”
Свойства ActiveWindow, ActiveDocument и ActivePrinter
В свойствах ActiveWindow, ActiveDocument и ActivePrinter содержатся ссылки на,
соответственно, текущее окно, документ и принтер. Следующий код максимизирует текущее окно, сохраняет текущий документ и сообщает пользователю имя текущего принтера:
168 Глава 7. В мире объектов MS Office
Application.ActiveWindow.WindowState = wdWindowStateMaximize Application.ActiveDocument.Save
MsgBox Application.ActivePrinter
Семейство CommandBars
Семейство CommandBars представляет панели меню и панели инструментов Word. Например, включить в окне Word режим “крупные значки” можно при помощи следующего кода:
Application.CommandBars.LargeButtons = True
Свойства DisplayScrollBars и DisplayStatusBar
Многие свойства объекта Application отвечают за внешний вид и поведение окна Word. Например, присваивание логического значения False следующим свойствам приведет к тому, что будет отключено отображение полос прокрутки и строки состояния:
Application.DisplayScrollBars = False
Application.DisplayStatusBar = False
Объект Options
Все параметры и настройки Word, содержащиеся в диалоговом окне Сервис | Параметры, доступны посредством объекта Options.
Свойство AllowDragAndDrop: управление режимом перетаскивания текста в режиме Правка
Например, флажок использовать перетаскивание текста на вкладке Правка можно устано-
вить при помощи присваивания:
Application.Options.AllowDragAndDrop = True
Свойство SaveInterval: задание интервала автосохранения
А следующий код задаст интервал автосохранения (см. вкладку Сохранение) равным десяти минутам:
Application.Options.SaveInterval = 10
Свойство StatusBar
Свойство StatusBar позволяет записать произвольный текст в строку состояния Word:
Application.StatusBar = "Выполняется макрос, ждите..."
Метод Quit
Метод Quit завершает работу Word и закрывает его окно. Закрыть окно Word с сохранением всех открытых документов можно при помощи следующего кода:
Application.Quit wdSaveChanges
Семейство Documents
Семейство Documents, содержащееся в одноименном свойстве объекта Application, представляет все открытые документы. Создать новый или открыть существующий документ можно при помощи методов этого семейства.
Работа с объектами MS Word 169
Метод Add
Метод Add создает новый документ на основе указанного шаблона (если не задавать этот параметр, то документ будет создан на основе шаблона Обычный). Как правило, используют объектную переменную типа Document, чтобы “запомнить” ссылку на вновь созданный документ:
Dim MyDoc As Document
Set MyDoc = Documents.Add("C:\MSOffice\Templates\My.dot")
Метод Open
Метод Open используют для открытия уже существующего, то есть записанного ранее на диск документа:
Set MyDoc = Documents.Open("C:\Мои документы\MyDoc1.doc")
Методы Close и Activate
Обращаться к членам семейства Documents можно как по номерам, так и по именам. Например, следующий код закроет документ с именем “Документ1” и сделает активным четвертый из остающихся открытыми документов (если документа с именем “Документ1” среди открытых документов нет, или, если открыто менее четырех документов, то возникнет ошибка выполнения):
Documents(“Документ1”).Close
Documents(4).Activate
Объекты ActiveDocument и ThisDocument
С точки зрения макроса VBA есть два особенных документа из всех документов семейства Documents. Очень часто эти два документа совпадают в одном: ActiveDocument во многих случаях означает то же самое, что и ThisDocument, хотя, вообще говоря, это разные объекты. Объект ActiveDocument указывает на активный, то есть текущий документ, тот документ, чье окно активно и находится на переднем плане. Объект ThisDocument содержит ссылку на тот документ, в котором, собственно, находится выполняемый макрос.
Метод PrintOut: печать документа
Вывести на печать документ:
ActiveDocument.PrintOut
Метод SendMail: отправка документа по электронной почте, как вложение
Отправить документ по электронной почте, как вложение:
Options.SendMailAttach = True
ThisDocument.SendMail
В последнем случае по электронной почте будет отправлен документ или шаблон, в котором содержится макрос. Если макрос создан при помощи диалогового окна Макросы без уточнения местонахождения макроса, то в путь отправится шаблон Normal.dot. При этом автоматически откроется окно MS Exchange с созданным сообщением E-mail, где остается лишь указать адрес.
Метод Close
Метод Close имеется как у семейства Documents в целом, так и у каждого отдельно взятого Document-объекта. В первом случае он используется для группового закрытия документов, во втором — для закрытия конкретного документа.
Закрыть все документы с сохранением по подтверждению пользователя:
170 Глава 7. В мире объектов MS Office
Documents.Close wdPromptToSaveChanges
Закрыть текущий документ без сохранения:
ActiveDocument.Close wdDoNotSaveChanges
Методы Save и SaveAs
Явным образом сохранить документ можно при помощи метода Save (сохранение под текущим именем) или SaveAs (сохранить как):
ActiveDocument.Save
ActiveDocument.SaveAs "C:\Мои документы\MyDoc2.doc"
Объект Range: работа с текстовым содержимым документа
Основным рабочим инструментом для операций с содержимым документа Word является объект типа Range. Этот специальный, “абстрактный” объект представляет собой диапазон текста. По названию, а также по своему смыслу он схож с объектом Range рабочего листа Excel. Эти два
разных Range-объекта вполне могут соседствовать и даже присутствовать вместе в одной строке кода, как можно было убедиться в одной из предыдущих глав.
← см. в гл. раздел “”.
При работе с текстовым содержимым документа в целом, а также при операциях с абзацами, предложениями, словами и символами, всегда используется один и тот же объект — Range. В каждом случае, в любом контексте он представляет соответствующий текстовый диапазон, будь то весь документ или единственное слово. По этой причине очень важно освоить приемы работы именно с Range-объектом, как таковым, а детали обращения с предложениями, словами и другими разновидностями текстовых диапазонов не будут представлять никакой трудности.
Явно задать текстовый диапазон Range можно задать множеством различных способов. Многие свойства документа, не содержащие в своем названии слова “Range”, на самом деле возвращают при обращении к ним объект типа Range. У многих объектов существует свойство Range
и также существует метод Range, — в любом случае в результате будет получен Range-объект. Итак, проиллюстрируем одновременно различные способы определения текстового диапазона Range и действия, которые можно проделать с уже определенным Range-диапазоном.
Свойство Bold: выделение диапазона полужирным начертанием его символов
Выделить полужирным начертанием первые десять символов документа:
ActiveDocument.Range(Start:=0, End:=9).Bold = True
Свойство InsertBefore: вставка строки
Вставить вначале документа строку “АБВГД”:
ActiveDocument.Range(Start:=0, End:=0).InsertBefore "АБВГД"
Проверка правописания
Выполнить проверку правописания в первом разделе документа, и, в случае обнаружения ошибки, выдать сообщение:
If Not CheckSpelling(ActiveDocument.Sections(1).Range) Then
MsgBox "Обнаружена ошибка!"
End If
Работа с объектами MS Word 171
Задание верхнего колонтитула
Задать верхний колонтитул первой страницы для второго раздела:
ActiveDocument.Sections(2).Headers(wdHeaderFooterFirstPage).Range = _ "Глава 2"
Семейства Paragraphs, Sentences, Words и Characters
Семейство Paragraphs представляет все абзацы документа, семейство Sentences — все предложения, в семействе Words содержатся слова, а в семействе Characters — символы документа. Все эти семейства устроены одинаковым образом.
Свойства First и Last
К их членам можно обращаться по номерам, свойства First и Last указывают на, соответственно, первый и последний элементы.
Свойства Count
Свойстве Count содержится число элементов в семействе. И для всех этих семейств в любом случае в результате возвращается объект типа Range.
Свойство Alignment
Задать выравнивание по правому краю для первого абзаца:
ActiveDocument.Paragraphs(1).Alignment = wdAlignParagraphRight
Создание вокруг абзаца рамку заданного стиля
Заключить первый абзац в рамку стиля 3D:
ActiveDocument.Paragraphs.First.Borders.OutsideLineStyle = _
wdLineSyleEmboss3D
Вставка текста после заданного абзаца
Вставить текст после последнего абзаца:
ActiveDocument.Paragraphs.Last.Range.InsertAfter "Конец."
Изменение фона абзаца
Задать для пятого абзаца штриховку (узор) 15%:
ActiveDocument.Paragraphs(5).Shading.Texture = _
wdTexture15Percent
Изменение стиля абзаца
Задать стиль 1-го абзаца Заголовок1:
ActiveDocument.Paragraphs.First.Style = "Заголовок 1"
Изменение стиля абзаца
Аналогичным образом можно обращаться к предложениям документа. Выбрать для первого предложения шрифт Arial:
ActiveDocument.Sentences(1).Font.Name = "Arial"
172 Глава 7. В мире объектов MS Office
Перемещение по тексту
Задать смещение вверх на три пункта для символов первого предложения и вниз на три пункта для второго:
ActiveDocument.Sentences(1).Font.Position = 3
ActiveDocument.Sentences(2).Font.Position = - 3
Метод Delete
Удалить последнее предложение:
ActiveDocument.Sentences.Last.Delete
Преобразование символов в верхний регистр
Преобразовать символы первого предложения в верхний регистр:
ActiveDocument.Sentences(1).Case = wdUpperCase
Изменение начертания символов Выделить первое слово полужирным начертанием:
ActiveDocument.Words.First.Bold = True
Семейство StoryRanges
Семейство StoryRanges также возвращает Range-объект, — оно обеспечивает доступ к различным структурным компонентам текста, таким, как основной текст, примечания, сноски, колонтитулы и др. Выбор нужного компонента осуществляется посредством соответствующей константы. Например, задать шрифт Arial для основного текста документа (не затронув при этом все остальное, как случилось бы при обращении к свойству ActiveDocument.Range), можно при помощи следующего кода:
ActiveDocument.StoryRanges(wdMainTextStory).Font.Name = "Arial"
Выделить полужирным нижний колонтитул 1-й страницы:
ActiveDocument.StoryRanges(wdFirstPageFooterStory).Bold = True
Работа со списками и таблицами документа Word
Word-таблицы
Таблицы в документе Word представлены объектами типа Table, доступными через семейство Tables. Каждая таблица — объект Table — состоит из строк (объекты типа Row, объединенные в семейство Rows) и столбцов (объекты типа Column, объединенные в семейство Rows). Кроме того, таблицу можно рассматривать, как набор ячеек (объектов типа Cell, объединенных в семейство Cells).
Управление границами таблиц
Разрешить отображение границ для первой таблицы документа:
ActiveDocument.Tables(1).Borders.Enable = True
Удаление столбца таблицы
Удалить первый столбец в первой таблице: