#excel #vba #pivot-table
#excel #vba #сводная таблица
Вопрос:
Сначала я надеюсь, что вы сможете понять мой английский 🙂
И я заранее благодарю вас за то, что прочитали мою проблему.
У меня проблемы с одной из моих книг (Excel 2013).
Я не могу дать вам источник, но я попытаюсь объяснить.
Сначала у меня был TCD, построенный на ListObject, набор записей заполняет Listobject, который был источником моей сводной таблицы. Но иногда было слишком много строк для обработки listobject…
Поэтому, чтобы избежать этого, я переключился на копирование моего набора записей в сводный кэш, который теперь использовался для создания сводной таблицы. Это делается для того, чтобы избавиться от ограничения Excel в 1 млн строк. Это работает… иногда.
Иногда Excel не позволяет мне добавлять определенное сводное поле в мою сводную таблицу, назовем его «SEQ», в нем говорится, что слишком много уникальных элементов.
Но если я удваиваю клик по общему итогу моей сводной таблицы, он детализирует мне 260 тыс. строк, которые создали сводный кэш на новом листе (это тот же результат моего sql-запроса). И если я создам новую сводную таблицу в этом диапазоне, тогда все в порядке, и я могу добавить поле SEQ.
Это странно ! Я обнаружил это ограничение в сводной таблице: максимальное количество уникальных элементов в сводной таблице — 1 048 576. Но у меня не так много строк, и только 67 тыс.
Почему Excel считает, что у меня слишком много уникальных элементов при использовании слишком сводного кэша из набора записей, но не тогда, когда сводный кэш основан на диапазоне на листе?
Надеюсь, я был достаточно ясен.
Редактировать: вот некоторый код, как указано
Объявлено в доступном модуле :
Public cnn As New ADODB.Connection
Public objcmd As New ADODB.Command
В функции, которая извлекает данные и создает PT :
Req = "SELECT * FROM TABLE"
objcmd.CommandText = Req
Set RS = objcmd.Execute
Set objPivotCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
Set objPivotCache.Recordset = RS
With objPivotCache
.CreatePivotTable TableDestination:=Range("A8"), TableName:="TCDDirect1"
End With
With Sheets("Données").PivotTables("TCDdirect1").PivotFields("ETATR")
.Orientation = xlRowField
.Position = 1
End With
With Sheets("Données").PivotTables("TCDdirect1").PivotFields("FAMR")
.Orientation = xlRowField
.Position = 2
End With
With Sheets("Données").PivotTables("TCDdirect1").PivotFields("SEQ") <---- Program stop here in some cases
.Orientation = xlRowField
.Position = 3
End With
With Sheets("Données").PivotTables("TCDdirect1").PivotFields("LIBELLé")
.Orientation = xlRowField
.Position = 4
End With
Комментарии:
1.
I switched to copying my Recordset in a pivotcache
Как вы создаете набор записей и копируете его в сводный кэш? Можем ли мы увидеть какой-нибудь код для начала?2.
Set objPivotCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal) Set objPivotCache.Recordset = RS With objPivotCache .CreatePivotTable TableDestination:=Range("A8"), TableName:="TCDdonnées" End With
3. Я не могу заставить код работать, извиняюсь за плохую презентацию.
4. Набор записей заполняется подключением adodb
5. Все в порядке, если я скопирую свой набор записей на лист, а затем построю свою сводную таблицу в этом диапазоне. Но если я не копирую свой набор записей на лист и не использую его для заполнения сводного кэша, то это нормально для большинства полей, но не для некоторых (например, SEQ). Для тех, кто говорит, что в Excel слишком много уникальных элементов… но это не так ! Если я посчитаю свой сводный кэш, у меня будет 260 тыс. строк, как у меня может быть слишком много уникальных элементов?
Ответ №1:
Используя Set objPivotCache = ActiveWorkbook .Сводные кеши.Создайте (xlExternal) вместо набора objPivotCache = ActiveWorkbook .Сводные кеши.Add(SourceType:=xlExternal) решает проблему… Я точно не знаю, почему… надеюсь, это кому-то поможет!