代码之家  ›  专栏  ›  技术社区  ›  James

如何纯粹通过excelvba编程创建堆积柱形图?

  •  2
  • James  · 技术社区  · 14 年前

    我试图在VBA中创建一个堆积柱形图,其中有一个条形图,每个条形图都显示了图中子类别的细分(请参见图的右侧)。对于普通条形图,我所要做的就是创建一个新的序列,并设置Values和XValues属性。我不知道如何告诉它子类别的值。

    alt text
    (来源: msecnd.net )

    3 回复  |  直到 5 年前
        1
  •  3
  •   Siddharth Rout    12 年前

    启动这样的任务的最简单方法是,使用宏记录器捕获VBA等效对象,查看手动执行任务时发生的情况。

    例如,我刚刚记录了这个(在excelxp中,但是以后的版本应该是类似的)。代码与记录完全一致:

    Option Explicit
    
    Sub Macro1()
    '
    ' Macro1 Macro
    ' Macro recorded 09/07/2010 by MW
    '
    
    '
        Range("B4:D6").Select
        Charts.Add
        ActiveChart.ChartType = xlColumnStacked
        ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B4:D6"), PlotBy:= _
            xlRows
        ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
    End Sub
    

    Range("B4:D6").Select 不需要,因为它在更下面重复。

    Add 在“成员…”列表的下方窗格中给出:

    Function Add([Before], [After], [Count]) As Chart
        Member of Excel.Charts
    

    所以呢 Charts.Add 返回一个图表,它必须是 ActiveChart Selection Source 在里面 SetSourceData Range . 让我们试试这个:

    Sub Macro1()
        With Charts.Add
            .ChartType = xlColumnStacked
            .SetSourceData Source:=Selection, PlotBy:=xlRows
            .Location Where:=xlLocationAsObject, Name:="Sheet1"
        End With
    End Sub
    

    在我的机器上不行-我想 选择

    Sub CreateStackedColumnChartFromSelection()
    Dim src As Range
        Set src = Selection
        With Charts.Add
            .ChartType = xlColumnStacked
            .SetSourceData Source:=src, PlotBy:=xlRows
            .Location Where:=xlLocationAsObject, Name:="Sheet1"
        End With
    End Sub
    

    从那里,您应该可以找到各种自定义设置(记住对象浏览器!)得到你想要的图表(请记住,根据Excel版本的不同,可能有一些小功能无法通过VBA访问。)

        2
  •  2
  •   James    14 年前

    要创建堆叠柱效果,需要为柱中的每个细分创建一个系列。例如,假设我们有4个动物园。假设他们位于迈阿密、亚特兰大、纽约和拉斯维加斯。此外,我们还有4种动物,狮子,老虎,熊和海豹。我们需要一个堆积的列,显示每只动物的数量,还有动物的总数。

    ActiveChart.ChartType = xl3DColumnStacked
    

    然后我们会为每只动物创建一个系列。

    ActiveChart.SeriesCollection.NewSeries
    

    ActiveChart.SeriesCollection(1).Values = lionCounts
    ActiveChart.SeriesCollection(1).XValues = cityNames
    

    这应该是所有需要创建一个堆叠的列使用值直接从您的程序,而不是单元格引用。

        3
  •  0
  •   Mihai Chelaru klin    6 年前

    手动录制宏时,ChartType提供了两种可能性;一个按行打印,另一个按列打印。如果稍后被其他进程更改,则宏不知道如何将其切换回。

    ActiveChart.SetSourceData 值,例如。

    ActiveChart.SetSourceData Range("A1:B2"), xlRows

    ActiveChart.SetSourceData Range("A1:B2"), xlColumns