【发布时间】:2017-09-21 23:24:15
【问题描述】:
我得到:
运行时错误“-2147467259 (80004005)”: 对象“_Chart”的方法“SetSourceData”失败
当我尝试运行以下脚本时间歇性地:
Sub CreatePiePivot()
'Define worksheets
Set PSheet = Sheets("Tools")
Set DSheet = Sheets("Aggregate")
'Define last data points
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
'Selects first to last filled row, and first to last filled column for data
Set PRange = DSheet.Cells(1, 1).Resize(LastRow, LastCol)
'Create pivot cache
Set PCache = ActiveWorkbook.PivotCaches.Create _
(SourceType:=xlDatabase, SourceData:=PRange)
'Moves user to Dashboard
Sheets("Tools").Activate
'Create blank pivot table
Set PTable = PCache.CreatePivotTable _
(TableDestination:=PSheet.Range("F1"), _
TableName:="ExcPT1")
'Create blank pivot chart
PSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlPie
ActiveChart.SetSourceData _
Source:=Range("$F$2:$H$19"), _
PlotBy:=xlRows
ActiveWorkbook.ShowPivotTableFieldList = False
With ActiveChart.PivotLayout.PivotTable.PivotFields("Exception")
.Orientation = xlRowField
.Position = 1
End With
'Insert Data
With PSheet.PivotTables("ExcPT1").PivotFields("Exception")
.Orientation = xlDataField
.Position = 1
.Caption = "Exception Status Count"
.Function = xlCount
End With
'Hide Not Due
With ActiveChart.PivotLayout.PivotTable.PivotFields("Exception Status")
.PivotItems("Not due").Visible = False
End With
'Move bar chart to Dashboard; resize
ActiveChart.ChartArea.Select
ActiveChart.Location Where:=xlLocationAsObject, Name:="Dashboard"
Set ChartWidth = Sheets("Dashboard").Range("B26:L49")
With ActiveChart.Parent
.Height = ChartWidth.Height
.Width = ChartWidth.Width
.Top = ChartWidth.Top
.Left = ChartWidth.Left
End With
With ActiveChart
.HasTitle = False
End With
End Sub
该子程序在另一个非常相似的子程序之后运行,该子程序使用连接到按钮的子程序创建数据透视条形图:
Sub CreatePivots()
Call CreateBarPivot
Call CreatePiePivot
End Sub
BarPivot 每次都能完美运行,没有问题,并且看起来与上面显示的 PiePivot 几乎相同,并进行了适用的更改以显示适当的数据。如果我单独运行这些潜艇,它通常运行没有问题。在出现错误之前,我运行并删除了 sub 和结果三次。调试指向这一行:
ActiveChart.SetSourceData _
Source:=Range("$F$2:$H$19"), _
PlotBy:=xlRows
...但它看起来与 BarPivot 使用的完全一样。由于它并非每次都发生,但在大多数情况下,我不确定从哪里开始进行故障排除。我查过的文档(顺便说一句很稀少,或者我看错了地方)表明我做对了。
是什么导致了错误,我该如何解决?
【问题讨论】:
-
我之前遇到过这个问题,IIRC 通过避免使用
ActiveChart解决了这个问题。使用ActiveChart只能保证您在任何活动图表上进行操作(duh),但这并不总是您认为的图表(除非您在整个工作簿中只有一个图表)。 Avoid using Select and Activate,并创建一个链接到每个特定图表的对象,这样您就永远不会知道您正在使用哪个图表。 -
这是个好建议,PeterT,我很高兴你提出了这个建议,因为我对使用这么多“活动”项目感到非常不安,因为我试图将这些项目拼凑起来。这是我第一次尝试在 VBA 中创建数据透视项目,所以我选择了我能找到的(显然使用了活动项目),所以结果就是你所看到的。在什么时候/如何将每个图表识别为变量,以便我可以适当地引用它?