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

VBA:运行时错误-设置第二个透视图的源数据,vba,excel,Vba,Excel,我得到: 运行时错误“-2147467259(80004005)”: 对象“\u图表”的方法“SetSourceData”失败 当我尝试运行以下脚本时,会时断时续: Sub CreatePiePivot() 'Define worksheets Set PSheet = Sheets("Tools") Set DSheet = Sheets("Aggregate") 'Define last data points LastRow = DSheet.Cells(Rows.Count, 1).E

我得到:

运行时错误“-2147467259(80004005)”: 对象“\u图表”的方法“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在另一个非常类似的sub之后运行,该sub使用连接到按钮的sub创建轴条形图:

Sub CreatePivots()

Call CreateBarPivot
Call CreatePiePivot

End Sub
BarPivot每次都运行得很好,没有问题,看起来几乎与上面显示的PiePivot相同,并进行了相应的更改以显示适当的数据。如果我单独运行这些SUB,它通常运行时不会出现问题。在得到错误之前,我运行并删除了sub和结果三次。调试程序指向这一行:

    ActiveChart.SetSourceData _
        Source:=Range("$F$2:$H$19"), _
        PlotBy:=xlRows
…但它看起来和BarPivot使用的一模一样。因为它不是每次都发生,但大多数时候,我不确定从哪里开始故障排除。我查过的文档(顺便说一句,这是稀疏的,或者我查错了地方)表明我做得对


导致错误的原因是什么?如何修复它?

这是一个示例,说明如何避免在代码中使用
选择
激活
,以及一些其他(希望有用的)注释

始终使用Option Explicit-这一点再强调也不为过

这将把
子部分的前几行变成:

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
上使用
thiswoolk

由于您的一些问题涉及到假定的参考资料(工作簿、工作表或图表),因此下面几行有助于显示一些容易遗漏的必要参考资料:

    '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
请注意,您必须在
单元格
引用中引用
数据表
,以确保您引用的是同一工作表。否则,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)
代码中的下一条语句是
工作表(“工具”)。激活
,除非此时有特定原因要向用户显示该工作表,否则完全没有必要。如果希望用户在所有处理完成后查看此工作表,请将此语句移动到
子部分的末尾

下一步:

下一步是对错误的真正修复:

    '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
。它遵循指定完整引用的相同思想


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

我以前遇到过这个问题,IIRC通过避免使用
ActiveChart
解决了这个问题。使用
ActiveChart
只能保证您在任何活动的图表上操作(duh),但这并不总是您认为的图表(除非您在整个工作簿中只有一个图表),创建一个链接到每个特定图表的对象,这样你就永远不会有问题知道你在使用哪个。这是一个很好的建议,皮特,我很高兴你提出了这个建议,因为当我试图把它拼凑在一起时,我对使用这么多“活动”项目感到非常不安。这是我第一次尝试在VBA中创建轴心项目,所以我使用了我能找到的东西(显然使用了活动项目),所以结果就是您所看到的。在什么时候/如何才能将每个图表识别为一个变量,以便适当地引用它?这是一个巨大的帮助,皮特。但是,我在设置BPivot=PSheet.Shapes.AddChart行上遇到类型不匹配错误。我在子文件夹的顶部有一个Dim BPivot作为图表线。我还添加了一个Dim myWB作为工作簿,并设置myWB=此工作簿;设置P/DSheet=myWB.Sheets(“作为应用程序”)。您可以通过参考文档来解决该问题,因为我不认为我看到了您所看到的…?将BPivot设置为形状。这就是文档链接所说的(返回值:Shape),谢谢Peter。我已经通过并完成了变量定义,但我仍然从OP中获得原始版本。我不知所措。
    '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