如何更改此Excel宏(VBA)以在任何工作表上运行?

时间:2014-08-15 10:57:00

标签: vba excel-vba worksheet excel

我有几个学校的表格中安排了数据。每所学校都在一个单独的工作表上。以下代码(录制的宏)将为引用的工作表(2002 - CJS)生成图表。如何修改它以在任何工作表上创建图表?

Sub Gendergraph()
'
' Gendergraph Macro
'

'
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(1).Name = "='2002 - CJS'!$B$2"
    ActiveChart.SeriesCollection(1).Values = _
        "='2002 - CJS'!$D$3:$D$6,'2002 - CJS'!$D$10:$D$12"
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(2).Name = "='2002 - CJS'!$E$2"
    ActiveChart.SeriesCollection(2).Values = _
        "='2002 - CJS'!$G$3:$G$6,'2002 - CJS'!$G$10:$G$12"
    ActiveChart.SeriesCollection(2).XValues = _
        "='2002 - CJS'!$B$3:$B$6,'2002 - CJS'!$B$10:$B$12"
End Sub

2 个答案:

答案 0 :(得分:1)

假设工作簿中的所有工作表都需要生成图表,您可以遍历工作表并添加如下图表:

Sub Gendergraph()
'
' Gendergraph Macro
'
    Dim ws as Worksheet

    For Each ws in Thisworkbook.Worksheets

        ws.Shapes.AddChart.Select
        ActiveChart.ChartType = xlColumnClustered
        ActiveChart.SeriesCollection.NewSeries
        ActiveChart.SeriesCollection(1).Name = "='" & ws.Name & "'!$B$2"
        ActiveChart.SeriesCollection(1).Values = _
            "='" & ws.Name & "'!$D$3:$D$6,'" & ws.Name & "'!$D$10:$D$12"
        ActiveChart.SeriesCollection.NewSeries
        ActiveChart.SeriesCollection(2).Name = "='" & ws.Name & "'!$E$2"
        ActiveChart.SeriesCollection(2).Values = _
            "='" & ws.Name & "'!$G$3:$G$6,'" & ws.Name & "'!$G$10:$G$12"
        ActiveChart.SeriesCollection(2).XValues = _
            "='" & ws.Name & "'!$B$3:$B$6,'" & ws.Name & "'!$B$10:$B$12"

    Next ws

End Sub

答案 1 :(得分:0)

您需要开始考虑正在进行的通用流程 - 您将图表添加到工作表中,然后设置图表的标题和数据。

使用ActiveSheet(或任何Active *对象)并不是一个很好的方法(或者其他任何东西,Excel宏录制器都会编写一些可怕的代码......)。

我将使用的方法是将工作表传递给添加图表的Sub,即

Sub Gendergraph(ws As Worksheet)

    With ws.Shapes.AddChart.Chart

        .ChartType = xlColumnClustered

        With .SeriesCollection.NewSeries
            .Name = ws.Range("B2")
            .Values = Union(ws.Range("D3:D6"), ws.Range("D10:D12"))
        End With

        With .SeriesCollection.NewSeries
            .Name = ws.Range("E2")
            .Values = Union(ws.Range("G3:G6"), ws.Range("G10:G12"))
            .XValues = Union(ws.Range("B3:B6"), ws.Range("B10:B12"))
        End With

    End With

End Sub

现在您需要的是另一个例程,它将每个工作表传递到该过程中,并且所有工作表都将添加一个图表。