Сводная таблица по средствам VBA

Автор Илья, 03 июня 2014, 15:49

Илья

Здравствуйте! Нужна помощь!
Макрорекордером "нарисовал" код для создания сводной таблицы, в нем диапазон A1:AT100 фиксированный, но в таблице он постоянно увеличивается: A1:AT101, A1:AT102... и т.д.
Как изменить код, дабы в нем использовался реальный диапазон?
Заранее спасибо!

Спойлер
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "'Лист1'!A1:AT100)").CreatePivotTable TableDestination:= _
        "'[Таблица.xls]Сводная таблица'!R4C1", TableName:="СводнаяТаблица4", _
        DefaultVersion:=xlPivotTableVersion10
    ActiveWorkbook.ShowPivotTableFieldList = True
[свернуть]

Администратор

Илья, Ваша проблема в данном случае - это определение последней строки, в которой есть данные.

Эта распространённая задача - почти в каждом макросе нужно определять последнюю строку. Но на удивление, в VBA-Excel нет готового инструмента для решения этой задачи. Поэтому существует несколько способов определения последней строки (я думаю, что способов 5 есть).

Я использую в основном способ с использованием команды "Find". Этот способ позволяет определять последнюю строку без учёта форматирования (например, без учёта заливки ячеек), т.е. позволяет находить последнюю строку с данными.

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

Код
Sub Procedure_1()

    'Поиск в скрытых строках не ведётся.
        'Например, скрытые строки могут быть в результате применения
        'автофильтра. Если это неправильно, то нужно внести изменения в макрос.

    Dim lngEndRow As Long
   

    'Определение последней строки.

    'У команды "Find" нужно указывать все параметры, т.к. команда "Find"
        'связана с программой "Excel", с окном "Найти и заменить".
        'Поэтому если не указывать все параметры, то установки окна "Найти и заменить"
        'могут повлиять на поиск.
    'Знак "?" в данном случае это специальный символ,
        'который означает "один любой символ".
    'SearchOrder:=xlByRows - поиск по строкам. Это означает,
        'что в каком столбце будет раньше найдено, по тому столбцу и
        'будет определена последняя строка.
    'SearchDirection:=xlPrevious - поиск снизу вверх.
    lngEndRow = Range("'Лист1'!A:B").Find(What:="?", LookIn:=xlValues, LookAt:=xlPart, _
        SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False, _
        SearchFormat:=False).Row
   
    'Просто любой код для проверки.
    'Результат выводится в View - Immediate Window.
    Debug.Print Range("'Лист1'!A1:B" & lngEndRow).Address

End Sub
[свернуть]

Илья

Спасибо за идею, все получилось!