2016-05-24 9 views
0

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

Sub PTable() 
Dim PT As PivotTable 
Dim PTCache As PivotCache 
Dim rng As Range 
Set rng = Range("A1", Range("A1").End(xlToRight).End(xlDown)) 
rng.Select 

Set PTCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, rng) 
Sheets("New").Activate 
Set PT = ActiveSheet.PivotTables.Add(PTCache, Range("A1"), "My_PT") 
End Sub 

Runtime error 13, Тип Несоответствие выбрасывается при настройке PTCache. Это происходит очень часто, когда я работаю с Pivot Tables на моем excel, используя VBA.

+0

какая линия вы получаете ошибку? –

+0

При установке Pivot Cache, хотя мой rng-объект выбирает желаемый диапазон. –

+0

Попробуйте установить на эту точку останова линии и посмотреть все переменные ('xlDatabase',' rng') в часах. – Michael

ответ

0

Эта строка Set rng = Range("A1", Range("A1").End(xlToRight).End(xlDown)) устанавливает очень большой диапазон "$1:$1048576". Вы можете посмотреть его в отладчике:

Range("A1", Range("A1").End(xlToRight).End(xlDown)).Address 
=> "$1:$1048576" 

Может быть что-то неправильно с диапазоном, который вы хотите использовать в ActiveWorkbook.PivotCaches.Create?

Попробуйте также использовать этот Microsoft's advice о втором аргументе PivotCache.Create:

При прохождении в диапазоне, рекомендуются использовать либо строку указать рабочую книгу, рабочий лист, и диапазон ячеек, или настроить с именем и передайте имя в виде строки. Передача Диапазон Объект может вызывает ошибки типа «непонимание».

+0

Да, диапазон, над которым я работаю, огромен (строки порядка 100000). Мой код отлично работает для небольших диапазонов, но, что вызывает триггер для гигантского диапазона. –

+0

Я думаю, что использование PivotCache.Create на таком огромном диапазоне может использовать слишком много памяти. – Michael

+0

Кстати, 100000 строк меньше, чем вся таблица, как вы писали. Зачем вам все это? – Michael

0

Кроме того, вы можете попробовать

Set rng = Range("A1").CurrentRegion 

который, как Ctrl + Shift + * вместо

Set rng = Range("A1", Range("A1").End(xlToRight).End(xlDown)) 

Выполнение одного метода (т.е. .CurrentRegion) вместо двух методов (то есть, xlToRight, за которым следует xlDown), скорее всего, будет менее интенсивным в памяти и устранить сбой типа Mismatch.

+0

Спасибо за более эффективный способ репликации Ctrl + Shift + *. Но я все еще получаю ошибку «Несоответствие» для строк> 60000 –

Смежные вопросы