VBA:运行时错误 – 第二个透视图的SetSourceData

我正进入(状态:

运行时错误'-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 

这个子程序在另一个非常相似的子程序之后运行,该子程序使用连接到button的子工具创build数据透视图表:

 Sub CreatePivots() Call CreateBarPivot Call CreatePiePivot End Sub 

BarPivot运行完美,没有问题,每次都看起来几乎与上面显示的PiePivot相同,并显示适当的数据。 如果我单独运行这些子程序,它通常运行没有问题。 在我得到错误之前,我跑了并且删除了子和结果三次。 debugging指向这一行:

  ActiveChart.SetSourceData _ Source:=Range("$F$2:$H$19"), _ PlotBy:=xlRows 

…但看起来和BarPivot使用的完全一样。 由于这不是每次都发生,但大部分时间,我不知道从哪里开始进行故障排除。 我查过的文档(这是稀疏的,或者我在错误的地方看)表明我正在做这个权利。

什么原因导致错误,我该如何解决?

这是一个例子来说明如何避免在你的代码中使用SelectActivate ,还有一些其他的(有用的)注释。

始终使用选项显式 – 这不能被强调

这将把你的Sub的前几行变成:

 Option Explicit Sub CreatePiePivot() Dim thisWB As Workbook Set thisWB = ThisWorkbook Dim PSheet As Worksheet Dim DSheet As Worksheet Set PSheet = thisWB.Sheets("Tools") Set DSheet = thisWB.Sheets("Aggregate") 

请注意,通过定义此thisWB ,您可以在单行中设置工作簿参考,如果您需要更改工作簿,请更改该行并完成。 另外, 此引用可以解释为什么您应该使用ActiveWorkbook ThisWorkbook

由于您的一些问题涉及假定的参考(工作簿或工作表或图表),下一行可以帮助显示一些容易遗漏的必要参考:

  'Define last data points Dim lastRow As Long Dim lastCol As Long lastRow = DSheet.Cells(DSheet.Rows.Count, 1).End(xlUp).Row lastCol = DSheet.Cells(1, DSheet.Columns.Count).End(xlToLeft).Column 

请注意,您必须在Cells引用引用DSheet ,以确保您引用的是同一个工作表。 否则VBA可能会认为你指的是ActiveSheet ,它可能是完全不同的,并给你一个不正确的值。

接下来的几行成为:

  'Selects first to last filled row, and first to last filled column for data Dim PRange As Range Set PRange = DSheet.Cells(1, 1).Resize(lastRow, lastCol) 'Create pivot cache Dim PCache As PivotCache Set PCache = ActiveWorkbook.PivotCaches.Create _ (SourceType:=xlDatabase, SourceData:=PRange) 

你的代码中的下一个语句是Sheets("Tools").Activate它,除非有特定的原因,你想在这个时候向用户显示这个工作表是完全没有必要的。 如果您希望用户在完成所有处理后查看此工作表,请将此语句移动到Sub的末尾。

下一个:

  'Create blank pivot table Dim PTable As PivotTable Set PTable = PCache.CreatePivotTable _ (TableDestination:=PSheet.Range("F1"), _ TableName:="ExcPT1") 

接下来是真正解决您的错误的方法:

  'Create blank pivot chart Dim PChart As Chart Set PChart = PSheet.Shapes.AddChart PChart.ChartType = xlPie PChart.SetSourceData Source:=PSheet.Range("$F$2:$H$19"), PlotBy:=xlRows 

因为您正在为新添加的图表创build一个对象,所以不必使用ActiveChart 。 它遵循指定完整引用的相同想法。

等等……你可以用这些例子来完成你的其他代码,并解决你所遇到的一些问题。 试一试。