我正在尝试在VBA中创建一个堆叠的柱形图,其中有一个条形图,每个条形图都显示了该图上子类别的细分(请参见图片的右侧)。对于普通的条形图,我要做的就是创建一个新系列并设置Values和XValues属性。我不确定如何告诉它有关子类别的值。

excel - 如何仅通过使用excel vba编程来创建堆积的柱形图?-LMLPHP
(来源: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访问。)

10-01 03:39
查看更多