是否存在方法或属性(与PivotCache / PivotCaches有关)以标识为什么无法创建数据透视缓存?

时间:2019-04-02 13:46:15

标签: excel vba pivot-table

我正在使用XLS VBA代码基于命名范围创建数据透视表。 当我在调用CreatePivotTable时收到错误代码时,我注意到从未创建过PivotCache。我不知道原因。有没有办法深入研究PivotCaches。创建错误?

我已经尝试定义SourceData

  • 具有命名范围
  • 具有绝对引用
  • 具有相对引用
  • 一步一步地将每个项目替换为其字符串值

各种声明(wBk as WorkboookwSh as WorkSheetkchPivot as PivotCachepiPivot as PivotTableDataSourceRge as RangeDataSourceString 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是一列范围(nb:我要为其自动创建数据透视表的所有范围都是1列宽)

我放置以下控件来确定PivotCache的创建

MsgBox wBk.PivotCaches.Count

我总是收到“ 0”(无),但希望得到“ 1”

1 个答案:

答案 0 :(得分:0)

由于您没有收到任何报告的错误消息,因此我认为问题在于您没有创建使用该数据透视缓存的任何“显示项” (数据透视表,数据透视图等) 。我用代码做了一些测试。您应该可以使用所附的代码复制我的结果,并且数据设置如下图所示。

使用新的工作簿在Sheet1的A列中添加示例数据,然后添加第二个工作表(注意:我的代码使用工作表的代码名称,因此,如果您不是从全新的工作簿开始,则可能需要进行更改工作表变量分配中的代号

在代码中,我有两个位置使用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