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使用的完全一样。 由于这不是每次都发生,但大部分时间,我不知道从哪里开始进行故障排除。 我查过的文档(这是稀疏的,或者我在错误的地方看)表明我正在做这个权利。
什么原因导致错误,我该如何解决?
这是一个例子来说明如何避免在你的代码中使用Select
和Activate
,还有一些其他的(有用的)注释。
始终使用选项显式 – 这不能被强调
这将把你的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
。 它遵循指定完整引用的相同想法。
等等……你可以用这些例子来完成你的其他代码,并解决你所遇到的一些问题。 试一试。