【问题标题】:VBA: Runtime Error - SetSourceData for Second Pivot ChartVBA:运行时错误 - 第二个数据透视图的 SetSourceData
【发布时间】: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 中创建数据透视项目,所以我选择了我能找到的(显然使用了活动项目),所以结果就是你所看到的。在什么时候/如何将每个图表识别为变量,以便我可以适当地引用它?

标签: vba excel


【解决方案1】:

这是一个示例,用于说明如何避免在代码中使用 SelectActivate,以及其他一些(希望有用的)cmets。

始终使用 Option Explicit - 这一点怎么强调都不过分

这会将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

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

    '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 inside,以确保您引用的是同一个工作表。否则 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。它遵循指定完整引用的相同想法。

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

【讨论】:

  • 这是一个巨大的帮助,PeterT。不过,我在 Set BPivot = PSheet.Shapes.AddChart 行上收到类型不匹配错误。我在子的顶部有一条 Dim BPivot As Chart 线。我还添加了一个 Dim myWB 作为 Workbook 并 Set myWB = This Workbook;设置 P/DSheet = myWB.Sheets("As applic.").
  • 你可以参考Shapes.AddChart的文档解决这个问题
  • 我不认为我看到了你所看到的......?
  • 将 BPivot 调暗为形状。这就是文档链接所说的(返回值:Shape)
  • 创建另一个问题并发布您的新代码并再次提问。您甚至可以链接回此答案以清理参考并进行更新,以确保关注此问题的其他人是最新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2012-10-09
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多