2013-10-13 4 views
5

Ho scritto un codice VBA di Excel che genera uno scatterplot e modifica alcune proprietà del grafico. (Il codice è sotto per riferimento.) Il codice si sposta lentamente attraverso attività come l'eliminazione della legenda del grafico, la rimozione delle linee orizzontali/verticali e la modifica delle serie X e Y. Timer di Excel mi dà la durata di seguito per ogni attività:Manipolazione grafica VBA lenta

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 

Rimozione della griglia, cambiando il titolo, tracciando il X e Y serie, e l'eliminazione la leggenda sembrano richiedere molto tempo. Ho cercato su Google modi alternativi per scrivere il codice, ma non sono riuscito a trovare nulla di utile. Il codice funziona interamente come previsto, fatta eccezione per la bassa velocità. Qualche idea su cosa sta causando la cattiva prestazione e su come posso accelerarla? Grazie in anticipo.

MODIFICA: ho già disattivato l'aggiornamento dello schermo mentre lavoravo con il grafico. Il grafico è generato/formattato mentre un modulo utente è aperto, se questo fa alcuna differenza.

Ecco il relativo frammento di codice:

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

Puoi pubblicare un campione della tua cartella di lavoro? – brettdj

risposta

2

Senza i dati e le specifiche della macchina può essere difficile da dire perché questo è lento, anche se qui ci sono alcune alternative alla parte del codice che avete.

La prima cosa che cambierei è non per attivare il grafico. Se si sta creando il grafico tramite codice, farlo ma impostarlo su una variabile, ad esempio Set wcChart = ThisWorkbook.Charts.Add. Quindi cambiare With ActiveChart a With wcChart.

Inoltre, eliminare FullSeriesCollection e quindi eliminare il titolo del grafico, rimuovere le linee della griglia e modificare gli assi prima di riempire i nuovi dati. La manipolazione della tabella dovrebbe essere più veloce con meno dati nel grafico. Fai attenzione però perché cambiando aspetti del grafico in diversi ordini è possibile produrre output diversi (ad esempio il layout di una legenda).

Si compila il nuovo FullSeriesCollection con le intere colonne di A e C, specificare l'intervallo esatto dei dati anziché l'intera colonna.

Altre modifiche da provare, non sto dicendo che funzioneranno ma valgono la pena di sparare se non ci hai provato. Invece di controllare per un FullSeriesCollection ogni volta:

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

Il seguente può essere più veloce:

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

Inoltre, invece di .SetElement del titolo del grafico e griglia Io uso il seguente:

'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

Grazie per i tuoi suggerimenti: sono riuscito a ridurre l'intero processo fino a 0,5 secondi dai precedenti 3 secondi. Sembra che il suggerimento chiave qui fosse di tracciare la serie X e Y per ultime, e manipolare il grafico senza dati nel grafico. Il runtime ora, per riferimento: 'dispersione inserto: 0,05,078125 millions eliminare serie: 0 leggenda di eliminazione: 0 cancellare titolo del grafico: assi 0 formato: 0 trama x vs y: 0.5234375 complessivo: 0.578125' –

+0

Inoltre, per quanto riguarda la rimozione del titolo del grafico, sono stato in grado di utilizzare '.HasTitle = False' senza prima impostare true e senza problemi. Va anche notato che '.HasMajorGridlines' e' .HasMinorGridlines' sono proprietà di un 'Asse' piuttosto che un' Grafico'. –

+0

Contento di aver sentito funzionare, è necessario disporre di una quantità ragionevole di punti dati per rallentare. Avrai bisogno di '.HasTitle = False/True' per compatibilità con le versioni precedenti con almeno il 2007 (forse il 2010?). Abbastanza giusto con le linee della griglia. – CuberChase