我正在尝试在 VBA 中创建一个堆积柱形图,其中有一个条形图,每个条形图显示图表上子类别的细分(参见图片右侧)。对于普通条形图,我所要做的就是创建一个新系列并设置 Values 和 XValues 属性。我不确定如何告诉它子类别的值。
(来源:msecnd.net)
我正在尝试在 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
inSetSourceData
应该是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 属性设置为城市名称的数组。因此,如果第一个系列是针对 Lions 的,则使用 Miami、Atlanta、NY、Las Vegas 的狮子数和包含字符串“Miami”、“Atlanta”等的数组创建一个数组。 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