我得到了:
运行时错误'-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几乎相同,并带有适用的更改以显示相应的数据。如果我单独运行这些子程序,通常运行没有问题。在我收到错误之前,我运行并删除了子和结果三次。调试指向这一行:
ActiveChart.SetSourceData _
Source:=Range("$F$2:$H$19"), _
PlotBy:=xlRows
...但它看起来与BarPivot使用的完全一样。由于它并非每次都发生,但大部分时间,我不知道从何处开始进行故障排除。我查找的文档(顺便说一下,或者我在错误的地方查找)表明我正在这样做。
导致错误的原因是什么,我该如何解决?
答案 0 :(得分:1)
这是一个示例,用于说明如何避免在代码中使用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
,您将在一行中设置工作簿引用,如果您需要更改工作簿,请更改该行,然后您就完成了。此外,this reference可以解释为什么您应该ThisWorkbook
使用ActiveWorkbook
。
由于您的某些问题涉及 假设的 引用(工作簿或工作表或图表),下一行可以帮助显示一些容易遗漏的必要参考:< / p>
'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
请注意,您必须引用DSheet
引用中的Cells
,以确保您引用相同的工作表。否则,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
因为您要为新添加的图表创建对象,所以您永远不必使用ActiveChart
。它遵循指定完整引用的相同想法。
等等......您可以使用这些示例来完成其余代码并解决您遇到的一些问题。试一试。