Ich habe den folgenden Code in Excel geschrieben, um ein XY-Punktdiagramm zu erstellen und die Punkte zu formatieren, um eine visuelle Zeitleiste von Ereignissen/Entscheidungen innerhalb eines bestimmten Zeitraums (zwischen sDate
) zu erstellen und eDate
).Wenn if-Anweisungen innerhalb einer Schleife einen ungültigen Parameterfehler erzeugen
Option Explicit
Sub UpdateTimeline()
'Updates timeline chart with dates in specified range and updates formatting
Dim timelineChart As Chart
Dim recordCount As Long
Dim record As Range
Application.ScreenUpdating = False
timelineSheet.Unprotect
Call ClearSeries
Set timelineChart = Worksheets("Timeline").ChartObjects("chtDecisionTimeline").Chart
recordCount = 0
For Each record In Range(decisionRecordSheet.Range("D7"), decisionRecordSheet.Range("D7").End(xlDown))
recordCount = recordCount + 1
If record.Value >= timelineSheet.Range("sDate") Then
If record.Value <= timelineSheet.Range("eDate") Then
timelineChart.SeriesCollection.NewSeries
With timelineChart.SeriesCollection(recordCount)
.Name = "='Decision Record'!" & record.Offset(0, 1).Address
.XValues = "='Decision Record'!" & record.Address
.Values = "='Decision Record'!" & record.Offset(0, -2).Address
.AxisGroup = 2
.MarkerStyle = 8
.MarkerSize = 7
.MarkerBackgroundColor = RGB(228, 10, 56)
.MarkerForegroundColor = -2
.Format.Line.Visible = False
.ApplyDataLabels
.DataLabels.ShowValue = False
.DataLabels.ShowSeriesName = True
.DataLabels.Orientation = xlUpward
If record.Offset(0, -2).Value Mod 2 <> 0 Then
timelineChart.SeriesCollection(recordCount).DataLabels.Position = xlLabelPositionRight
Else
timelineChart.SeriesCollection(recordCount).DataLabels.Position = xlLabelPositionLeft
End If
End With
End If
End If
Next
timelineChart.SetElement (msoElementSecondaryValueAxisNone)
With timelineChart.Axes(xlCategory, xlPrimary)
.MaximumScale = timelineSheet.Range("eDate").Value
.MinimumScale = timelineSheet.Range("sDate").Value
End With
With timelineChart.Axes(xlValue, xlPrimary)
.MaximumScale = lookupSheet.Range("yMax").Value
.MinimumScale = lookupSheet.Range("yMin").Value
End With
With timelineSheet
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
.EnableSelection = xlUnlockedCells
End With
Application.ScreenUpdating = True
End Sub
Die decisionRecordSheet enthält Daten in folgendem Format in Spalten BF:
Und die timelineSheet stellt sich wie folgt dar:
Der Code funktioniert gut (obwohl ich weiß, dass es nicht schön ist), außer wenn der vom Benutzer angegebene Datumsbereich (in sDate
und eDate
) bedeutet, dass nur 0-2 Datensätze im Diagramm geplottet werden müssen. In diesem Fall wird ein ungültiger Parameterfehler für With timelineChart.SeriesCollection(recordCount)
ausgegeben.
Ich habe versucht, die Zeile 18,19,42 und 43 zu kommentieren, und es scheint, dass die if-Anweisungen die Anzahl der Datensätze reduzieren, die die Kriterien erfüllen, die das Problem verursachen. Ich habe auch versucht, den Gesamtdatensatz zu reduzieren, so dass es nur 0-2 gibt und ich denselben Fehler erhalte.
Natürlich hat dies möglicherweise nichts mit der Anzahl der Datensätze zu tun, die geplottet werden, aber dies sind die einzigen Tests, die dieses Verhalten konsistent repliziert haben.
EDIT:
ich auch einen Laufzeitfehler erhalten, wenn es mehr als 2 Einzelteile sind aber nur zu zeichnen, wenn ich Linien 18,19,42 und 43 in meinem Code enthalten haben - wenn ich sie kommentieren raus, ich bekomme den Fehler nicht mehr.
Wenn ich debuggen es scheint, dass das Problem mit timelineChart.SetElement (msoElementSecondaryValueAxisNone)
ist, aber ich habe keine Ahnung, warum.