5

散布図を生成し、グラフのいくつかのプロパティを変更する Excel VBA コードを作成しました。(参照用にコードを以下に示します。)コードは、チャートの凡例の削除、水平/垂直グリッド線の削除、X シリーズと Y シリーズの変更などのタスクをゆっくりと移動します。Excel のタイマーは、各タスクの次の期間を示します。

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 シリーズのプロット、および凡例の削除には時間がかかるようです。コードを記述する別の方法をグーグルで検索しましたが、有用なものを見つけることができませんでした。速度が遅いことを除けば、コードは完全に期待どおりに機能します。パフォーマンスの低下の原因と、これを高速化する方法についてのアイデアはありますか? 前もって感謝します。

編集:チャートの操作中は、画面の更新を既にオフにしています。違いが生じる場合、ユーザーフォームが開いている間にチャートが生成/フォーマットされます。

関連するコードのスニペットは次のとおりです。

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
4

1 に答える 1

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
于 2013-10-13T06:19:35.700 に答える