jpcgandre
jpcgandre

Reputation: 1505

Excel. Creating charts in different sheets

I need to create one chart per sheet in Excel. Here is my code:

    Sheets(i).Activate

    For Each cht In ActiveSheet.ChartObjects
        cht.Delete
    Next

    'create chart
    Set chtChart = ActiveSheet.ChartObjects.Add(Left:=75, Width:=300, Top:=75, Height:=300).Chart
    With chtChart
        .ChartType = xlXYScatterSmooth

        Do While .SeriesCollection.Count <> 0
            Do Until .SeriesCollection.Count = 0
                .SeriesCollection(1).Delete
            Loop
        Loop

        Set srsNew = .SeriesCollection.NewSeries
        With srsNew
            .XValues = "='" & Sheets(i).Name & "'!" & _
            Sheets(i).Range(Range("K2"), Range("k2").End(xlDown)).Address
            .Values = "='" & Sheets(i).Name & "'!" & _
            Sheets(i).Range(Range("l2"), Range("l2").End(xlDown)).Address
        End With
    End With

For the first sheet this works but for the second, third ... it does not. It issues the error 1004 "application defined or object defined error" in XValues or Values. I also noticed that if I introduce

range("K2")

outside the with block I get an error in the second, third .... sheets but not in the first one.

Any advise is most welcome

Regards

João

Upvotes: 0

Views: 14410

Answers (2)

deusxmach1na
deusxmach1na

Reputation: 368

Maybe it would help if you fully qualified those Ranges like this:

With srsNew
    .XValues = "='" & Sheets(i).Name & "'!" & _
    Sheets(i).Range(Sheets(i).Range("K2"), Sheets(i).Range("k2").End(xlDown)).Address
    .Values = "='" & Sheets(i).Name & "'!" & _
    Sheets(i).Range(Sheets(i).Range("l2"), Sheets(i).Range("l2").End(xlDown)).Address
End With

Upvotes: 1

GSerg
GSerg

Reputation: 78165

  1. Qualify your Ranges with sheets they belong to.
  2. Don't use Select or ActiveSheet.
  3. Don't build up the string address. Use ranges directly.
Dim CurSheet As Worksheet, cht As ChartObject
Dim chtChart As Chart, srsNew As Series

...

Set CurSheet = Worksheets(i)

For Each cht In CurSheet.ChartObjects
  cht.Delete
Next


'create chart
Set chtChart = CurSheet.ChartObjects.Add(Left:=75, Width:=300, Top:=75, Height:=300).Chart
With chtChart
  .ChartType = xlXYScatterSmooth

  Do While .SeriesCollection.Count <> 0
    .SeriesCollection(1).Delete
  Loop

  Set srsNew = .SeriesCollection.NewSeries
  With srsNew
    .XValues = CurSheet.Range(CurSheet.Range("k2"), CurSheet.Range("k2").End(xlDown))
    .Values = CurSheet.Range(CurSheet.Range("l2"), CurSheet.Range("l2").End(xlDown))
  End With
End With

Upvotes: 4

Related Questions