我正在尝试在 VBA 中创建一个堆积柱形图,其中有一个条形图,每个条形图显示图表上子类别的细分(参见图片右侧)。 对于普通条形图,我所要做的就是创建一个新系列并设置 Values 和 XValues 属性。 我不知道如何告诉它子类别的值。
(来源:msecnd.net)
启动此类任务的最简单方法是查看手动执行任务时会发生什么,使用宏记录器捕获 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”稍微缩小上下文范围,然后查看“类”列表中的“图表”。在“成员...”列表中选择
Add
会在下部窗格中显示以下内容:
Function Add([Before], [After], [Count]) As Chart
Member of Excel.Charts
因此
Charts.Add
返回一个图表,它必须是代码其余部分中重复引用的 ActiveChart
。像这样的重复很乏味(并且可能会影响性能),所以我会稍微修改一下。为了便于练习,我们假设我们将在运行宏之前选择目标数据,因此当宏运行时它将位于 Selection
中。在对象浏览器中查看 Chart 的成员,很明显 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 访问。)
要创建堆积柱效果,您需要为柱中的每个细分创建一个系列。 例如,假设我们有 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
这应该是使用直接来自程序的值而不是单元格引用创建堆积列所需的全部操作。
手动录制宏时,ChartType 提供两种可能性;一个按行绘制,另一个按列绘制。 如果稍后被其他进程更改,宏不知道将其切换回来。
为了确保每次都能正确显示,请指定
ActiveChart.SetSourceData
值,例如
ActiveChart.SetSourceData Range("A1:B2"), xlRows
或
ActiveChart.SetSourceData Range("A1:B2"), xlColumns
以下更改对我有用
ActiveChart.SetSourceData Range("A1:B2"), xlRows