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