3

VBA を使用して、Excel 2003 のグラフから空の系列を削除しようとしています。過去に他の人がこの問題を抱えていたことを知り、投稿に記載されているすべての方法を試しましたが、一貫して機能するものを見つけることができませんでした.

チャートには 14 個のシリーズがあり、そのうち 3 個から 9 個までは空にすることができます。空のものは常にシリーズ 4 ~ 12 の間にあります。

私はコードのいくつかのバリエーションを試しましたが、これは主にそれです:

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

チャートに対して 1 回は正常に実行できますが、その後のサイクルはすべてUnable to get the Name property of the Series classエラーで失敗します。.Name の呼び出しで失敗します。

整数を直接挿入することで動作させることができましたが、1 を除くすべての整数に対して 1 回しか実行されませんSeries(1)

たとえば、単に ActiveChart.SeriesCollection(1).Delete を呼び出すと、シリーズは削除されますが、別の整数 (4、9、12) で実行すると実行されません。1 に対して再び機能しますが、1 のみです。他の整数 (4 など) でも 1 回は機能しますが、整数を 1 に変更したり、4 のままにしたり、他の整数に変更したりしても、後続の呼び出しはすべて失敗します。番号。

その振る舞いは実に奇妙です。

どんなアイデアでも大歓迎です。ActiveChart.SeriesCollection(1).Delete最初の 3 つのシリーズは常に空ではないため、単純に繰り返し呼び出すことはできません。

ありがとう。

** アップデート **

以下を手動で実行してテストを実行しました。

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

結果を確認するために、1 ~ 16 の数字 (グラフには 14 個のシリーズしかありません) を試して SeriesCollection を循環させました。1 - 3 は正常に動作しました 4 - 13 はUnable to get the Name property of the Series class 14 で正常に動作しました 15 - 16 でエラーが発生しましたMethod 'SeriesCollection' of object '_Chart' failed<- チャート内のシリーズの数を考えると驚くことではありません。

この種の動作は、Excel にバグがあると思わせます。他のアイデアはありますか?

4

3 に答える 3

3

グラフからすべての系列を削除すると、Excel にバグが発生します。私の回避策は、(データが含まれていなくても) 少なくとも 1 つのシリーズをチャートに残すことです。それは私にはうまくいくようです。

ちょうど別のことを考えました。シリーズを削除すると、残りのすべてのシリーズのインデックスが 1 つ減るので、1 からシリーズの数までループして削除することはできません。代わりにできることは、SeriesCollection.Count = 0(または 1、以前の私のコメントを参照) までそれらを削除する do ループを使用することです。または、後方に反復し、常に最後のシリーズを削除する for ループ (つまりSeriesCollection(SeriesCollection.Count).Delete

于 2013-05-09T20:35:07.430 に答える
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
于 2016-12-09T18:01:32.053 に答える
0

コードを次のように単純化できます。

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

コードがうまくいかなかった理由はわかりませんが、通常はシンプルな方が良いでしょう。また、シリーズを削除するためにシリーズ名を知る必要はありません。

于 2017-01-06T14:46:11.037 に答える