如何在MS Excel 2016中创建双数据集stacked column chart(支持VBA)
在Excel 2016中创建双数据集簇状堆叠柱形图
嘿,很高兴帮你搞定这个需求!我之前也处理过类似的Excel图表问题,完全可以实现你想要的效果——横轴显示年份,每个年份下两个并排的堆叠柱(分别对应两个国家的月度数据),不用VBA手动就能做,要是需要自动化的话VBA也能轻松搞定。
方法一:手动操作(无需VBA)
1. 调整数据布局
Excel的簇状堆叠柱形图对数据格式有明确要求,你需要把两个国家的月度数据整理成同一行对应同一年份的结构。比如:
| 年份 | 国家A_1月 | 国家A_2月 | ... | 国家A_12月 | 国家B_1月 | 国家B_2月 | ... | 国家B_12月 |
|---|---|---|---|---|---|---|---|---|
| 2020 | 100 | 150 | ... | 200 | 120 | 180 | ... | 220 |
| 2021 | 110 | 160 | ... | 210 | 130 | 190 | ... | 230 |
如果你的原始数据是分开的两个表格(一个国家一个表),直接复制粘贴合并成上面的结构就行;如果是长格式数据(比如每行是「年份-国家-月份-数值」),可以用数据透视表快速整理:
- 选中所有数据,插入数据透视表
- 行区域放「年份」,列区域先放「国家」再放「月份」,值区域放「数值」
- 透视表生成后,就是我们需要的标准结构啦
2. 创建簇状堆叠柱形图
- 选中整理好的数据区域(包括表头)
- 点击「插入」选项卡 → 柱形图 → 选择簇状堆叠柱形图(就是那种既有簇状并排又有堆叠效果的图标)
3. 优化图表格式
- 统一色系:选中国家A的所有月度系列(按住Ctrl点选),设置成同一系列的配色(比如深浅不同的蓝色);同理给国家B设置另一套色系(比如橙色系),这样一眼就能区分两个国家
- 调整标签:添加数据标签(右键系列 → 添加数据标签),如果堆叠的标签太多,可以只显示每个堆叠柱的总和,或者调整标签位置避免重叠
- 美化细节:修改横轴、纵轴标题,调整柱形间距,去掉多余的网格线等
方法二:VBA自动化(适合频繁更新数据的场景)
如果你的数据需要经常更新,每次手动调整太麻烦,可以用VBA一键生成图表。下面是一段示例代码,你可以根据自己的实际数据范围修改:
Sub CreateDualStackedColumnChart() Dim ws As Worksheet Dim chartObj As ChartObject Dim dataRange As Range ' 设置工作表(改成你的工作表名称) Set ws = ThisWorkbook.Worksheets("数据") ' 设置数据范围(改成你的实际数据区域,包括表头) Set dataRange = ws.Range("A1:Y3") ' 假设A列是年份,B-M列是国家A的12个月,N-Y列是国家B的12个月 ' 删除已有同名图表(避免重复) On Error Resume Next ws.ChartObjects("双国家堆叠柱形图").Delete On Error GoTo 0 ' 创建新图表 Set chartObj = ws.ChartObjects.Add(Left:=100, Width:=800, Top:=100, Height:=500) chartObj.Name = "双国家堆叠柱形图" ' 设置图表类型和数据源 With chartObj.Chart .ChartType = xlColumnStackedClustered ' 簇状堆叠柱形图类型 .SetSourceData Source:=dataRange .HasTitle = True .ChartTitle.Text = "两国年度月度数据堆叠对比" ' 设置横轴标题 .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Text = "年份" ' 设置纵轴标题 .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Text = "数值" ' 统一国家A的系列配色(蓝色系渐变) Dim i As Integer For i = 1 To 12 .SeriesCollection(i).Format.Fill.ForeColor.RGB = RGB(50 + i*10, 100 + i*10, 200) Next i ' 统一国家B的系列配色(橙色系渐变) For i = 13 To 24 .SeriesCollection(i).Format.Fill.ForeColor.RGB = RGB(200, 100 + (i-12)*10, 50) Next i End With End Sub
使用方法:
- 按Alt+F11打开VBA编辑器
- 插入模块,把代码粘贴进去
- 修改
ws和dataRange的参数,匹配你的数据位置 - 运行宏,就能自动生成符合要求的图表啦
这样生成的效果就和你提到的示例完全一致,每个年份下两个并排的堆叠柱,既能展示每个国家的月度数据细分,也能直观对比两国的年度总和~
内容的提问来源于stack exchange,提问作者Ema




