【问题标题】:How do I create a stacked column chart purely through programming with excel vba?如何纯粹通过使用excel vba编程来创建堆积柱形图?
【发布时间】:2010-07-09 04:10:03
【问题描述】:

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


(来源:msecnd.net

【问题讨论】:

标签: excel vba charts bar-chart


【解决方案1】:

启动此类任务的最简单方法是查看手动执行任务时会发生什么,使用宏记录器捕获 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”来稍微缩小上下文范围,然后查看 Classes 列表中的 Charts。在“成员...”列表中选择 Add 会在下方窗格中显示:

Function Add([Before], [After], [Count]) As Chart
    Member of Excel.Charts

所以Charts.Add 返回一个图表,它必须是在其余代码中重复引用的ActiveChart。像这样的重复很乏味(并且可能会影响性能),所以我会重新工作一点。假设为了练习,我们将在运行宏之前选择我们的目标数据,所以当宏运行时它将位于Selection。在对象浏览器中查看图表的成员,很明显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 访问。)

【讨论】:

    【解决方案2】:

    要创建堆叠列效果,您需要为列中的每个细分创建一个系列。例如,假设我们有 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
    

    这应该就是使用直接来自程序的值而不是单元格引用来创建堆叠列所需要的全部内容。

    【讨论】:

      【解决方案3】:

      手动录制宏时,为 ChartType 提供了两种可能性;一个按行绘制,另一个按列绘制。如果稍后其他进程对此进行了更改,则宏不知道将其切换回来。

      为确保每次都能正确显示,请指定 ActiveChart.SetSourceData 值,例如

      ActiveChart.SetSourceData Range("A1:B2"), xlRows

      ActiveChart.SetSourceData Range("A1:B2"), xlColumns

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多