【问题标题】:How do I change a PivotCache.SourceData to point to a new Table?如何更改 PivotCache.SourceData 以指向新表?
【发布时间】:2015-03-23 20:14:54
【问题描述】:

在 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\完整路径[工作簿名称]工作表名称'!$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'

我已确认目标工作簿中的表与原始表具有相同的名称,它没有使用通用名称重命名(这就是我在我的 Master 上强制使用特定名称/表的原因)。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    这是我最终想到的:

    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。工作簿构建完成后,我将运行我发现的一些其他代码,这些代码将消除所有重复的 Pivot Cache 以帮助减小工作簿的大小。

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2016-07-18
        • 2021-12-26
        • 2019-05-15
        • 1970-01-01
        • 2018-06-23
        相关资源
        最近更新 更多