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

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

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

Работа с объектами MS Word 173

ActiveDocument.Tables(1).Columns(1).Delete

Изменение фона таблицы

Выделить первую строку первой таблицы штриховкой 15%:

ActiveDocument.Tables(1).Rows(1).Shading.Texture = _

wdTexture15Percent

Создание таблицы

Создать новую таблицу с заданными параметрами и заменить ею фрагмент, определенный выделенной в документе областью (объект Selection):

ActiveDocument.Tables.Add Selection.Range, 4, 3

Автоформат таблицы

Отформатировать таблицу с применением автоформата Список1:

ActiveDocument.Tables(1).AutoFormat wdTableFormatList1

Запись в ячейки таблицы данных

К ячейкам таблицы можно обращаться по номеру строки и столбца, при этом содержимое ячейки представлено Range-объектом. Например, записать в ячейку первого столбца и первой строки строку “Первая ячейка” можно при помощи следующего кода:

ActiveDocument.Tables(1).Cell(1, 1).Range = "Первая ячейка"

Изменение ширины столбцов таблицы

Задать для всех столбцов первой таблицы ширину, равную 33 пунктам:

For N = 1 To ActiveDocument.Tables(1).Columns.Count

ActiveDocument.Tables(1).Columns(N).Width = 33

Next N

Выровнять все столбцы по ширине:

ActiveDocument.Tables(1).Columns.DistributeWidth

Выравнивание текста в таблице

Задать для первой строки выравнивание текста по центру:

ActiveDocument.Tables(1).Rows(1).Alignment = wdAlignRowCenter

Добавление заголовка таблицы

Сделать первую строку заглавной:

ActiveDocument.Tables(1).Rows(1).HeadingFormat = True

Автосуммирование ячеек таблицы

Вставить в ячейку (2, 3) поле автосуммирования, которое будет отображать сумму значений в ячейках выше или левее:

ActiveDocument.Tables(1).Cell(2, 3).AutoSum

174 Глава 7. В мире объектов MS Office

Разбиение ячеек таблицы

Разбить ячейку (2, 3) на 4 ячейки:

ActiveDocument.Tables(1).Cell(2, 3).Split 2, 2

Word-списки

Списки в документе Word устроены несколько иным образом. Такого объекта, как список, не существует. Абзацы, составляющие список, являются обычными абзацами документа, и когда речь идет о списке, то имеется в виду форматирование ряда абзацев.

Объект ListFormat

Форматирование для каждого абзаца списка определяется объектом ListFormat, который доступен в качестве свойства текстового диапазона.

Чтобы отформатировать некоторый фрагмент текста, как список, необходимо, прежде всего, определить Range-объект, заключающий в себе этот диапазон. Например, для того чтобы отформатировать как список абзацы с 5-го по 10-й, можно создать переменную MyRange типа Range, которой следует присвоить в качестве значения необходимый диапазон — диапазон с начала 5-го абзаца по конец 10-го:

Dim MyRange As Range

...

Set MyRange = ActiveDocument.Range( _

Start:= ActiveDocument.Paragraphs(5).Range.Start, _ End:= ActiveDocument.Paragraphs(10).Range.End)

Затем можно будет воспользоваться свойством ListFormat заданного при помощи переменной MyRange диапазона, чтобы отформатировать абзацы 5-10, как маркированный список:

MyRange.ListFormat.ApplyListTemplate _ ListTemplate:=ListGalleries(wdBulletGallery) _

.ListTemplates(1)

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

ActiveDocument.Lists(2).ListParagraphs(1).Range.Bold = True

Работа с объектами MS Excel

С точки зрения VBA-программирования, Excel занимает особенное место среди всех приложений MS Office. Дело в том, что вообще язык Visual Basic для приложений, как таковой, был первоначально задуман и создан именно для Excel. Позднее сфера действия VBA была распространена и на другие приложения Office, однако “родной” для VBA остается все же рабочая среда Excel. Из этого обстоятельства можно сделать два вывода.

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

Второй вывод: именно у пользователей Excel в первую очередь возникла потребность в макроязыке, при помощи которого можно было бы автоматизировать свою работу, и поэтому, с объективной точки зрения, Excel и есть то самое приложение, где макросы VBA нужнее всего. В самом деле, Excel и VBA — очень гармоничная пара, гармоничная в самом глубоком смысле. Подобно тому, как VBA не является “настоящим” языком программирования (ведь сила VBA — не в широте его возможностей, а в простоте и непритязательности — в среде Office он повсюду, и повсюду,

Работа с объектами MS Excel 175

в любой ситуации, можно опереться на его программный код), электронная таблица Excel не являются “настоящей” базой данных, и сила Excel в том, что он обеспечивает, пусть не академически строгую и сверхмощную, как в Access, однако живую работу с табличными данными, где все делается запросто и все происходит на глазах у пользователя.

Работа с объектами Excel на уровне приложения, рабочей книги и листа

Объект Application

Объект Application, как это было и в случае с Word, представляет приложение Excel в целом. Свойство Caption определяет заголовок окна приложения:

Application.Caption = "Обзор цен за 2000 год"

Свойства Workbooks, ActiveWorkbook и ThisWorkbook

В свойстве Workbooks содержится семейство открытых рабочих книг, а в свойстве Worksheets — семейство рабочих листов, но рабочих листов не всех открытых книг, а только активной книги. Соответственно, свойство ActiveWorkbook указывает на активную рабочую книгу. А вот свойства ActiveWorksheet не существует, — вместо него используют свойство ActiveSheet, которое указывает на активный лист активной книги (все листы книги — не только рабочие листы, но и листы диаграмм, содержатся в семействе Sheets).

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

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

Метод SaveAs

Сохранить текущую (активную) рабочую книгу в файле с заданным именем:

Application.ActiveWorkbook.SaveAs "MyWorkBook"

Метод Activate

Сделать активной вторую из открытых книг:

Application.Workbooks(2).Activate

Метод Close

Закрыть книгу с именем MyBook без сохранения изменений:

Application.Workbooks(“MyBook”).Close SaveChanges:=False

Метод Open

Открыть книгу, хранящуюся в файле с заданным именем:

Application.Workbooks.Open “C:\MyBook.xls”

Свойство ActiveSheet

Свойство ActiveSheet объекта Application возвращает активный лист активной книги. Если ни один из листов не активен, свойство вернет значение Nothing. При обращении к этому свойству необходимо учитывать два обстоятельства. Первое: одноименным свойством обладает

176 Глава 7. В мире объектов MS Office

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

вернет объект иного типа, чем Worksheet и макрос, обращающийся к свойствам рабочего листа, “потерпит неудачу“.

Свойство Name

Изменить имя текущего листа:

Application.ActiveSheet.Name = "Январь"

Свойство DisplayScrollBars: пример сокрытия полос прокрутки

Многие свойства объекта Application отвечают за внешний вид и поведение окна приложения, за различные параметры рабочей среды Excel. Например, следующий код запрещает отображение полос прокрутки и строки состояния:

Application.DisplayScrollBars = False

Application.DisplayStatusBar = False

Свойство StatusBar

Свойство StatusBar отвечает за текст строки состояния в окне Excel:

Application.StatusBar = "Работает макрос, ждите..."

Увеличить масштаб активного окна

Увеличить масштаб активного окна на 50 % можно при помощи следующего оператора:

Application.ActiveWindow.Zoom = 150

Свойство FixedDecimal

Включить режим “фиксированный десятичный формат при вводе” и задать число десятичных разрядов, равным 2:

Application.FixedDecimal = True

Application.FixedDecimalPlaces = 2

Метод Calculate

Выполнить принудительный пересчет всех рабочих листов всех открытых книг:

Application.Calculate

Семейство Sheets

Семейство Sheets заключает в себе все листы активной рабочей книги. Обращаться к элементам семейства можно по номерам или именам.

Метод Add

При помощи метода Add можно создавать новые листы. Например, вставить в книгу 12 новых листов и присвоить им имена, соответствующие названиям 12 месяцев года, можно при помощи следующего кода:

ActiveWorkbook.Sheets.Add Count:=12

For N = 1 To 12

ActiveWorkbook.Sheets(N).Name = _

Работа с объектами MS Excel 177

Format(DateSerial(1, N, 1), "mmmm")

Next N

Вставка листа диаграммы

По умолчанию в семейство Sheets добавляются рабочие листы. Однако, если указать тип вставляемого листа явным образом, то можно вставить лист другого типа. Например, вставить лист диаграммы перед последним листом рабочей книги можно посредством оператора:

ActiveWorkbook.Sheets.Add _

Before:=Worksheets(Worksheets.Count) Type:=xlChart

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

Метод Delete

Удалить лист можно при помощи метода Delete:

Worksheets("Обзор1998").Delete

Свойство Visible

Скрыть лист можно при помощи свойства Visible:

Worksheets("Обзор1999").Visible = False

Метод Move

Метод Move перемещает лист в заданную позицию в книге. Переместить лист “Обзор2000” в конец книги:

Worksheets("Обзор").Move , Worksheets(Worksheets.Count)

Метод Copy

Метод Copy копирует лист в заданную позицию в книге. Скопировать лист “Бланк” в позицию после листа “Обзор2000”:

Worksheets("Бланк").Copy , Worksheets("Обзор2000")

Метод Quit

Метод Quit завершает работу приложения Excel:

Application.Quit

Работа с содержимым рабочего листа

Объект Range

Основным рабочим инструментом для операций с содержимым рабочего листа при помощи VBA является объект Range. Объект такого типа возвращают как одиночные ячейки листа, так и диапазоны ячеек.

Задание диапазона

Задать диапазон Range можно различными способами. Например, выражение

178 Глава 7. В мире объектов MS Office

ActiveSheet.Range("A3")

вернет ячейку A3 текущего рабочего листа. Если ячейка A3 активна, то есть выбрана, то тот же самый Range-объект вернет выражение

ActiveCell

Свойство Offset

Свойство Offset позволяет задавать относительное смещение и также возвращает Range- объект. Выделить ячейку на три столбца правее текущей:

ActiveCell.Offset(0, 3).Select

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

ActiveSheet.Range("A3:B5")

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

ActiveSheet.Range("ИмяДиапазона")

Объект типа Range на рабочем листе Excel многолик и вездесущ — весь текущий рабочий лист ActiveSheet представлен Range-объектом, диапазон на нем ActiveSheet.Range("ИмяДиапазона") — это тоже Range-объект, и некоторая ячейка это-

го диапазона ActiveSheet.Range("ИмяДиапазона").Cells(N, M) — это тоже Range-

объект!

Свойство Cells

Свойством (семейством) Cells обладают все Range-объекты. По умолчанию Cells(M, N) означает ячейку в M-й строке и N-м столбце рабочего листа, но точно таким же образом можно обратиться к ячейкам любого диапазона. Например, выражение

ActiveSheet.Range("A3:B5").Cells(2, 2)

вернет ячейку B4.

Очень часто требуется указывать диапазоны в циклических конструкциях типа For. Чтобы можно было при задании диапазона пользоваться номерами строк и столбцов, Range-объект

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

ActiveSheet.Range(Cells(1, 2), Cells(3, 4))

задает диапазон ячеек “B1:E3”.

Свойство EntireColumn

Свойство Range-объекта EntireColumn возвращает Range-объект, представляющий весь столбец, к которому принадлежит указанный диапазон. Например, следующая строка кода удаляет весь текущий столбец:

ActiveCell.EntireColumn.Delete

Свойство EntireRow

Аналогичную функцию выполняет свойство EntireRow в отношении строк. Например, следующая строка кода удаляет всю строку:

Работа с объектами MS Excel 179

ActiveCell.EntireRow.Delete

Свойство UsedRange

Свойство UsedRange возвращает Range-объект, представляющий использованный диапазон ячеек на листе. Например, следующая строка кода сообщает адрес использованной области:

MsgBox ActiveSheet.UsedRange.Address

Удаление диапазона со сдвигом оставшихся ячеек влево

При обращении к методу Delete можно указать при помощи специальных констант направление сдвига остающихся ячеек. Удалить диапазон “A3:D6” со сдвигом оставшихся ячеек влево:

Range("A3:D6").Delete xlShiftToLeft

Метод Insert: пример вставки диапазона со сдвигом оставшихся ячеек вправо

Аналогичным образом указывается направление сдвига при вставке ячеек. Вставить диапазон со сдвигом ячеек вправо:

Range("A3:D6").Insert xlShiftToRight

Доступ к содержимому ячеек и диапазонов

Доступ к содержимому ячеек и диапазонов, то есть к содержащимся в них формулам, ссылкам и константам, а также форматирование ячеек и диапазонов осуществляется посредством свойств объекта Range.

Запись в ячееку значения

Записать значение 15 в ячейку A3:

ActiveSheet.Range("A3") = 15

Свойство Formula

Свойство Formula позволяет поместить в ячейку формулу:

Range("A11").Formula = "=SUM(A1:A10)”

Свойство FormulaLocal

При работе с формулами посредством кода VBA необходимо учитывать одно обстоятельство. Например, в русской версии Office присваивание

Range("A11").Formula = "=СУММ(A1:A10)”

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

FormulaLocal:

Range("A11").FormulaLocal = "=СУММ(A1:A10)”

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

180 Глава 7. В мире объектов MS Office

Стиль ссылок R1C1

Свойство FormulaR1C1 (а также его локальный аналог FormulaR1C1Local) позволяет записать формулу со стилем ссылок R1C1:

ActiveSheet.Range("B1").FormulaR1C1 = "=SQRT(R1C1)"

Свойство FormulaHidden

Если включена защита листа, то при помощи свойства FormulaHidden можно скрыть формулы. Например, следующая строка кода позволяет скрыть формулы в столбце:

Worksheets("Sheet1").Columns("A").FormulaHidden = True

Свойство Value

Свойством по умолчанию (то есть, свойством, имя которого можно во многих случаях не упоминать) для Range-объекта является свойство Value. Здесь содержится значение ячейки, если в ячейку записана константа. Если в ячейке содержится формула, то свойство Value вернет результат вычисления по формуле.

Например, следующая строка кода выводит на экран окно со значением из ячейки A3:

MsgBox Range("A3").Value

Метод AutoFill: автозаполнение диапазона

Метод AutoFill позволяет применить к диапазону автозаполнение. В качестве параметров необходимо указать границы заполнения и константу, определяющую вид заполнения. Например, следующий код заполнит диапазон A8:A19 названиями месяцев года:

Range("A8") = "Январь"

Range("A8").AutoFill Range("A8:A19"), xlFillMonths

Форматирование ячеек

Форматирование ячеек также осуществляется посредством свойств соответствующих Range- объектов. Например, снабдить ячейку A3 линиями можно при помощи оператора:

Range("A3").Borders.LineStyle = xlContinuous

Свойство ColumnWidth

Свойство ColumnWidth определяет ширину столбца. Единицей измерения служит ширина символов стиля Обычный. Если речь идет о пропорциональных шрифтах, то имеется в виду ширина символа равная нулю. Таким образом, последовательность "0123456789" идеально поместится в ячейку шириной 10. Следующая строка кода задает для текущего столбца ширину, равную 10 символам:

ActiveCell.ColumnWidth = 10

Свойство RowHeight

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

Свойство Font

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

Работа с объектами MS Excel 181

Отформатировать шрифт в диапазоне можно, например, следующим образом:

With Range("A3:D9").Font

.Bold = True

.Shadow = True

.Name = "Arial"

.Size = 16 End With

Свойства Bold, Shadow, Name и Size

Свойства Bold и Shadow определяют, соответственно, признак начертания “жирный” и эффект “с тенью”, а свойства Name и Size задают имя и размер шрифта.

Объект Interior

Объект Interior, содержащийся в одноименном свойстве Range-объекта, определяет черты “внутреннего” форматирования ячейки, как таковой. Например, задать цвет фона для ячейки и залить ее узором можно при помощи такого кода:

With Range("A3:D7").Interior

.Color = RGB(192, 164, 12)

.Pattern = xlPatternLightDown End With

Свойство Locked

Свойство Locked разрешает (False) или запрещает (True) модификацию содержимого ячеек в ситуации, когда лист в целом защищен от внесения изменений. Разрешить модификацию ячеек:

Range("A3:C9").Locked = False

Свойство Style

Свойство Style определяет стиль, заданный для ячеек диапазона. Например:

Range("A3").Style = "Процентный"

Очистка диапазона

Очистить диапазон можно при помощи одного из следующих методов. Очистить все:

Range("A5:A10").Clear

Очистить содержимое (не влияет на примечания и форматирование ячеек):

Range("A5:A10").ClearContents

Очистить форматы (не влияет на содержимое):

Range("A5:A10").ClearFormats

Объект Characters

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

182 Глава 7. В мире объектов MS Office

Range("A3").Characters(3, 2).Font.Bold = True

Работа с объектами MS Access

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

Работа со структурой базы данных Access

Объекты Database (база данных), TableDef (определение таблицы) и семейство Field (поля таблицы)

База данных в целом представлена объектом типа Database. Объекта “таблица” не существует. Доступ к таблицам осуществляется через посредство объектов TableDef (определение таблицы). Объекты типа Field, объединенные в семейство Field соответствующего объекта TableDef, представляют поля таблицы.

Предположим, что нужно изменить при помощи кода VBA (неважно, где он расположен — в программном модуле Access или, например, при условии задания соответствующих ссылок, в рабочей книге Excel) структуру базы данных MyOffice, файл которой расположен в корневом каталоге диска C:. Допустим, нужно добавить в таблицу “Клиенты” еще одно поле — текстовое поле “Примечания” для заметок. Вот какие, в этом случае, нужно было бы выполнить действия.

Объявление переменных типа база данных, определение таблицы и поле таблицы

Сначала необходимо объявить переменные: базу данных, определение таблицы и поле табли-

цы.

Dim MyDB As Database, MyTDF As TableDef, MyFLD As Field

Метод OpenDatabase: открытие базы данных

Затем следует открыть базу данных, содержащуюся в файле C:\MyOffice.mdb:

Set MyDB = OpenDatabase("C:\MyOffice.mdb")

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

Set MyTDF = MyDB.TableDefs("Клиенты")

Метод CreateField объекта TableDef: добавление текстового поля

Затем, при помощи метода CreateField объекта TableDef, можно добавить текстовое поле с заданным именем заданного размера (константа dbText указывает на тип поля):

Set MyFLD = MyTDF.CreateField("Примечание", dbText, 200)

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