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

2 семестр / vba_2002

.pdf
Скачиваний:
97
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Доступ к утилите можно будет получить из меню Сервис. Цель достигнута.

Утилита должна работать с /пекущим диапазоном ячеек (включая множественное выделение) и предоставлять пользователю возможность изменения диапазона ячеек, пока отображено диалоговое окно. Цель достигнута.

Основные возможности утилиты будут состоять из инструментов изменения регист-

ра символов, добавления нового текста в строки, удаления фиксированного количества символов'из текста и удаления пробелов из текста в каждой ячейке. Цель достигнута.

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

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

Утилита не будет вносить изменения в ячейки, которые содержат формулы. Цель достигнута.

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

Цель достигнута.

Пользователю будет предоставлена возможность отмены внесенных изменений.

Цель достигнута, но нестандартными методами.

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

Принципы работы утилиты Text Tools

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

Для получения наилучших результатов можно преобразовать утилиту Text Tools в надстройку. В главе 21 приводится информация о создании надстроек.

Резюме

В этой главе речь шла о причинах создания утилит Excel с помощью VBA. Кроме того, рассматривался пример кода VBA, который используется для создания утилиты Text Tools. По мере накопления опыта программирования в Excel у пользователей возникают новые идеи относительно создания собственных утилит. Эта глава предоставляет достаточный объем информации для "старта" в создании подобных программных продуктов.

ЧастьV.Совершенныеметодыпрограммирования

439

Работа со сводными таблицами

Сводные таблицы являются самым мощным средством Excel. Сводные таблицы впервые появились в Excel 5.

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

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

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

Вступительный пример

Этот раздел начинается с описания простого примера использования кода VBA для создания сводной таблицы.

На рис. 17.1 показана простая база данных на рабочем листе. Она состоит из четырех полей: Представитель, Регион, Месяц и Продажи. Записи представляют объем продаж определенного торгового представителя в каждом из месяцев.

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

На рис. 17.2 показана сводная таблица, которая создана на основе указанных данных. Эта сводная таблица обеспечивает отображение суммарного объема ежемесячных продаж каждого торгового представителя. Сводная таблица содержит следующие поля.

Регион — поле страницы в сводной таблице.

П р е д с т а в и т е л ь — поле строки в сводной таблице.

Месяц — поле столбца в сводной таблице.

Продажи — поле данных в сводной таблице, которое использует функцию Sum (СУММ).

Рис. 17.1. Эта простая база данных м

Рис.17.2. Своднаятаблица,котораясоздананаос-

жетслужитьосновойсводнойтаблицы

новеданных,показанныхнарис.17.1

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

Sub Macrol()

1Записанный макрос Range("Al").Select ActiveWorkbook.PivotCaches.Add _

(SourceType:=xlDatabase, _ SourceData:="flHCTl!RlCl:R13C4"). CreatePivotTable _ TableDestination:="", _ TableName:="СводнаяТаблица1" , „ DefaulCVersion:=xlPivotTableVersionlO

AcCiveSheet.PivotTableWizard _

TableDestination:=ActiveSheet.Cells(3f 1)

ActiveSheet.Cells(3, 1).Select

With ActiveSheet. PivotTables ("СводнаяТаблица1") . _,

PivotFields{"Регион")

.Orientation = xlPageField

.Position = 1

End With

With ActiveSheet.PivotTables(пСводнаяТаблица1"). _

PivotFields("Представитель"}

.Orientation = xlRowField

.Position = 1

End With

ЧастьV.Совершенныеметодыпрограммирования

441

With ActiveSheet.PivotTables("СводнаяТаблица1"). _ PivotFields{"Месяц")

.Orientation = xlColumnField

.Position = 1 End With

ActiveSheet.PivotTables("СводнаяТаблица1") . _

AddDataField ActiveSheet.PivotTables("СводнаяТаблица1"). _ PivotFields("Продажи"), "Сумма по полю Продажи", xlSum

End Sub

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

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

Просмотр созданного кода

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

PivotCaches — коллекция объектон PivotCache в объекте Workbook.

PivotTables — коллекция объектон PivotTable в объекте Worksheet.

PivotFields — коллекция полей в объекте PivotTable.

Pivotltems — коллекция отдельных элементов данных в поле.

CreatePivotTable — метод объекта PivotCache, который создает сводную таблицу на основе данных, содержащихся в кэш-памяти.

Pivot TableWizard — метод объекта Worksheet, который создает сводную таблицу (использование этого метода не является необходимым — см. следующий раздел).

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

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

Листинг17.1. Эффективный кодVBAгенерации своднойтаблицы

Sub CreatePivotTable()

1Вручную созданный макрос Dim PTCache As PivotCache Dim PT As PivotTable

Set PTCache = ActiveWorkbook.Pivotcaches.Add _ {SourceType:=xlDatabase, _ SourceData:=Range{"Al").CurrentRegion.Address)

442

Глава 17. Работа со сводными таблицами

Set PT = PTCache.CreatePivotTable _

(TableDestination:="•, _

TableName:-"СводиаяТаблипа!")

With PT

.PivotFields("Регион").Orientation = xlPageField

.PivotFields("Месяц").Orientation = xlColumnField

.PivotFields("Представитель").Orientation = xlRowField

.PivotFields("Продажи").Orientation = xlDataField End With

End Sub

Процедура CreatePivotTable упрощена (что делает ее более простой в понимании), так как в ней объявляются две переменные объектов: PivotCache и РТ. Эти переменные заменяют собой ссылки ActiveSheet. PivotCaches и ActiveSheet. PivotTablss.

Новый объект PivotCache создается с помощью метода Add. После этого создается объект PivotTable, для чего используется метод CreatePivotTable коллекции PivotCaches. Последняя часть кода добавляет поля к сводной таблице и указывает их расположение (поле страницы, столбца, строки или данных).

Обратите внимание, что первоначальный макрос жестко связан с диапазоном данных, который использовался при создании объекта PivotCache (в данном случае это диапазон "Лист1! RICl :R13C4"). В процедуре CreatePivotTable сводная таблица основывается на текущем диапазоне, окружающем ячейку Al. Это гарантирует, что макрос будет продолжить корректно выполняться даже тогда, когда в диапазон добавлены дополнительные данные.

Данный код можно сделать более универсальным за счет использования индексов вместо названий в коллекции PivotFields. При таком подходе, если пользователь вносит изменения в заголовки столбцов, код продолжает выполняться. Например, в более универсальном макросе используется оператор PivotFields (1) вместо оператора PivotFields ("Регион" ).

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

Создание сложной сводной таблицы

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

Данные

На рис. 17.3 показан фрагмент базы данных на листе. Эта таблица содержит 15840 строк иерархически упорядоченной информации о бюджете корпорации. В корпорации существует пять подразделений, а каждое подразделение содержит по одиннадцать отделов. Каждый отдел имеет четыре бюджетных категории, а каждая категория состоит из нескольких пунктов. Бюджетные и фактические расходы указываются для каждого из двенадцати месяцев.

Часть V. Совершенные методы программирования

443

Fuc. /7.3. Данные в этойрабочей книге будут собраны в сводной таблице

Рис.17,4.Своднаятаблица,котораясоздананаосноведанных,приведенныхнарис.17.3

444

Глава 17. РаботасоСВОДНЫМИтаблицами

Эта рабочая книга доступна на Web-узле издательства.

Сводная таблица

На рис. 17.4 показана сводная таблица, которая создана на основе приведенных выше данных. Обратите внимание на то, что сводная таблица содержит вычисляемое поле, которое называется Разница, а также четыре вычисляемых элемента ( К Б 1 , К Б 2 , КВЗ И КВ4), которые отображают квартальные суммы.

Код создания сводной таблицы

Ниже, в листинге 17.2, приведен код, который использовался для создания этой сводной таблицы.

Листинг 17.2. Создание структурированной своднойтаблицы

Sub CreatePivotTable()

Dim PTcache As PivotCache

Dim PT As PivotTable

On Error Resume Next

Sheets("Лист1")-DrawingObjects{"TextBoxWait").Visible = True

On Error GoTo 0

Application.ScreenUpdating = False

Удаление сводной таблицы, если она существует On Error Resume Next Application.DisplayAlerts m False Sheets("СводнаяТаблица"1-Delete

On Error GoTo 0

1Создание объекта PivotCache

Set PTcache = ActiveWorkbook.PivotCaches.Add( _ SourceType:=xlDatabase, _ SourceData:=Range("Al").CurrentRegion.Address)

' Добавление рабочего листа Worksheets.Add

ActiveSheet.Name = "СводнаяТаблица"

1Создание на основе данных кэш-памяти сводной таблицы Set PT = PTcache.CreatePivotTable( _

TableDestination:=Sheets("СводнаяТаблица"}.Range("Al"), _

TableName:="BudgetPivot")

With PT

'Добавление полей

.PivotFields("Подразделение").Orientation = xlRowField

.PivotFields("Месяц").Orientation = xlColumnField

.PivotFields("Отдел").Orientation = xlPageField

.PivotFields("Бюджет").Orientation = xlDataField

ЧастьV.Совершенныеметодыпрограммирования

445

.PivotFields("Выполнено")-Orientation = xlDataField

1Добавление вычисляемого поля для учета разницы

.CalculatedFields.Add "Разница", "=Бюджет-Выпалнено"

.PivotFields("Разница").Orientation = xlDataField

'Добавление вычисляемых элементов

.PivotFields("Месяц").Calculatedltems.Add "Кв1", "= _ Январь+ ФевралыМарт"

.PivotFields("Месяц").Calculatedltems.Add "Кв2", "= _

АпрелыМай+ Июнь"

.PivotFields("Месяц").Calculatedltems.Add "КвЗ", " = _ Июль+ Август+ Сентябрь"

.PivotFields("MecHU").Calculatedltems.Add ч Ка4", "= _ ОктябрыНоябрыДекабрь"

'Перемещение вычисляемых элементов

.PivotFields("Месяц").Pivotltems("Кв1").Position = 4

.PivotFields{"Месяц").Pivotltems("Кв2").Position = 8

.PivotFields("Месяц").Pivotltems("КвЗ").Position = 12

.PivotFields("Месяц"}.Pivotltems("Кв4").Position = 16

1Изменение подписей

.PivotFields("Сумма по полю Бюджет").Caption = "Бюджет (S)"

.PivotFields{"Сумма по полю Выполнено").Caption = _

"Выполнено (S)"

.PivotFields ("Сумма по полю Разница11) .Caption = "Разница ($)"

End With

Application.ScreenUpdating = True

On Error Resume Next

Sheets{"Лист1").DrawingQbjects("TextBoxWait").Visible = False

End Sub

Как это работает

Вторая процедура CreatePivotTable (листинг 17.2) начинает свою работу с удаления листов Pivotsheet, если они существуют После этого создается объект PivotCache, добавляется новый лист, который называется СводнаяТаблица, и создается сводная таблица. Далее программа добавляет поля к созданной сводной таблице.

И Подразделение — Поле строки.

Месяц — Поле столбца.

Отдел — Поле страницы.

Бюджет — Поле данных.

Выполнено — Поле данных.

Процедура использует метод Add коллекции CalculatedFields для создания вычислимого поля Разница, которое отнимает значение поля Выполнено от значения поля Бюджет. В коде суммируются четыре вычисляемых значения для получения квартальных сумм. По умолчанию вычисляемые значения добавляются в правой части сводной таблицы. Нам же необходимо разместить эти значении возле месяцев, к которым эти значения относят-

446

Глава 17. Работа со сводными таблицами

ся (например, значение Кв1 размещается возле месяца Март). Наконеи, в коде изменяет подписи, которые отображаются в сводной таблице. Например, Сумма по полю Бюджет заменяется на Бюджет ( $ ) .

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

Созданиесводнойтаблицы наоснове внешней базы данных

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

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

Код, который создает сводную таблицу в этом случае, показан в листинге 17.3. Он предполагает, что файл базы данных b u d g e t .mdb хранится в той же папке, что и рабочая книга

Листинг 17.3. Создание сводкойтаблицы на основе информации внешней базы данных

Sub CreatePivotTableFromDB()

Dim PTCache As PivotCache

Dim PT As PivotTable

Dim DBFile As String

Dim ConString As String

Dim QueryString As String

' Удаление сводной таблицы, если она существует On Error Resume Next Application.DisplayAlerts = False Sheets("СводнаяТаблииа").Delete

On Error GoTo 0 Application.DisplayAlerts = True

1Создание объекта PivotCache

Set PTCache = ActiveWorkbook.Pivotcaches.Add _ {SourceType:=xlExternal)

1Подключение к базе данных и создание запроса DBFile = ThisWorkbook.Path & "\budget.mdb"

ConString = HODBC;DSN=MS Access Database;DBQ=" & DBFile QueryString = "SELECT * FROM BUDGET"

With PTCache

.Connection = ConString

Часть V. Совершенные методы программирования

447

.CommandText = QueryString

End With

1Добавление рабочего листа Worksheets.Add

ActiveSheet.Name = "СводнаяТаблица"

'Создание сводной таблицы

Set PT = PTCache.CreatePivotTable( _

TableDestination:=Sheets("СьоднаяТаблица").Range*"Al"), _

TableName:="Budgetpivot"}

Add

fields

With

PT

 

.PivotFields("Подразделение")-Orientation = xlRowField

 

.PivotFields("Месяц").Orientation = xlColumnField

 

.PivotFields("Отдел").Orientation = xlPageField

 

.PivotFields{"Бюджет"}.Orientation = xlDataField

 

.PivotFields("Выполнено")-Orientation = xlDataField

End

With

End Sub

 

Обратите внимание, что аргумент SourceType метода Add коллекции PivotCaches указывается как xlExternal. В примере предыдущего раздела (в котором использовались данные рабочего листа) аргумент SourceType был равен xlDatabase.

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

Строка соединения. Данная строка описывает источник данных и имя файла. В этом примере строка соединения указывает источник данных ODBC, который является файлом Microsoft Access — budget. mdb.

Строка запроса. Это оператор языка SQL, который определяет, какие записи и поля будут получены из базы данных. В динном примере выбирается вся таблица Budget.

Эта информация передается объекту PivotCache в результате определения свойств Connection и CommandText. Как только данные будут сохранены в кэше, с помощью метода CreatepivotTable создается сводная таблица.

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

Создание нескольких сводных таблиц

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

На рис. 17.6 показаны некоторые сводные таблицы, которые получены на основе данных опроса. Каждая сводная таблица предоставляет информацию о распределении оценок для всех утверждений среди респондентов обоих полов.

448

Глава 17. Работа со сводными таблицами

Соседние файлы в папке 2 семестр