VBA:运行时错误-设置第二个透视图的源数据
我得到: 运行时错误“-2147467259(80004005)”: 对象“\u图表”的方法“SetSourceData”失败 当我尝试运行以下脚本时,会时断时续: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
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