Есть ли метод или свойство (связанное с PivotCache / PivotCaches), чтобы определить, почему нельзя создать сводную кэш? - PullRequest
0 голосов
/ 02 апреля 2019

Я использую код XLS VBA для создания сводных таблиц на основе именованных диапазонов.Когда я получаю код ошибки при вызове CreatePivotTable, я заметил, что PivotCache никогда не создавался.Я не могу понять причину.Есть ли способ углубиться в ошибки PivotCaches.Create?

Я уже пытался определить SourceData

  • с именованным диапазоном
  • с абсолютными ссылками
  • с относительными ссылками
  • пошаговая замена каждого элемента его строковым значением

различные объявления (wBk as Workboook, wSh as WorkSheet, kchPivot as PivotCache, piPivot as PivotTable, DataSourceRge as Range, DataSourceString as String ...)

Set wBk = ActiveWorkbook
Set wSh = wBk.Sheets("MP_1_30")
Set DataSourceRge = Range("MP_1_30_Type_Ctl")

A) это не работает

Set kchPivot = wBk.PivotCaches.Create (xlDataBase, DataSourceRge)

B) это не работает либо

DataSourceString  = wSh.Name & "!" & _ 
DataSourceRge.Address(ReferenceStyle:=xlR1C1)

Set kchPivot = wBk.PivotCache.Create (xlDataBase, DataSourceString)

ВАЖНО: DataSourceRge - это ОДИН столбец диапазона (примечание: все диапазоны, для которых я хочу автоматизировать создание сводных таблиц, имеют ширину 1 столбец)

Я помещаю следующий элемент управления, чтобы определитьсоздание PivotCache

MsgBox wBk.PivotCaches.Count

Я всегда получаю "0" (ноль), но ожидаю "1"

1 Ответ

0 голосов
/ 02 апреля 2019

Поскольку вы не получаете никаких сообщений об ошибках, я считаю, что проблема заключается в том, что вы не создаете никаких «отображаемых элементов» (сводная таблица, сводная диаграмма и т. Д.) , которые используют эту сводную кэш-память. Я сделал некоторое тестирование с кодом. Вы должны быть в состоянии повторить мои результаты с приложенным кодом и настройкой данных, показанной на изображении ниже.

Используя свежую рабочую книгу, добавьте образцы данных в столбец A Листа1, затем добавьте второй лист (Примечание: мой код использует кодовые имена для листов, поэтому, если вы не начинаете с новой книги, вам может потребоваться изменить кодовые имена в присваиваниях переменных листа

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

Когда я запускаю код, первый MsgBox показывает «0»; в то время как второй MsgBox показывает «1».

Хотя я не могу найти документацию по этому явлению; мое предположение следующее:


Чтобы не допустить вздутия файлов Excel, существует автоматизированный процесс, который очищает неиспользуемые сводные кэши, т. Е. Сводные кэши без каких-либо связанных элементов (сводная таблица, сводная диаграмма и т. Д.), И / или предотвращает сводную кэш. от завершения до того, как элемент отображения будет связан с ним.

Поэтому, чтобы полностью создать и завершить сводную кэш-память, по крайней мере один из требуемых элементов отображения также должен быть создан с использованием этой сводной кэш-памяти.


Если по какой-то причине вы действительно не можете создать какой-либо требуемый элемент отображения во время создания сводной кэш-памяти, я предлагаю создать «фиктивный» элемент отображения на очень скрытом листе, который можно удалить после добавления некоторые фактические элементы отображения для этой сводной кэш-памяти. (К вашему сведению: я также пытался создать фиктивный элемент отображения, а затем сразу же удалил его. Это также привело к автоматическому удалению сводной кэш-памяти.)

sample data

Sub test()
    Set wBk = ThisWorkbook
    Set wsh = Sheet1
    Set sht2 = Sheet2
    fRow = 1
    fCol = 1
    lRow = 5
    lCol = 1

    Set kchPivot = wBk.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=wsh.Range(wsh.Cells(fRow, fCol), wsh.Cells(lRow, lCol)))

    MsgBox wBk.PivotCaches.Count 'Does not increment for newly created pivotcache with no associated display items

    With kchPivot
        .CreatePivotTable TableDestination:=sht2.Range("D3"), TableName:="Performance"
    End With

    MsgBox wBk.PivotCaches.Count 'Increments for pivotcache now associated with a pivottable
End Sub
...