2013-11-14 164 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 

但它不會工作,如果你的圖表是動態的。

祝你好運