2013-11-14 133 views
2

我已在Excel 2003中已经工作罚款Excel的VBA的应用,但在Excel 2010年失败Excel 2010中VBA ActiveChart.SetSourceData失败

相对码

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来源:= objNBR.Range(DataRange)与此窗口 - enter image description here

的DataRange在调试器是F2:R2,F3:R3与obj指向右侧Excel表格 - enter image description here

的该ActiveChart是一个模板 - enter image description here

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

最重要的是,Excel 2003工作正常。我使用调试器来比较Excel 2003和2010 obj和ActiveChart。在代码方面我找不到什么不同。我看到我的ActiveChart模板是在2003年有点不同 - enter image description here

的原始模板是完全一样显示在2010,但它已自动在2003年被复制到工作表时清零相同唯一的区别我可以注意到2003年和2010年之间。我不知道这可能会导致此错误。

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

我很感激,如果有人可以帮我找到问题和解决办法。

预先感谢

EDIT1:的OBJ在另一例程和DataRange创建的populeted在常规 -

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年工作。

+0

什么是'obj'?什么是'DataRange'?而不是使用ActiveChart或Activesheet,你可能想创建相关的对象并使用它? –

+0

@SiddharthRout,obj是创建图表的数据源表。 DataRange是从中提取数据的数据单元。在这种情况下,它是F2:R2,F3:R3。 – Don

+0

尝试声明对象,然后使用它? –

回答

0

除了上面的注释,这是你应该声明对象的方式和与他们合作。你应该避免使用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 
+0

谢谢西德。我用对象声明重写了代码。但我仍然有同样的错误。我可以看到ws.Range(“B2:B3,I2:I3”)在我的调试器中有值,Chrt是一个有效的对象。有什么方法可以在Excel 2010调试中获得更多调试信息? – Don

+0

现在已经是凌晨3点了,我打算打床了。我们可以赶上汤姆,我保证会帮助你:) –

+0

当然。非常感谢。祝你晚安。我们回聊。 – Don

0

不是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 
+0

myChartObject是ChartObject,而ActiveChart是一个图表。 myChartObject.Chart是相应的Chart。 –

0

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

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 

但它不会工作,如果你的图表是动态的。

祝你好运