Страницы: 1 2 След.
RSS
Определение диапазона заполненного данными (VBA)
 
Всем привет.  
 
Записываю макрос создания сводной:  
 
 
Sub Макрос1()  
'  
' Макрос1 Макрос  
' Макрос записан 16.11.2011 (Serge 007)  
'  
 
'  
      ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _  
          "Лист1!R1C1:R2C2").CreatePivotTable TableDestination:="", TableName:= _  
          "СводнаяТаблица1", DefaultVersion:=xlPivotTableVersion10  
      ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)  
      ActiveSheet.Cells(3, 1).Select  
End Sub  
 
 
Что не нравится? То что диапазон задаётся абсолютный "Лист1!R1C1:R2C2", но в следующий раз диапазон будет другим. Да и лист может по другому называться. Как сделать, что бы макрос сам определял кол-во заполненных строк и столбцов АКТИВНОГО листа и использовал их при создании сводной?  
 
Кроме того, сводная, по умолчанию, создаётся с названием "СводнаяТаблица1", но если сводная с таким названием уже есть в этом файле, то макрос выдаст ошибку. Как этого избежать?  
 
ЗЫ На самом деле важен только первый пункт, второй - это исключение из правил :)
 
Может именованный (динамический) использовать?
 
может так  
 
Range("A1").CurrentRegion.Address  
 
он же    
 
[A1].CurrentRegion.Address
 
Серёг, а может примерчик выложишь в Excel'e ? А мы поиграемся
 
{quote}{login=Юрий М}{date=16.11.2011 11:37}{thema=}{post}Может именованный (динамический) использовать?{/post}{/quote}Не, как это формулами сделать, я знаю.  
Интересно именно на ВБА.
 
{quote}{login=}{date=16.11.2011 11:40}{thema=}{post}Серёг, а может примерчик выложишь в Excel'e ? А мы поиграемся{/post}{/quote}А какой пример?  
Неизвестного диапазона? Боюсь мне его трудно будет нарисовать, потому как он неизвестен ;-)
 
{quote}{login=Flash}{date=16.11.2011 11:39}{thema=}{post}может так  
 
Range("A1").CurrentRegion.Address  
 
он же    
 
[A1].CurrentRegion.Address{/post}{/quote}
А куда это пихать?  
И почему А1?  
Диапазон же может с любой ячейки начинаться?
 
{quote}{login=}{date=16.11.2011 11:40}{thema=}{post}Серёг, а может примерчик выложишь в Excel'e ? А мы поиграемся{/post}{/quote}Паш, ты что-ли опять?  
Я говорил уже, с анонимами общаться не люблю :-)
 
Сводная всегда создаётся на основе каких-то данных. Конечно, эти данные могут начинаться и с C50, а не с А1. Это уже тонкости в которые мы вдаваться не будем, т.к. у вас вопросы по другой теме.  
 
Нам нужен пример ваших данных, на основе которых вы создаёте Сводную. Мы тоже хотим макросом попробовать создать сводную и посмотреть, что у нас получится и если получится дать ответ на форум.  
 
P.S. [A1].CurrentRegion.Address сувать в SourceData, только ещё название листа надо подставить
 
эх, я, Серёг, я )  
 
Я тут уже в своих никах запутался, поэтому иногда вообще ничего не пушу ))
 
Dim WSD As Worksheet  
   Dim PTCache As PivotCache  
   Dim PT As PivotTable  
   Dim PRange As Range  
   Dim FinalRow As Long  
     
' Задать диапазон исходных данных и создать  
   ' объект кэша сводных таблиц. В данных 8 столбцов  
   FinalRow = WSD.Cells(65536, 1).End(xlUp).Row  
   Set PRange = WSD.Cells(1, 1).Resize(FinalRow, 8)  
   Set PTCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=PRange.Address)
 
{quote}{login=}{date=16.11.2011 11:49}{thema=}{post}Сводная всегда создаётся на основе каких-то данных.{/post}{/quote}Ага. И эти данные (и их расположение)заранее не известны.  
Как я могу приложить пример данных, которые ЗАРАНЕЕ неизвестны?!
 
{quote}{login=Serge 007}{date=16.11.2011 11:41}{thema=Re: }{post}{quote}{login=Юрий М}{date=16.11.2011 11:37}{thema=}{post}Может именованный (динамический) использовать?{/post}{/quote}Не, как это формулами сделать, я знаю. Интересно именно на ВБА.{/post}{/quote}А где я говорил, что формулами?
 
{quote}{login=хто-то}{date=16.11.2011 11:51}{thema=}{post}  
Я тут уже в своих никах запутался, поэтому иногда вообще ничего не пишу )){/post}{/quote}А зря. Паш, регся. А если кто доставать будет - то ТЫ НИКОМУ НЕ ОБЯЗАН!!!
 
{quote}{login=Юрий М}{date=17.11.2011 12:02}{thema=Re: Re: }{post}А где я говорил, что формулами?{/post}{/quote}А что, можно динамический диапазон на ВБА?  
Юр, буду обязан, я не знал.
 
{quote}{login=Kuzmich}{date=16.11.2011 11:59}{thema=Re}{post}Dim WSD As Worksheet  
   Dim PTCache As PivotCache  
   Dim PT As PivotTable  
   Dim PRange As Range  
   Dim FinalRow As Long  
     
' Задать диапазон исходных данных и создать  
   ' объект кэша сводных таблиц. В данных 8 столбцов  
   FinalRow = WSD.Cells(65536, 1).End(xlUp).Row  
   Set PRange = WSD.Cells(1, 1).Resize(FinalRow, 8)  
   Set PTCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=PRange.Address){/post}{/quote}  
Это макрос?  
А где Sub?
 
Это кусочек макроса,  
определяющий диапазон исходных данных
 
А так  
 
Activesheet.UsedRange.Address - это адрес заполненного диапазона ) Мимо не промахнётся ))
 
{quote}{login=Kuzmich}{date=17.11.2011 12:10}{thema=Re}{post}Это кусочек макроса,  
определяющий диапазон исходных данных{/post}{/quote}Kuzmich, я же ноль в макросах :-)  
Можно его целиком?
 
Серёг, нельзя написать макрос, не видя структуру таблицы. Либо обходиться общими путями, как я уже писал Activesheet.UsedRange.Address
 
Либо искать его границы, например, так  
 
Последний заполненный столбец в 1-ой строке    
 
FinalCol = Cells(1, Columns.Count).End(xlToLeft).Column  
 
последняя заполненная строка в 1-м столбце  
 
iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
 
{quote}{login=хто-то}{date=17.11.2011 12:15}{thema=}{post}Серёг, нельзя написать макрос, не видя структуру таблицы.{/post}{/quote}Паш, ну нет этой структуры...  
Она каждый раз новая...  
В этом и вопрос: Как макросом определить кол-во заполненных строк и столбцов.  
 
Формулами это просто, но надо именно макросом...
 
Кстати, могу выложить книгу в PDF формате,    
 
Создание сводных таблиц с помощью VBA.pdf  
 
http://webfile.ru/5673436
 
Пример из книги Билла Джелена  
"Применение VBA и макросов в Microsoft Exsel."  
Учитесь создавать сводную на VBA.
 
Серж, я не спец. по сводным, но вот я о чём - у тебя в коде указываются конкретные ячейки диапазона:  
SourceData:= "Лист1!R1C1:R2C2")  
Создаём известным способам динамический диапазон, а коде указываем его в качестве источника:  
SourceData:= "МойДиапазон"
 
Сегодня я уже пас, завтра отвечу.
 
Серег, мы с Алексом на твоем форуме выкладываи в "Файл распух...":  
lAntR = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row    
iAntK = Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column  
Так лучше находить последние, если первые не знамо где. Кстати, так можно находить и первые, немного изменив условия поиска. Для участников топика детализировать нет смысла, кто захочет, сам разберется;-)
Я сам - дурнее всякого примера! ...
 
Спасибо, попробую разобраться.
 
Только что получил решение. На первый взгляд то что нужно.  
Кому интересно:  
http://www.excelworld.ru/forum/2-1005-1#11188
 
Еще такой вариант:  
 
Sub CreatePT()  
   
 Dim PT As PivotTable, Rng As Range, Sh As Worksheet, UsedRng As Range  
   
 ' Задать лист, на котором предполагется создать сводную  
 Set Sh = ActiveSheet  
   
 ' Удалить все сводные с листа (для примера)  
 For Each PT In Sh.PivotTables  
   PT.TableRange2.Clear  
 Next PT  
   
 ' Определить диапазон используемых ячеек листа полсле удаления сводных  
 Set UsedRng = Sh.UsedRange  
   
 ' Задать динамический диапазон ячеек, примыкающих к первой ячейке данных  
 Set Rng = UsedRng.Cells(1).CurrentRegion  
   
 ' Проверить, что не промахнулись  
 If Rng.Cells.Count < 4 Then  
   Rng.Select  
   MsgBox "Слишком мало ячеек для сводной", vbExclamation  
   Exit Sub  
 End If  
   
 ' Создать новую таблицу правее диапазона на 1 столбец  
 Set PT = Sh.Parent.PivotCaches.Add(xlDatabase, Rng.Address).CreatePivotTable(UsedRng.Cells(1, UsedRng.Columns.Count + 1), DefaultVersion:=xlPivotTableVersion10)  
   
 ' Активировать 1-ю ячейку созданной сводной таблицы  
 PT.TableRange2.Cells(1).Select  
 PT.Name = "Сводная 007" ' 'закомментировать, чтобы имя давал Excel  
   
 ' Сообщить  
 MsgBox "Создана сводная таблица:" & vbLf & PT.Name  
   
End Sub
Страницы: 1 2 След.
Читают тему
Наверх