如何通过使用excel vba进行编程来创建堆积柱形图?

时间:2010-07-09 04:10:03

标签: excel vba charts bar-chart

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

alt text http://officeimg.vo.msecnd.net/en-us/files/627/780/ZA010220411.gif

3 个答案:

答案 0 :(得分:2)

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

例如,我刚录制了这个(在Excel XP中,但后来的版本应该类似)。代码完全按照记录:

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不需要,因为它会再次向下重复。

现在要清理一下。对象浏览器在这里非常有用。如果您不熟悉,请尝试在VBA编辑器中点击F2。通过在上部下拉列表中选择“Excel”并查看“类”列表中的“图表”来缩小上下文。在“Members ...”列表中选择Add会在下方窗格中显示:

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

所以Charts.Add返回一个Chart,它必须是在代码的其余部分重复引用的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

它在我的机器上不起作用 - 我认为Selection可能会在激活图表时发生变化。所以我们应该在开始使用图表之前捕获范围:

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访问的次要功能。)

答案 1 :(得分:2)

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

首先,将图表类型设置为xl3DColumnStacked,如下所示。

ActiveChart.ChartType = xl3DColumnStacked

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

ActiveChart.SeriesCollection.NewSeries

然后将Values属性设置为animal的值数组,将XValues属性设置为city的名称数组。因此,如果第一个系列是针对狮子会的,那么在迈阿密,亚特兰大,纽约,拉斯维加斯和一个包含字符串“迈阿密”,“亚特兰大”等的数组中使用#狮子阵列制作一个数组。这个cityNames数组将被重用于每个系列,但lionCounts显然会每次用适当的数组替换。即tigerCounts,bearCounts等。

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

这应该是直接使用程序中的值而不是单元格引用来创建堆叠列的全部内容。

答案 2 :(得分:0)

手动记录宏时,ChartType提供两种可能性;一个按行绘制,另一个按列绘制。如果稍后通过其他一些过程更改了此设置,则宏不知道将其切换回原来的状态。

为确保每次都能正确显示,请指定ActiveChart.SetSourceData值,例如

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

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