开始这样的任务最简单的方法是手动执行任务,使用宏录制器捕捉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访问。
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