如何将PivotCache.SourceData更改为指向新表?

时间:2015-03-23 20:14:55

标签: excel vba excel-vba

在Excel 2010中,我通过VBA代码将工作表从主工作簿复制到新工作簿,以便各个新工作簿可以包含不同客户端的一组数据。

某些工作表包含从Access数据库中提取的数据表,以及基于该数据集的数据透视表。我的代码将工作表从主服务器复制到新客户端工作簿,更新工作表上的数据,然后更新.PivotCache.SourceData以指向新工作簿。

此代码正常工作以更新.PivotCache.SourceData

If XLClinic.PivotCaches.Count <> PivotCacheCount Then
  Formula = NewSheet.PivotTables(1).PivotCache.SourceData
  If InStr(1, Formula, "'") > 0 Then
    Bracket = InStr(1, Formula, "]")
    Formula = Replace(Formula, "'", "")
    NewSheet.PivotTables(1).PivotCache.SourceData = Right(Formula, _
             Len(Formula) - Bracket + 1)
  End If
End If

然后我改变了我的“主”工作表布局,这样我实际上将其定义为table,而不仅仅是工作表上的某些数据,我手动更新了数据透视表以指向表名(我将表名更改为与数据集一致且相关的内容,而不仅仅是TableX)。

此代码不再适用于更改数据透视表的.SourceData。当我尝试执行它时,我得到:

  

运行时错误'1004':

     

应用程序定义或对象定义的错误

当数据被简单地格式化为一堆单元格时,.SourceData值如下所示:

  

'\\ server \ share \ full path [工作簿名称]工作表名称'!$ A $ 4:$ E $ 240

当我将数据格式更改为表格时,.SourceData现在看起来像这样:

  

'\\ server \ share \ full path \ Workbook Name`!TableName

考虑到结构的这种变化,我将代码更改为:

If XLClinic.PivotCaches.Count <> PivotCacheCount Then
  Formula = NewSheet.PivotTables(1).PivotCache.SourceData
  If InStr(1, Formula, "'") > 0 Then
    Bracket = InStr(1, Formula, "!")
    NewSheet.PivotTables(1).PivotCache.SourceData = Right(Formula, Len(Formula) - Bracket)
  End If
End If

不幸的是,我仍然得到Run-time error'1004'

我已确认目标工作簿中的表与原始表中的名称相同,但未使用通用名称重命名(这就是我在主服务器上强制执行特定名称/表的原因)。

2 个答案:

答案 0 :(得分:0)

这是我最终提出的:

If XLClinic.PivotCaches.Count <> PivotCacheCount Then
  Formula = NewSheet.PivotTables(1).PivotCache.SourceData
  Bracket = InStr(1, Formula, "!")
  Formula = Right(Formula, Len(Formula) - Bracket)
  NewPivotRange = NewSheet.Name & "!" & _
                  NewSheet.ListObjects(Formula).Range.Address(ReferenceStyle:=xlR1C1)
  For Each PT In NewSheet.PivotTables
    PT.ChangePivotCache XLClinic.PivotCaches.Create(SourceType:=xlDatabase, _
                                                    SourceData:=NewPivotRange)
  Next
End If

这样做的缺点是它为每个单个数据透视表创建了一个新的PivotCache。当工作簿构建完成后,我将运行一些其他代码,我发现它将消除所有重复的数据透视表缓存,以帮助减小工作簿的大小。

答案 1 :(得分:0)

我发现您还可以为第一个pivottable设置pivottable范围,然后将所有其他pivottables的缓存更改为第一个pivottable的缓存。

Dim sourceRange As String, sht As Worksheet, pvt As PivotTable, sourcePivot As String
sourceRange = "Sheet1!R1C1:R1000C9"
'OR if in a different workbook: sourceRange = "c:\filepath\[filename.xlsx]Sheet1!R1C1:R1000C9"
Set sht = ThisWorkbook.Worksheets("NewSheet")
sht.PivotTables(1).SourceData = sourceRange
sourcePivot = sht.Name & "!" & sht.PivotTables(1).Name
For Each pvt In sht.PivotTables
    pvt.ChangePivotCache (sourcePivot)
Next
Debug.Print ThisWorkbook.PivotCaches.Count