具有多个系列但具有相同X值的Excel VBA图表

时间:2013-12-31 16:31:29

标签: excel-vba excel-2003 excel-2013 vba excel

我正在尝试在Excel中组合一个VB脚本,创建一个“Stacked Bar Chart”。

通过此site中的示例,我执行了以下代码:

Sub AddNewSeries()
    ActiveSheet.Shapes.AddChart2(297, xlBarStacked).Select
    With ActiveChart.SeriesCollection.NewSeries
        .Name = ActiveSheet.Range("$E$3")
        .Values = ActiveSheet.Range("IFPStart")
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$G$4")
        .Values = ActiveSheet.Range("IFPBC")
        .XValues = ActiveSheet.Range("IFPPN")
         .Name = ActiveSheet.Range("$H$4")
        .Values = ActiveSheet.Range("IFPBT")
        .XValues = ActiveSheet.Range("IFPPN")
         .Name = ActiveSheet.Range("$I$4")
        .Values = ActiveSheet.Range("IFPEC")
        .XValues = ActiveSheet.Range("IFPPN")
         .Name = ActiveSheet.Range("$J$4")
        .Values = ActiveSheet.Range("IFPFin")
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$K$4")
        .Values = ActiveSheet.Range("IFPIMS")
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$L$4")
        .Values = ActiveSheet.Range("IFPInf")
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$M$4")
        .Values = ActiveSheet.Range("IFPPT")
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$N$4")
        .Values = ActiveSheet.Range("IFPSols")
        .XValues = ActiveSheet.Range("IFPPN")
    End With
End Sub

您将看到,我使用命名范围而不是使用单元格引用,因为数据将是动态的。

代码运行时没有显示任何错误,但使用的是最后一个系列,即

.Name = ActiveSheet.Range("$N$4")

覆盖以前绘制的数据。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您暂时没有添加系列。您正在添加一个系列,并不断更改(覆盖)该系列的属性。因此,您最终只得到一个系列,其中包含您指定的属性。

以下可能效果更好:

Sub AddNewSeries()
    ActiveSheet.Shapes.AddChart2(297, xlBarStacked).Select
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$E$3")
        .Values = ActiveSheet.Range("IFPStart")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$G$4")
        .Values = ActiveSheet.Range("IFPBC")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
         .Name = ActiveSheet.Range("$H$4")
        .Values = ActiveSheet.Range("IFPBT")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
         .Name = ActiveSheet.Range("$I$4")
        .Values = ActiveSheet.Range("IFPEC")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
         .Name = ActiveSheet.Range("$J$4")
        .Values = ActiveSheet.Range("IFPFin")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$K$4")
        .Values = ActiveSheet.Range("IFPIMS")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$L$4")
        .Values = ActiveSheet.Range("IFPInf")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$M$4")
        .Values = ActiveSheet.Range("IFPPT")
    End With
    With ActiveChart.SeriesCollection.NewSeries
        .XValues = ActiveSheet.Range("IFPPN")
        .Name = ActiveSheet.Range("$N$4")
        .Values = ActiveSheet.Range("IFPSols")
    End With
End Sub

您可能需要

ActiveChart.SeriesCollection(1).Delete

AddChart2声明之后 - 在我的机器上,它试图“猜测”一个系列并且非常非常错误......但上面的内容将其删除并留给我“好”系列。

另外 - 我发现在Mac上,我无法使用AddChart2,但必须使用AddChart。不确定这对你是否重要。