2013-10-13 22 views
5

散布図を生成し、グラフのいくつかのプロパティを変更するExcel VBAコードを書きました。コードは、グラフの凡例の削除、水平/垂直グリッド線の削除、XおよびYシリーズの変更などのタスクをゆっくりと移動します。 Excelのタイマーは私に、タスクごとに、次の期間を与える:VBA Chart操作が遅い

insert scatterplot: 0.01171875 
delete series: 0 
plot x vs y: 0.55859375 
delete legend: 0.5703125 
delete chart title: 0.66015625 
remove grid: 1.3046875 
format axes: 0 
overall: 3.11328125 

、グリッドを削除するタイトルを変更し、XとYシリーズをプロットし、凡例を削除するには長い時間がかかるように見えます。私は、コードを書く代わりの方法を探ってきたが、何か有用なものを見つけることができなかった。遅い速度を除いて、コードは完全に期待通りに機能します。何が悪いパフォーマンスを引き起こしているか、どのように私はこれをスピードアップすることができますか?前もって感謝します。

EDIT:チャートの操作中に画面の更新を無効にしました。チャートは、ユーザーフォームが開いている間に生成/書式設定されます。ここにあなたが持っているコードの一部にはいくつかの選択肢があるが、これが遅い理由を言うのは難しいことができ、データおよび機械の仕様がなければ

With ActiveChart 
    'Delete all series currently in plot 
    Do While .FullSeriesCollection.Count > 0 
     .FullSeriesCollection(1).Delete 
    Loop 

    'Plot Actual (Y) vs. Inverse Distribution (X) 
    .SeriesCollection.NewSeries 
    .FullSeriesCollection(1).XValues = "=" & tempSheetName & "!$C:$C" 
    .FullSeriesCollection(1).Values = "=" & tempSheetName & "!$A:$A" 

    'Delete legend 
    .Legend.Delete 

    'Delete chart title 
    .SetElement (msoElementChartTitleNone) 

    'Remove gridlines 
    .SetElement (msoElementPrimaryValueGridLinesNone) 
    .SetElement (msoElementPrimaryCategoryGridLinesNone) 

    'Format axes 
    Dim xAxis As Axis, yAxis As Axis 
    Set xAxis = .Axes(xlCategory) 
    Set yAxis = .Axes(xlValue) 

    With yAxis 
     'Title y axis "actual" 
     .HasTitle = True 
     .AxisTitle.Caption = "Actual" 

     'Add tick marks 
     .MajorTickMark = xlOutside 
    End With 

    With xAxis 
     'Title x axis by dist type 
     .HasTitle = True 
     .AxisTitle.Caption = dist.getDistType 

     'Add tick marks 
     .MajorTickMark = xlOutside 
    End With 
End With 
+0

ブックのサンプルを投稿できますか? – brettdj

答えて

2

は、ここでは、コードの関連するスニペットです。

私が変更したいと思われるものは、ではなく、でグラフを有効にします。コードを使用してグラフを作成する場合は、それを変数に設定します(例:Set wcChart = ThisWorkbook.Charts.Add)。次にWith ActiveChartWith wcChartに変更します。

また、FullSeriesCollectionを削除し、グラフのタイトルを削除し、グリッド線を削除して、軸を変更してから新しいデータを入力してください。グラフの操作は、グラフ内のデータが少なくてすみ、すばやく行う必要があります。ただし、異なる注文のチャートを変更すると、異なる出力(例として凡例のレイアウト)が生成されるため、ここでは注意してください。

新しいFullSeriesCollectionをAとCの列全体に入力し、列全体ではなくデータの正確な範囲を指定します。

他にも試してみると、これらはうまくいくとは言えませんが、試してみると価値があります。代わりにFullSeriesCollectionのために毎回チェック:

Do While .FullSeriesCollection.Count > 0 
    .FullSeriesCollection(1).Delete 
Loop 

が速くなることがあります。

For ii = .FullSeriesCollection.Count To 1 Step -1 
    .FullSeriesCollection(ii).Delete 
Next ii 
また

、代わりに私は以下を使用チャートのタイトルとグリッド線のための.SetElement

'You have to set the title to 'True' before it'll work with 'False'. Go figure. 
.HasTitle = True 
.HasTitle = False 

.HasMajorGridlines = False 
.HasMinorGridlines = False 
+0

あなたの提案をありがとう - 私は前の3秒から0.5秒までプロセス全体をカットすることができました。ここでの重要な提案は、XシリーズとYシリーズを最後にプロットし、チャートにデータがないチャートを操作することでした。参考のため 今ランタイム: 'インサート散布:0 削除凡例:0 削除チャートタイトル:0.05078125 一連削除0 形式は軸:Y対X 0 プロット:0。5234375 overall:0.578125' –

+0

また、チャートのタイトルを削除する限り、最初にtrueに設定せずに '.HasTitle = False'を使用することができ、問題はありませんでした。 '.HasMajorGridlines'と' .HasMinorGridlines'は 'Chart'ではなく' Axis'のプロパティです。 –

+0

それがうまくいっていることを聞いてうれしく思うのですが、データポイントが減速するためには妥当な量のデータポイントが必要です。少なくとも2007年(おそらく2010年?)との後方互換性のために '.HasTitle = False/True'が必要です。グリッドラインで十分に公正。 – CuberChase

関連する問題