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的,那么它不会起作用。
祝你好运