Цикл создания графиков на листах

#excel #vba

#excel #vba

Вопрос:

Я настраиваю рабочую книгу, которая нуждается в еженедельных обновлениях. Он содержит 10 листов, и я пытаюсь создать цикл, который создает график для каждого листа.

Я попробовал цикл с sh.activate, который в конечном итоге создал график с данными из worksheet1 на всех рабочих листах. После этого я попытался создать внешний вид без .activate это не сработает, хотя это правильный способ сделать это?

 Sub graph()
    Dim ws As Worksheet
    Dim chrt As Chart
    Dim StartCell As Range

    For Each ws In Worksheets
        Set StartCell = .Range("e1")
        Set chrt = .Shapes.AddChart.Chart

        With chrt
            .SetSourceData Source:=Range("$C$1:$D$11")
            .ChartType = xlLine

            .SeriesCollection(1).Name = .Range("$F$1")
            .SeriesCollection(1).XValues = .Range("A2:A" amp; Range("A" amp; Rows.Count).End(xlUp).Row)
            .SeriesCollection(1).Values = .Range("E2:E" amp; Range("E" amp; Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Name = .Range("$E$1")
            .SeriesCollection(2).XValues = .Range("E2:E" amp; Range("E" amp; Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Values = .Range("F2:F" amp; Range("F" amp; Rows.Count).End(xlUp).Row)

            .HasTitle = True
            .ChartTitle.Characters.Text = "Effektivitet"
        End With
    Next ws
End Sub
  

Комментарии:

1. Все эти точечные обозначения и оператор no with для их поддержки … для каждого ws на рабочих листах вам нужно указать, что вы работаете с ws, таким образом, фигуры и сортировка соответствуют этому конкретному листу, не используя activate . Обратите внимание, что у вас используется startCell . Диапазон, но вы не указали рабочий лист для существования этого диапазона.

2. Хорошо, я все еще новичок в vba, поэтому я ценю помощь. Спасибо

Ответ №1:

Вам нужно определить, на каком листе находятся эти Range и Shape объекты. Например, в

 Set StartCell = .Range("e1")
Set chrt = .Shapes.AddChart.Chart
  

определить ws как рабочий лист:

 Set StartCell = ws.Range("e1")
Set chrt = ws.Shapes.AddChart.Chart
  

Обратите внимание, что инструкции могут начинаться с точки, только .Range если они находятся внутри With инструкции. Итак, вышесказанное совпадает со следующим:

 With ws
    Set StartCell = .Range("e1")
    Set chrt = .Shapes.AddChart.Chart
End With
  

Вам также необходимо проверить другие ваши объекты range, потому что они начинаются так, как будто .Range("$F$1") они ссылаются на With chrt , который является объектом диаграммы, но на который они должны ссылаться ws.Range("$F$1") .

Итак, в итоге вы должны получить что-то вроде:

 Option Explicit

Public Sub graph()
    Dim ws As Worksheet
    Dim chrt As Chart
    Dim StartCell As Range

    For Each ws In Worksheets
        Set StartCell = ws.Range("e1")
        Set chrt = ws.Shapes.AddChart.Chart

        With chrt
            .SetSourceData Source:=ws.Range("$C$1:$D$11")
            .ChartType = xlLine

            .SeriesCollection(1).Name = ws.Range("$F$1")
            .SeriesCollection(1).XValues = ws.Range("A2:A" amp; ws.Range("A" amp; ws.Rows.Count).End(xlUp).Row)
            .SeriesCollection(1).Values = ws.Range("E2:E" amp; ws.Range("E" amp; ws.Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Name = ws.Range("$E$1")
            .SeriesCollection(2).XValues = ws.Range("E2:E" amp; ws.Range("E" amp; ws.Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Values = ws.Range("F2:F" amp; ws.Range("F" amp; ws.Rows.Count).End(xlUp).Row)

            .HasTitle = True
            .ChartTitle.Characters.Text = "Effektivitet"
        End With
    Next ws
End Sub
  

Комментарии:

1. Это работает, спасибо вам большое, я действительно ценю помощь!