Excel 2010 VBA ActiveChart.SetSourceData失败

我有一个Excel VBA应用程序在Excel 2003中工作正常,但在Excel 2010中失败。

相关代码是

Public Sub Create_Chart Dim c Dim OutputText As String OutputText = OutputSource Workbooks(NewWorkBook).Activate With ActiveSheet obj.Range(DataRange).NumberFormat = "0.0%" ActiveSheet.ChartObjects(1).Activate ActiveChart.ChartArea.Select ActiveChart.SetSourceData Source:=obj.Range(DataRange) End With End Sub 

当debugging器点击ActiveChart.SetSourceData时出现错误消息源:= objNBR.Range(DataRange)与此窗口 – 在这里输入图像说明

debugging器中的DataRange是F2:R2,F3:R3,其中obj指向正确的Excel表单 – 在这里输入图像说明

ActiveChart是从一个模板 – 在这里输入图像说明

我的debugging器显示“ActiveChart.ChartArea.Select”是真实的。 而ActiveChart和obj是有效的对象。

最重要的是Excel 2003工作正常。 我使用debugging器来比较Excel 2003和2010 obj和ActiveChart。 在代码方面我找不到很多不同的东西。 我看到我的ActiveChart模板在2003年有点不同 – 在这里输入图像说明

原始模板与2010年完全一样,但在2003年复制到工作表中时已经自动清零。这是我在2003年和2010年之间唯一可以注意到的差异。我不确定是否会导致此错误。

我不确定我是否错过了任何证据。 错误信息并没有提供太多细节。 有没有其他的方法来获得更多的debugging信息?

我很感激,如果有人能帮我find问题和修复。

提前致谢

编辑1: obj是在另一个例程中创build的,并且DataRange在那个例程中是受欢迎的 –

 Workbooks.Add MyWorkbook = ActiveWorkbook.Name Set obj = ActiveWorkbook.Worksheets(1) 

然后将数据插入DataRange单元格 – F2:R2,F3:R3。 我可以看到Excel文件显示正确的数据。

Edit2上述子工作簿(NewWorkBook)从这些代码生成,我可以看到新的Excel与图表显示在屏幕上 –

 Windows(Dir(TemplateFile)).Activate ActiveWorkbook.Sheets("C1").Select ActiveWorkbook.Sheets("C1").Copy NewWorkBook = ActiveWorkbook.Name Windows(NewWorkBook).Visible = True 

Edit3使用Sid的方法首先以这种方式声明对象 –

 Public Sub Create_Chart() Dim wb As Workbook Dim ws As Worksheet Dim objChrt As ChartObject Dim Chrt As chart Set wb = Workbooks(NewWorkBook) Set ws = wb.Sheets(1) Set objChrt = ws.ChartObjects(1) Set Chrt = objChrt.chart With wb obj.Range(DataRange).NumberFormat = "0.0%" 'Chrt.Export ("c:\temp\testChrt.gif") 'With obj.PageSetup ' .PrintArea = DataRange ' .Zoom = False ' .FitToPagesTall = 1 ' .FitToPagesWide = 1 ' .Orientation = xlLandscape ' End With ' obj.PrintOut Copies:=1 Chrt.SetSourceData Source:=obj.Range(DataRange) End With End Sub 

错误是完全一样的。 请注意,我有注释掉的代码打印出来并保存Chrt和obj.Range(DataRange)对象。 这些值与上面的图像2和图像3相同。 所以图表和数据在那里。 我只是想知道为什么“Chrt.SetSourceData源:= obj.Range(DataRange)”在这种情况下在2010年不起作用,但在2003年工作。

除了上面的评论,这是你应该声明对象并使用它们的方式。 你应该避免使用Activesheet/Activeworkbook/ActiveChart... etc

你可能也想看看这个

这只是一个例子。 请修改它以适应您的需求。

 Public Sub Create_Chart() Dim wb As Workbook Dim ws As Worksheet Dim objChrt As ChartObject Dim Chrt As Chart Set wb = ThisWorkbook Set ws = wb.Sheets("Sheet1") Set objChrt = ws.ChartObjects(1) Set Chrt = objChrt.Chart Chrt.SetSourceData Source:=ws.Range("B2:B3,I2:I3") End Sub 

不是100%,以下是完全相同的问题,但我有一种感觉是接近的。

以下对我来说似乎是一个错误 – 为什么ActiveChart支持一个属性,但引用同一个图表的对象variables不支持该属性?

 Sub findTheChart() Dim p_Snapshot As Excel.Workbook Dim myChartObject As Excel.ChartObject Set p_Snapshot = Excel.Workbooks("theBookWithTheCharts") Dim chtName As String Dim dayNum As Integer Dim sourceAddress As String Dim ws As Excel.Worksheet Dim r As Excel.Range Set ws = p_Snapshot.Sheets("theSheetWithTheCharts") sourceAddress = "$AW$69:$BA$84" For Each myChartObject In ws.ChartObjects chtName = myChartObject.Name If (chtName = "Chart_nameGiven") Then myChartObject.Activate Set r = ws.Range(sourceAddress) 'myChartObject.SetSourceData Source:=r '<<<<<<<<<<<<doesn't work Excel.ActiveChart.SetSourceData Source:=r '<<<<<<<<works fine!!! End If Next myChartObject End Sub 

没有必要声明额外的variables。 这工作正常:

  With ThisWorkbook .Sheets(cstrParamTab).ChartObjects("IntradayChart1").Chart.SetSourceData _ Source:=.Sheets(cstrChartBaseTab).Range(cstrColTimeStamp & clngTopRow & ":" & cstrColValueClose & plngLastRow), PlotBy:=xlColumns End With 

定义选项卡和范围的variables是预定义的常量和variables。 你可以这样做:

 With ThisWorkbook .Sheets("Parameters").ChartObjects("IntradayChart1").Chart.SetSourceData _ Source:=.Sheets("ChartBase").Range("B2:B239"), PlotBy:=xlColumns End With 

但是如果你的图表是dynamic的,那么它不会起作用。

祝你好运