2016-11-18 1 views
1

Ich produziere ein Excel-Säulendiagramm aus einem VB-Makro. Ich habe 3 horizontale Referenzlinien hinzugefügt und stelle fest, dass nach Abschluss des Makros nur der erste angezeigt wird (zusammen mit dem Säulendiagramm). Wenn ich jedoch die Arbeitsmappe speichern und erneut öffnen, sind alle 3 Referenzlinien sichtbar. Alternativ, wenn ich auf die Design-Registerkarte auf "Daten auswählen" gehe und einfach auf einen der Referenzliniennamen klicke, erscheinen sofort alle 3. Irgendwelche Ideen, was ich in mein Makro tun kann, um sie alle automatisch erscheinen zu lassen, wenn das Makro fertig ist?Warum fehlen in meinem Excel-Diagramm vorübergehend einige Serien?

Der Code, der diese drei Bezugslinien erzeugt ist (sc ist die SeriesCollection der Grafik):

With sc.NewSeries 
    .ChartType = xlXYScatterLinesNoMarkers 
    .Name = "A" 
    .XValues = "={1,3}" 
    .Values = "={100,100}" 
End With 
With sc.NewSeries 
    .ChartType = xlXYScatterLinesNoMarkers 
    .Name = "B" 
    .XValues = "={1, 3}" 
    .Values = "={80, 80}" 
End With 
With sc.NewSeries 
    .ChartType = xlXYScatterLinesNoMarkers 
    .Name = "C" 
    .XValues = "={1, 3}" 
    .Values = "={50, 50}" 
End With 

EDIT: Hier ist ein Screenshot der Daten in der Antwort von @ axel-richter verwenden. So sieht es unmittelbar nach dem Ende des Makros aus.

Screenshot

+0

Wenn Sie durch den Code (F8) gehen wird es wie erwartet angezeigt? –

+0

Ja, zeigt sich gut, wenn ich es durchtrete. – RonR

+0

'DoEvents' hat keine Wirkung. Auf eine Ahnung habe ich auch 'Application.Wait Now()' aber immer noch nichts ausprobiert. – RonR

Antwort

0

Ich nehme an, das mit Excel 2010 und später.

Rufen Sie Chart.ChartWizard Method ohne Parameter nach dem Hinzufügen neuer Serien.

Beispiel:

Angenommen, wir haben:

enter image description here

Dann, nach dem Ausführen dieses Makros:

Sub addChart() 

Dim oChart As ChartObject 
Dim sc As SeriesCollection 

Set oChart = ActiveSheet.ChartObjects.Add(300, 40, 300, 200) 
oChart.Chart.ChartWizard Source:=ActiveSheet.Range("A1:D4"), Gallery:=xlColumn 

Set sc = oChart.Chart.SeriesCollection 

With sc.NewSeries 
    .ChartType = xlXYScatterLinesNoMarkers 
    .Name = "A" 
    .XValues = "={1,3}" 
    .Values = "={100,100}" 
End With 
With sc.NewSeries 
    .ChartType = xlXYScatterLinesNoMarkers 
    .Name = "B" 
    .XValues = "={1, 3}" 
    .Values = "={80, 80}" 
End With 
With sc.NewSeries 
    .ChartType = xlXYScatterLinesNoMarkers 
    .Name = "C" 
    .XValues = "={1, 3}" 
    .Values = "={50, 50}" 
End With 

oChart.Chart.ChartWizard 

End Sub 

haben wir:

enter image description here

+0

Danke, aber wenn ich diesen Code ausführen, bekomme ich immer noch genau das gleiche Problem - nur die erste Zeile erscheint. – RonR

+0

Welche Excel-Version? Funktioniert für mich mit Excel 2016. –

+0

Office 365 - Excel 16.0.6965.2105 – RonR

0

Ich habe immer noch keine Erklärung dafür, warum diese Zeilen nicht für mich auftauchen, aber ich habe eine "Lösung" gefunden, die sie in die Sichtbarkeit zwingt. Ich fügte am Ende des Makros folgendes hinzu, um (a) am Ende eine zusätzliche Reihe hinzuzufügen und (b) es sofort zu löschen.

With sc.NewSeries 
    .ChartType = xlXYScatterLinesNoMarkers 
    .Name = "D" 
    .XValues = "={1, 3}" 
    .Values = "={50, 50}" 
End With 
sc(sc.Count).Select 
Application.SendKeys "{Delete}" 

Beachten Sie die letzte Zeile. Mit Selection.Delete wird die Extra-Reihe gelöscht, aber die Linien, die unsichtbar waren, bleiben auf diese Weise erhalten.

0

Wenn Sie die Zeit haben, versuchen Sie nicht, Ihr SeriesCollection-Objekt wiederzuverwenden.

Ich stieß auf diese mit einer C# -App, die ich schreibe. Die einzige Ähnlichkeit, die ich zwischen unserem Code sehen konnte, war, dass wir beide NewSeries() für dasselbe SeriesCollection-Objekt aufgerufen haben.

Es ist auch erwähnenswert, die Chartwizard, und Quick-Serie-erstellen-löschen Workaround-Methoden hat nicht für mich arbeiten.

Woran hat seriescollection() vor jedem Aufruf von SeriesCollection.NewSeries() im Diagrammobjekt aufgerufen?

Wie in:

ChartObject co = target.ChartObjects().Item(1); 
Chart c = co.Chart; 
SeriesCollection s = c.SeriesCollection(); 
Series s1 = s.NewSeries(); 
s1.ChartType = XlChartType.xlLine; 

s = c.SeriesCollection(); 
Series s2 = s.NewSeries(); 
s2.ChartType = XlChartType.xlLine; 

Gesamt Vermutung, aber ich vermute, einen Defekt in der Klasse Series; Möglicherweise wird bei nachfolgenden NewSeries-Aufrufen kein Ereignis ausgelöst.Abhängig von der Version, die jeder von uns benutzt, verursachen die Workarounds das Ereignis, das nicht feuert und daher würden wir sehen, dass die unsichtbare Serie tatsächlich erscheint.

Verwandte Themen