ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: 悠悠的炊烟

[Excel 图表] [第102期]堆积柱形和柱形混搭图[已总结]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-24 10:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA一键制图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-25 08:34 | 显示全部楼层
答题截止日期已到,请楼上各位不要再编辑帖子,以免影响评分。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-25 21:29 | 显示全部楼层
总结

一、        我的构思
1.         无论采用VBA法还是函数法,首先都需要构建一个做图辅助数据区,这是做图的关键;
1.1        堆积柱形图,柱子间距为0。列方向做堆积柱形图,除“季度”外一列为一个图表数据系列。此外,“损益”的数据标签需要用一个数据系列来占位;
1.2        每一个季度的空距用一个空行占位,每一个季度分别由水果柱子、蔬菜柱子、损益柱子、空距组成,需要四行;
1.2.1        第1个柱子为“水果”,应保持本季度的所有水果品种虽在不同的列但却在同一个行上,且在本四行中的第1行。这样才能实现堆积,且为第1个柱子;
1.2.2        第2个柱子为“蔬菜”,应保持本季度的所有蔬菜品种虽在不同的列但却在同一个行上,且在本四行中的第2行。这样才能实现堆积,且为第2个柱子;
1.2.3        “损益”的数据标签需要一个数据系列来占位,它左临损益,基本就是损益的复制,只是符号正好相反。它的填充色:无;数字标签:红色;
“损益”及“损益”的数据标签为第3个柱子,在本四行中的第3行,为第3个柱子;
1.2.4        分类数据(季度)在本四行中的第2行,尽量居中;

小结:


2.         根据做图辅助数据区做图
VBA法:
此题用VBA法应该更合适,特别在构建做图数据源方面,其它做图的很多语句可以通过录制宏得到。边学边做,也是很有乐趣的。
函数法:
本以为用函数构建做图数据源对函数高手来说不难,只要他们了解到底要构建什么样的数据源才能得到题目要求的图形,后来发现这题用函数做还真有点纠结。其它的图表修饰就是最基本的东西。

二、        我的做法
1.        VBA法:详见文件“堆积柱形图和柱形图混搭”的工作表“题目”;
2.        函数法:另见附件
函数法在满足“损益”数据标签要求的情况下,图例会存在一些小瑕疵,某些没有数据的图例依然会显示。至少目前我还没找到解决方案,题目未对图例有要求,就忽略这个瑕疵吧。

三、        其它
本题在掌握图表基础知识的基础上,通过VBA或函数构建做图数据源,从而达到题目要求的效果,算是跨领域协作吧。
此题本是V白的我学习V和图表结合的一个忽发奇想,苦于鲜见V和图表结合的案例,斗胆抛砖引玉,希望借此偷得大V们的一鳞半爪。

总结一下大家的做法:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-26 21:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢楼主的点评,题目中没有要求数据源不能排序。不过我也学到了堆积图中同一柱子堆积的数据放在同一行上就行,不一定要逐列地挨在一起,涨姿势了,再致谢意。

TA的精华主题

TA的得分主题

发表于 2014-3-27 13:12 | 显示全部楼层
本帖最后由 sunya_0529 于 2014-3-28 09:27 编辑
sunya_0529 发表于 2014-3-26 21:24
谢谢楼主的点评,题目中没有要求数据源不能排序。不过我也学到了堆积图中同一柱子堆积的数据放在同一行上就 ...

重新整理了一下代码,加上了新学的一些知识,留个纪念。

  1. Private Sub CommandButton2_Click() '一键制图
  2. '生成图表
  3. Dim w As Shape, x As Chart, arr(15), k As Range, i%, j%, h%
  4. For Each w In ActiveSheet.Shapes '删除已有图表
  5.   If w.Type = msoChart Then w.Delete
  6. Next
  7. Set x = ActiveSheet.Shapes.AddChart.Chart '新建图表
  8. With x
  9.   .ChartType = xlColumnStacked '设置图表类型为堆积柱形图
  10.   .SetSourceData Source:=[A4] '设置图表数据源

  11.   '设置水平(分类)轴标签
  12.   .SeriesCollection(1).XValues = Array("", "Q1", "", "", "", "Q2", "", "", "", "Q3", "", "", "", "Q4", "", "")
  13.   .Axes(xlCategory).MajorTickMark = xlNone '无横坐标刻度线
  14.   .Axes(xlCategory).TickLabelPosition = xlLow '横坐标标签位置置底

  15.   For Each k In [B4:K4] '循环添加数据系列
  16.     If Len(k.Value) > 0 Then
  17.       i = i + 1
  18.       If i > 1 Then .SeriesCollection.NewSeries
  19.       .SeriesCollection(i).Name = k.Value '添加数据系列名称
  20.       Erase arr '重新初始化数组
  21.       Select Case Application.IfError(Application.VLookup(k.Value, [A13:B21], 2, 0), "")
  22.         Case "水果"
  23.           h = 0
  24.         Case "蔬菜"
  25.           h = 1
  26.         Case Else
  27.           h = 2
  28.       End Select
  29.       arr(h) = k.Offset(1, 0)
  30.       arr(h + 4) = k.Offset(2, 0)
  31.       arr(h + 8) = k.Offset(3, 0)
  32.       arr(h + 12) = k.Offset(4, 0)
  33.       .SeriesCollection(i).Values = arr '添加数据系列值
  34.     End If
  35.   Next
  36.   For j = 0 To UBound(arr) '添加辅助数据列
  37.     If Len(arr(j)) > 0 Then arr(j) = arr(j) * -1
  38.   Next
  39.   .SeriesCollection.NewSeries
  40.   .SeriesCollection(i + 1).Values = arr

  41.   .ChartGroups(1).GapWidth = 0 '列簇间距为0
  42.   .Legend.Position = xlLegendPositionTop '图例项置顶显示
  43.   .Legend.LegendEntries(i + 1).Delete '删除辅助列图例
  44.   .SeriesCollection(i + 1).ApplyDataLabels '设置辅助列数据标签
  45.   .SeriesCollection(i + 1).DataLabels.Position = xlLabelPositionInsideBase '辅助列数据标签位置为“轴内侧”
  46.   .SeriesCollection(i + 1).DataLabels.NumberFormatLocal = "[红色]-0;0;;" '辅助列数据标签颜色
  47.   .SeriesCollection(i + 1).Format.Fill.Visible = msoFalse '辅助列数据系列填充色为无
  48.   .Axes(xlValue).MajorTickMark = xlNone '无主纵坐标轴刻度线
  49.   .Axes(xlValue).TickLabelPosition = xlTickLabelPositionHigh '主纵坐标轴标签显示在右侧
  50.   .Axes(xlValue).Format.Line.Visible = msoFalse '无主纵坐标轴线
  51. End With
  52. Set x = Nothing
  53. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-4-22 11:32 | 显示全部楼层
悠悠的炊烟 发表于 2014-3-25 21:29
总结

一、        我的构思

请教,是不是对于函数的方法,图例那里,无法实现无数据的就不显示?
也就是,当减少几组纵向的数据时候,图例那里会出现,只有图例的小标志,而没有旁边的文字描述。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-22 22:28 | 显示全部楼层
cleverzhzhf 发表于 2014-4-22 11:32
请教,是不是对于函数的方法,图例那里,无法实现无数据的就不显示?
也就是,当减少几组纵向的数据时候 ...

对于这题来说是这个样子的,至少目前我还没找到解决方案。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 23:19 , Processed in 0.053308 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表