VBA:运行时错误 - 第二个数据透视图的SetSourceData

时间:2017-05-24 13:56:29

标签: excel vba excel-vba

我得到了:

运行时错误'-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使用的完全一样。由于它并非每次都发生,但大部分时间,我不知道从何处开始进行故障排除。我查找的文档(顺便说一下,或者我在错误的地方查找)表明我正在这样做。

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

1 个答案:

答案 0 :(得分:1)

这是一个示例,用于说明如何避免在代码中使用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,您将在一行中设置工作簿引用,如果您需要更改工作簿,请更改该行,然后您就完成了。此外,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。它遵循指定完整引用的相同想法。

等等......您可以使用这些示例来完成其余代码并解决您遇到的一些问题。试一试。