2013-10-13 19 views
5

Ich schrieb einige Excel-VBA-Code, der ein Streudiagramm generiert und einige Eigenschaften des Diagramms ändert. (Code ist unten als Referenz.) Der Code bewegt sich langsam durch Aufgaben wie Löschen der Diagrammlegende, Entfernen von horizontalen/vertikalen Gitternetzlinien und Ändern der X- und Y-Reihe. Excel-Timer gibt mir die folgende Dauer für jede Aufgabe:VBA Chart Manipulation Langsam

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 

Entfernen des Gitters, die Änderung des Titels, Auftragen der X- und Y-Serie, und Löschen der Legende scheint eine lange Zeit in Anspruch zu nehmen. Ich habe nach alternativen Methoden gegoogelt, um den Code zu schreiben, aber ich konnte nichts Nützliches finden. Der Code funktioniert vollständig wie erwartet, außer für die langsame Geschwindigkeit. Irgendwelche Ideen, was die schlechte Leistung verursacht und wie ich das beschleunigen kann? Danke im Voraus.

EDIT: Ich habe bereits Bildschirmaktualisierung während der Arbeit mit dem Diagramm ausgeschaltet. Das Diagramm wird generiert/formatiert, während ein Benutzerformular geöffnet ist, wenn dies einen Unterschied macht.

Hier ist der relevante Code-Snippet:

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

Können Sie ein Beispiel Ihrer Arbeitsmappe posten? – brettdj

Antwort

2

Ohne die Daten und Maschinen Spezifika es schwer zu sagen, warum dieser langsam ist, obwohl hier sind einige Alternativen zu einigen der Code, den Sie haben.

Die erste und wichtigste Sache, die ich ändern würde, ist nicht, um das Diagramm zu aktivieren. Wenn Sie das Diagramm über Code erstellen, tun Sie dies, aber setzen Sie es auf eine Variable, z. B. Set wcChart = ThisWorkbook.Charts.Add. Ändern Sie dann With ActiveChart zu With wcChart.

Löschen Sie auch die FullSeriesCollection und löschen Sie dann den Diagrammtitel, entfernen Sie die Gitternetzlinien und ändern Sie die Achsen vor dem Auffüllen der neuen Daten. Die Chartmanipulation sollte mit weniger Daten im Chart schneller sein. Seien Sie jedoch vorsichtig, da sich die verschiedenen Aspekte des Diagramms in verschiedenen Ordnungen können verschiedene Ausgaben erzeugen (als Beispiel das Layout einer Legende).

Sie füllen die neue FullSeriesCollection mit den gesamten Spalten von A und C, geben Sie den genauen Bereich der Daten und nicht die gesamte Spalte an.

Andere Änderungen zu versuchen, ich sage nicht, dass diese funktionieren werden, aber sie sind einen Versuch wert, wenn Sie es nicht versucht haben. Anstatt jedes Mal für eine FullSeriesCollection Überprüfung:

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

Die folgende kann schneller sein:

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

Auch anstelle von .SetElement für den Diagrammtitel und Gitternetzlinien ich folgendes verwenden:

'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

Vielen Dank für Ihre Vorschläge - Ich konnte den gesamten Prozess von den letzten 3 Sekunden auf 0,5 Sekunden reduzieren. Es scheint, dass der Schlüsselvorschlag hier war, die X- und Y-Serie zuletzt zu zeichnen und das Diagramm ohne Daten im Diagramm zu manipulieren. Die Laufzeit jetzt, als Referenz: 'Einsatz Scatterplot: 0,05078125 Serie löschen: 0 löschen Legende: 0 löschen Diagrammtitel: 0 Format Achsen: 0 Plot x vs y: 0 gewonnen.5234375 insgesamt: 0,578125' –

+0

Auch - soweit ich den Titel des Diagramms löschte, konnte ich '.HasTitle = False' verwenden, ohne zuerst auf true zu setzen und hatte keine Probleme. Es sollte auch angemerkt werden, dass ".HasMajorGridlines" und ".HasMinorGridlines" Eigenschaften einer "Axis" und nicht eines "Chart" sind. –

+0

Gut zu hören, dass es funktioniert, Sie müssen eine angemessene Menge an Datenpunkten haben, damit es langsamer wird. Sie benötigen '.HasTitle = False/True 'für die Abwärtskompatibilität mit mindestens 2007 (vielleicht 2010?). Gut genug mit den Gitterlinien. – CuberChase