如何通过Excel VBA编程纯粹创建一个堆积柱状图?

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

这不是我在Excel中做过的事情,但从我的经验来看,任何可以手动完成的任务都可以使用VBA完成。逐步分解您需要完成的任务,然后查阅API并找出如何实现它。http://msdn.microsoft.com/en-us/library/aa213725(office.11).aspx - buckbova
3个回答

4

开始这样的任务最简单的方法是手动执行任务,使用宏录制器捕捉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”并查看类列表中的Charts,缩小一下上下文范围。在“成员...”列表中选择Add 将在下面的窗格中显示:

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

所以Charts.Add返回一个图表,必须是代码其余部分反复引用的ActiveChart。这种重复是繁琐的(并且可能影响性能),因此我会稍微重新设计一下。为了练习的目的,假设我们在运行宏之前将目标数据选择好,因此运行宏时它将在Selection中。在对象浏览器中查看Chart的成员,可以看出SetSourceData中的Source应该是一个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访问。


2
为���创建堆叠柱形效果,您需要为每个列中的子分区创建一个系列。例如,假设我们有4个动物园,它们位于迈阿密、亚特兰大、纽约和拉斯维加斯。此外,我们有4种动物:狮子、老虎、熊和海豹。我们想要一个堆叠柱形图,显示每种动物的数量以及动物的总数。
首先,将图表类型设置为xl3DColumnStacked,如下所示。
ActiveChart.ChartType = xl3DColumnStacked

我们将为每种动物创建一个系列。
ActiveChart.SeriesCollection.NewSeries

然后将Values属性设置为动物值的数组,XValues属性设置为城市名称的数组。例如,如果第一个系列是关于狮子的,则创建一个包含在迈阿密、亚特兰大、纽约、拉斯维加斯的狮子数量的数组和包含字符串“迈阿密”、“亚特兰大”等的数组。cityNames数组将被每个系列重复使用,但lionCounts将显然每次都用适当的数组替换。即tigerCounts、bearCounts等。

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

那么,只需使用程序中的值而不是单元格引用,即可创建堆积柱形图。

0

在手动记录宏时,ChartType 有两种可能性;一种按行绘制,另一种按列绘制。如果稍后通过其他进程更改了此设置,则宏不知道如何将其切换回来。

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

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

或者

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接