我正在尝试在VBA中创建一个堆叠的柱形图,其中有一个条形图,每个条形图都显示了该图上子类别的细分(请参见图片的右侧)。对于普通的条形图,我要做的就是创建一个新系列并设置Values和XValues属性。我不确定如何告诉它有关子类别的值。
(来源:msecnd.net)
最佳答案
启动此类任务的最简单方法是使用Macro Recorder捕获等效的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
返回一个图表,该图表必须是在其余代码中重复引用的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访问。)