2012-08-09 369 views
3

我試圖使用VBA從Excel 2003中的圖表中刪除空系列。我已經看到其他人在過去曾經遇到過這個問題,並且我嘗試了在他們的帖子中提到的所有方法,但一直無法找到任何可以一致工作的方法。如何使用VBA從Excel圖表中刪除系列

該圖表中有14個系列,其中3個或9個之間的任何位置都可以爲空。空的總是系列4之間 - 我試過的代碼有一些變化,但是這主要是它:

Sheets("chart-1").Select 
ActiveChart.PlotArea.Select 
For i = 12 To 4 Step -1 
    Dim theSeries As Series 
    MsgBox (ActiveChart.SeriesCollection(i).Name) 
    Set theSeries = ActiveChart.SeriesCollection(i) 
    MsgBox (theSeries.Name) 
    theSeries.Delete 
Next 

我可以爲一個圖表成功運行一次,但所有後續週期失敗,出現Unable to get the Name property of the Series class錯誤。它在調用.Name時失敗。

我能夠通過直接插入整數來獲得它的工作,但它只會爲除1以外的所有整數運行一次。它運行多次爲Series(1)。例如,如果我只是簡單地調用:ActiveChart.SeriesCollection(1).Delete,那麼系列將被刪除,但是如果我用另一個整數(4,9,12)運行它,它將不會運行。它會重新工作1,但只有1.它也將工作一次與其他整數(如4),但所有後續調用將失敗,即使我將整數更改爲1或保持爲4,或將其更改爲其他數。

這種行爲真的很奇怪。

任何想法將不勝感激。我不能簡單地打電話ActiveChart.SeriesCollection(1).Delete,因爲前3個系列總是非空的。

謝謝。

** **更新

我只是跑測試手動執行以下操作:

Sheets("ch-v2-12mth").Select 
ActiveChart.PlotArea.Select 
MsgBox (ActiveChart.SeriesCollection(1).Name) 

我通過循環的SeriesCollection試圖數字1 - 16(只有14個圖表中系列)來查看結果。 13工作得很好 4 - 13誤用Unable to get the Name property of the Series class 14工作得很好 15 - 16誤用Method 'SeriesCollection' of object '_Chart' failed < - 並不奇怪,因爲在圖中序列的數量。

這種行爲讓我覺得Excel有一個bug。任何其他想法?

+0

這是你正在嘗試? http://stackoverflow.com/questions/7875326/deleting-empty-series-out-of-graph-with-vba – 2012-08-09 12:31:38

+0

@Siddharth基本上是這就是我正在嘗試,而實際上不需要數據標籤。我已經使用我已經完成的一些更多測試的結果更新了最初的請求。結果很奇怪。感謝您的幫助,但我仍然得到相同的行爲和錯誤。任何其他想法? – 2012-08-10 03:07:22

+1

你可以加載一個示例excel文件,以便我可以玩弄它嗎?這樣我就不必創建一個示例文件。您可以在wikisend.com上傳文件,然後在此分享鏈接。 – 2012-08-10 03:28:21

回答

3

當您從圖表中刪除全部系列時,Excel中存在一些錯誤。我的解決方法是始終在圖表中留下至少一個系列(即使它中沒有數據)。這似乎對我有用。

只是想到另一件事。刪除一個系列時,其餘所有系列的索引都會減1,因此您無法通過從1循環到系列數來刪除它們。你可以做的是有一個do循環,刪除它們直到SeriesCollection.Count = 0(或1,請參閱我之前的評論)。或者是一個for循環,向後迭代並總是刪除最後一個序列(即SeriesCollection(SeriesCollection.Count).Delete

+0

什麼樣的錯誤? – 2015-06-29 14:58:44

1

您不能刪除所有序列,否則圖表將自行刪除。我爲解決這個問題所做的是重命名所有現存的系列;然後輸入你的代碼來建立新的東西;然後運行另一個片段刪除,重命名

'rename existing series 
With ActiveChart 
DoEvents 
    For i = .FullSeriesCollection.Count To 1 Step -1 
     .FullSeriesCollection(i).Name = "remove" & i 
    Next i 
End With 

'your code here to build new charts 

'last piece of code to remove the earlier series marked for deletion 
With ActiveChart 
DoEvents 
    For c = .SeriesCollection.Count To 1 Step -1 
     If .SeriesCollection(c).Name Like "*Series*" Then .SeriesCollection(c).Delete 
    Next c 
End With 
'also, you need to step backwards because each time you remove a series it will re-index 
+0

不要忘記你的Doevents和步驟-1 – 2016-12-09 18:15:19

+0

你可能是指'如果.SeriesCollection(c).Name像「remove *」那麼...''? – 2017-01-01 06:19:33

+0

You _can_刪除所有系列。圖表將保留,但在添加更多數據之前它將保持空白。當數據被清除時,許多消失的元素將丟失格式,並且標題將丟失文本。 – 2017-01-06 14:41:47

0

您可以簡化代碼,此係列:

Sheets("chart-1").Select 
For i = 12 To 4 Step -1 
    MsgBox "Series " & i & ": """ ActiveChart.SeriesCollection(i).Name & """" 
    ActiveChart.SeriesCollection(i).Delete 
Next 

我不知道爲什麼代碼不爲你工作,但更簡單,通常是更好。而且您不需要知道系列名稱即可刪除系列。