我有一个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
调试器使用此窗口命中ActiveChart.SetSourceData Source:= objNBR.Range(DataRange)时出现错误消息 -
调试器中的DataRange是F2:R2,F3:R3,obj指向正确的Excel表单 -
ActiveChart来自模板 -
我的调试器显示“ActiveChart.ChartArea.Select”为真。而ActiveChart和obj是有效的对象。
最重要的是Excel 2003工作正常。我使用调试器来比较Excel 2003和2010 obj和ActiveChart。而且我在代码方面找不到太多不同。我确实看到2003年我的ActiveChart模板有点不同 -
原始模板与2010年显示的模板完全相同,但在2003年复制到工作表时已经自动归零。这是我在2003年和2010年之间可以注意到的唯一区别。我不确定是否会导致此错误。
我不确定我是否错过了任何证据。错误消息没有提供太多细节。有没有其他方法可以获得更多的调试信息?
如果有人能帮助我找到问题和修复,我感激不尽。
提前致谢
Edit1:obj是在另一个例程中创建的,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 Source:= obj.Range(DataRange)”在2010年的情况下不起作用,但在2003年工作。
除上述注释外,这是您声明对象并使用它们的方式。你应该避免使用Activesheet/Activeworkbook/ActiveChart... etc
您可能还想看看THIS
这只是一个例子。请根据您的需要进行修改。
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
会支持一个属性,但引用相同图表的对象变量不支持该属性?
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
无需声明额外变量。这很好用:
With ThisWorkbook
.Sheets(cstrParamTab).ChartObjects("IntradayChart1").Chart.SetSourceData _
Source:=.Sheets(cstrChartBaseTab).Range(cstrColTimeStamp & clngTopRow & ":" & cstrColValueClose & plngLastRow), PlotBy:=xlColumns
End With
定义选项卡和范围的变量是预定义的常量和变量。你可以这样做:
With ThisWorkbook
.Sheets("Parameters").ChartObjects("IntradayChart1").Chart.SetSourceData _
Source:=.Sheets("ChartBase").Range("B2:B239"), PlotBy:=xlColumns
End With
但如果您的图表是动态的,它就不会起作用。
祝好运