【问题标题】:Creating a Stacked Column graph创建堆积柱形图
【发布时间】:2015-09-09 20:31:43
【问题描述】:

所以我看到了一些关于这个主题的帖子,但似乎无法找到让它发挥作用的方法。我的目标是使用具有以下特征的 VBA 创建堆积柱形图:

  1. 每一列都基于一行中的数据(例如E6:P6E7:P7 等)。
  2. 每个“堆栈部分”是该行中的每一列(位于E4:P4
  3. X 轴标签位于 A 列中(例如 A6A7 等)
  4. Y 轴标签动态基于数据(非特定)。
  5. 图表标题(这是最简单的部分 - 我知道了)。

当然,我还需要显示项目 2 使用的颜色键的图例。

此图表是我通过 VBA 从原始数据文件生成的 30 多个报告中每个报告所需的三个之一。报告的最后一步是制作这些图表。 我能够创建堆叠图,但最大的问题是,正如上面的数据范围所示,数据中存在差距。这会导致图表中的分割部分以及我不想要的其他标签。本质上,我不知道如何格式化图表,并阅读从键入“ActiveChart”弹出的对象窗口。只让我走到这一步。如果我知道各种格式化命令(唉,我是 VBA 和 Excel 的新手),我可以在我需要的所有图表中复制它。

Dim data As Range
Set data = Range("A4:P12")
With Charts.Add
     .ChartType = xlColumnStacked
     .SetSourceData Source:=data, PlotBy:=xlColumns
     .HasTitle = True
     .ChartTitle.Text = "Weekly Report"
     .Location Where:=xlLocationAsObject, Name:="Sheet1"
End With

我可以做的例子: Output Graph

关于空白数据的附注:最左边的空白点是空列 D。我还需要能够编辑轴标签。

【问题讨论】:

  • 宏记录器通常是找出这些 API 的好工具。
  • 这看起来像:“我希望有人为我开发解决方案”之类的问题,除非它们非常简单(即明显的运行时错误等),否则这里通常不赞成。考虑提供您的 VBA 代码尝试,并指出您遇到的特定问题,而不仅仅是“告诉我如何做全面的解决方案”。干杯。
  • @DavidZemens 对不起,我认为它需要的代码量很少,不值得一看我失败的东西。我现在就贴出来。

标签: macos vba excel


【解决方案1】:

这样的事情怎么样:

Public Sub MakeGraph()
    Dim ws As Excel.Worksheet
    Dim data As Excel.Range
    Dim x_axis_labels As Excel.Range
    Dim series_names As Excel.Range
    Dim sh As Excel.Shape
    Dim ch As Excel.Chart
    Dim I As Long

    Set ws = Sheet1
    Set data = ws.Range("E4:P12")   ' Assumes the data are in E4:P12
    Set x_axis_labels = ws.Range("A4:A12")  ' Assumes the labels are in A4:A12
    Set series_names = ws.Range("E2:P2")  ' Assumes the labels are in E2:P2
    Set sh = ws.Shapes.AddChart
    Set ch = sh.Chart
    With ch
         .ChartType = xlColumnStacked
         .SetSourceData Source:=data, PlotBy:=xlColumns
         .HasTitle = True
         .ChartTitle.Text = "Weekly Report"
         .Axes(xlCategory, xlPrimary).CategoryNames = x_axis_labels

         ' Add series names
         For I = 1 To .SeriesCollection.Count
            .SeriesCollection(I).Name = series_names.Cells(1, I)
         Next I
    End With

    Set ch = Nothing
    Set sh = Nothing
    Set series_names = Nothing
    Set x_axis_labels = Nothing
    Set data = Nothing
    Set ws = Nothing
End Sub

希望有帮助

【讨论】:

  • 太棒了,它回答了我所有的基本问题,并且我能够将范围操纵到我的数据所在的位置。我当时失败的主要事情是轴名称,因为我可以让系列集合工作,但无法获取所有数据并且仍然可以在不搞砸的情况下获得轴。但是,我确实对解决方案有几个问题,所以我理解它的未来。为什么要使用 Shape/Chart 对象而不仅仅是 Add.Chart,它们有什么好处?为什么最后将所有内容都设置为Nothing?是否有一个属性可以修改 Series 或 Columns 本身的顺序?
  • @S.大炮。 Re Shape/Chart vs Add.Chart:无论哪种方式都可以正常工作 --- 这主要是风格问题。 将对象重新设置为空:VBA 应该自动执行此操作,但几年前我有一个 VBA 项目,其中包含许多表现出异常行为的对象。当我清理我的物品时,事情就稳定下来了,所以从那以后我一直在这样做(可能过于谨慎)。
  • @S.大炮。 Re Series Order:至少有 3 种方法可以做到这一点。 1. 使用 Series.PlotOrder 属性对系列重新排序。 2. 而不是 .SetSourceData 一次添加所有系列,您可以使用 SeriesCollection.Add 并按您喜欢的顺序一次添加一个系列。 3.您可以在制作图表之前对数据进行排序。也可以重新排序 Legend 中的项目,但我从未尝试过。
  • 我查找了 SeriesCollection.Add 的 API,我可以看到它是如何完成的!感谢所有的帮助。
  • 所以我遇到了一个问题。某些数据列是空的(正确为空)。然而,虽然图表正确地绘制了该范围内数据的所有值,但它却错误地分配了它们。例如,Say E4-P4 是系列名称。 E6-P6 是一组数据。 E6 为空。它在 F6-P6 中正确绘制值,但仅使用前 11 个标签 (E4:O4),而不是正确的标签 (F4:P4),基本上它将空标题 E4 分配给具有数据的第一列,然后从那里。我尝试使用 .DisplayBlanksAs = xlNotPlotted,但这不起作用。有什么想法吗?
【解决方案2】:

我认为您丢失的数据将是 E6:P14 范围内的一列? (我使用的是 E6:P14,因为这就是你首先说的。你的代码和 @xidgel 之后说的 E4:P12。)

试试这个:

Sub MakeChart()
  Dim rCats As Range
  Dim rNames As Range
  Dim rData As Range
  Dim iCol As Long

  Set rCats = ActiveSheet.Range("A6:A14")
  Set rNames = ActiveSheet.Range("E4:P4")
  Set rData = ActiveSheet.Range("E6:P14")

  With ActiveSheet.Shapes.AddChart(xlColumnStacked).Chart
    Do Until .SeriesCollection.Count = 0
      .SeriesCollection(1).Delete
    Loop

    For iCol = 1 To rData.Columns.Count
      If WorksheetFunction.Count(rData.Columns(iCol)) > 0 Then
        ' it's not blank
        With .SeriesCollection.NewSeries
          .Values = rData.Columns(iCol)
          .XValues = rCats
          .Name = "=" & rNames.Cells(1, iCol).Address(, , , True)
        End With
      End If
    Next
  End With
End Sub

【讨论】:

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