2016-05-05 8 views
2

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:

Image showing layout of decisionRecordSheet data

Und die timelineSheet stellt sich wie folgt dar:

enter image description here

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.

Error message

Wenn ich debuggen es scheint, dass das Problem mit timelineChart.SetElement (msoElementSecondaryValueAxisNone) ist, aber ich habe keine Ahnung, warum.

Antwort

0

Ich kann es nicht replizieren, wie Sie Code rufen wir hier nicht haben, aber: -

Wenn Sie recordCount = recordCount + 1 bewegen, nachdem timelineChart.SeriesCollection.NewSeries zu kommen, oder

oder

ändern ändern timelineChart.SeriesCollection(recordCount) bis timelineChart.SeriesCollection(timelineChart.SeriesCollection.Count)

Dies kann ein positives Ergebnis liefern. Ihr recordCount, der verwendet wurde, um die Sammlung zu finden, wurde jedes Mal inkrementiert, aber es gibt eine if-Anweisung, die bedeutete, dass eine Serie möglicherweise nicht jedes Mal erstellt wird.

Verwandte Themen