#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. Это работает, спасибо вам большое, я действительно ценю помощь!