[Excel (VBA) Сводные таблицы. Создание. Обновление. / Visual Basic / Sql.ru] хорошо, посмотри! http://www.sql.ru/forum/236836/excel-vba-svodnye-tablicy-sozdanie-obnovlenie
Sub SvodTable() Dim i As Integer Dim s As String Sheets("Работы").Activate Sheets("Работы").Unprotect ' определяю диапазон исходной таблицы ActiveSheet.Unprotect ActiveSheet.Cells(2, 2).Select i = 2 While ActiveSheet.Cells(i, 2).Formula <> "" i = i + 1 Wend 'Range(Cells(2, 2), Cells(i - 1, 16)).Select s = "Работы!" & Range(Cells(2, 2), Cells(i - 1, 16)).Address(ReferenceStyle:=xlR1C1) ' на основе диапазона строю сводную (в этой строке вылетает ошибка -Недопустимое имя сводной таблицы..) ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ s).CreatePivotTable TableDestination:="", TableName:= _ "СводнаяТаблица1", DefaultVersion:=xlPivotTableVersion10 ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1) ActiveSheet.Cells(3, 1).Select ActiveSheet.PivotTables("СводнаяТаблица1").AddFields RowFields:=Array( _ "ФИО сотрудника", "Наименование услуги", "Данные"), ColumnFields:="Месяц" With ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("Итого, руб.") .Orientation = xlDataField .Caption = "Сумма по полю Итого, руб." .Position = 1 .Function = xlSum End With With ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("Итого, у.е.") .Orientation = xlDataField .Caption = "Сумма по полю Итого, у.е." .Function = xlSum End With ActiveWorkbook.ShowPivotTableFieldList = True End Sub
Можно так.
Dim i As Long, strSource$
i = [a1].End(xlDown).row strSource = "'" & ActiveSheet.Name & "'!" & Range(Cells(1, 1), Cells(i, 3)).Address(ReferenceStyle:=xlR1C1)
Sheets.Add.Name = "Table1" ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
Sheets.Add.Name = "Table1" ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
strSource, VERSION:=xlPivotTableVersion15).CreatePivotTable _
TableDestination:="Table1!R1C1", TableName:="СводнаяТаблица", _ DefaultVersion:=xlPivotTableVersion15
Усовершенствование записанного кода сводной таблицы Как и в случае с большинством записанных макросов, предыдущий пример не настолько эффективен, как следовало бы ожидать. Как уже отмечалось, его выполнение может завершиться ошибкой. В принципе, его желательно упростить, чтобы сделать немного понятнее, а также исключить возможность появления ошибок. Ниже приведен код, переписанный вручную, который создает ту же сводную таблицу, что и макрос из предыдущего раздела.
Sub CreatePivotTable()
Dim PTCache As PivotCache
Dim PT As PivotTable
' Создание области кэша
Set PTCache = ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=Range("A1").CurrentRegion)
'Добавление нового листа в сводную таблицу
Worksheets.Add
Создание сводной таблицы
Set PT = ActiveSheet.PivotTables.Add( _
PivotCache:=PTCache, _
TableDestination:=Range("A3"))
Определение полей
With PT
.PivotFields("Регион").Orientation = xlPageField
.PivotFields("Месяц").Orientation = xlColumnField
.PivotFields("Торговый представитель") _
.Orientation = xlRowField
.PivotFields("Продажи").Orientation = xlDataField
'заголовки полей отсутствуют
.DisplayFieldCaptions = False
End With
End Sub
В данном случае процедура CreatePivotTable была упрощена (что облегчило ее понимание) благодаря объявлению двух переменных объекта: PTCache и PT. Новый объект PivotCache был создан с помощью метода Create. Также был добавлен рабочий лист, который стал активным (на этом листе размещается сводная таблица). Затем был создан объект PivotTable с помощью метода Add из коллекции PivotTables. В последнем фрагменте кода добавляются поля в сводную таблицу, а также задается их положение в таблице путем присвоения значения свойству Orientation. Обратите внимание на то, что исходный макрос жестко привязан к диапазону данных, на основе которого создается объект PivotCache ('Лист1!R1C1:R13C4'), и к местоположению сводной таблицы (Лист2). В процедуре CreatePivotTable сводная таблица основана на текущем диапазоне, окружающем ячейку A1. Это гарантирует, что макрос будет выполняться даже тогда, когда в диапазон добавлены дополнительные данные. Добавление рабочего листа до того, как была создана сводная таблица, исключает необходимость жесткого кодирования ссылки на лист. Еще одно отличие заключается в том, что написанный вручную макрос не определяет имя сводной таблицы. Да это и не требуется, поскольку используется переменная объекта PT, которая выполняет эту задачу.
Комментариев нет:
Отправить комментарий