遍历图纸创建图形

时间:2019-03-25 12:58:22

标签: 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" & Range("A" & Rows.Count).End(xlUp).Row)
            .SeriesCollection(1).Values = .Range("E2:E" & Range("E" & Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Name = .Range("$E$1")
            .SeriesCollection(2).XValues = .Range("E2:E" & Range("E" & Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Values = .Range("F2:F" & Range("F" & Rows.Count).End(xlUp).Row)

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

1 个答案:

答案 0 :(得分:4)

您需要定义这些RangeShape对象在哪个工作表中。例如

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("$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" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)
            .SeriesCollection(1).Values = ws.Range("E2:E" & ws.Range("E" & ws.Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Name = ws.Range("$E$1")
            .SeriesCollection(2).XValues = ws.Range("E2:E" & ws.Range("E" & ws.Rows.Count).End(xlUp).Row)
            .SeriesCollection(2).Values = ws.Range("F2:F" & ws.Range("F" & ws.Rows.Count).End(xlUp).Row)

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