使用Word表格数据快速创建图表
创作时间:
作者:
@小白创作中心
使用Word表格数据快速创建图表
引用
CSDN
1.
https://blog.csdn.net/taller_2000/article/details/139106326
在Word中创建图表时,如果表格数据包含合并单元格,直接插入图表可能会遇到困难。本文将通过VBA代码示例,详细介绍如何将Word表格数据转换为适合创建图表的格式,并最终生成柱状图。
实例需求
Word的表格如下所示,标题行有合并单元格。
现在需要根据上述表格数据,在Word中创建如下柱图。如果数据在Excel之中,那么创建这个图并不复杂,但是Word中就没用那么简单了,虽然Word中可以插入图表,但是其数据源仍然是来自于Excel。
示例代码
Sub CreateWordChart3()
Dim oChart As Chart, oTable As Table
Dim oSheet As Object ' Excel.Worksheet
Const START_CELL = "AA1"
Application.ScreenUpdating = False
Set oTable = ActiveDocument.Tables(1) ' modify as needed
Set oChart = ActiveDocument.Shapes.AddChart.Chart
Set oSheet = oChart.ChartData.Workbook.Worksheets(1)
oTable.Range.Copy
oSheet.Range(START_CELL).Select
oSheet.Paste
Call Create2DTable(oSheet, oSheet.Range(START_CELL))
oChart.ChartData.Workbook.Close
Application.ScreenUpdating = True
End Sub
代码解析
- 第4行代码指定辅助数据区域的起始单元格(下文中简称为锚点单元格)。
- 第5行代码禁止屏幕更新。
- 第6行代码获取活动文档中的第一个表格对象。
- 第7行代码在文档中添加一个Chart对象。
- 第8行代码获取Chart对象的Worksheet对象(即图表数据源所在工作表)。
- 第9行代码拷贝表格区域。
- 第10行代码选中锚点单元格。
- 第11行代码粘贴数据,实现将Word表格数据导入到Excel工作表中。
- 第12行代码调用
Create2DTable过程转换数据。 - 第13行代码关闭Chart对象的源数据工作簿。
- 第14行代码恢复屏幕更新。
数据转换函数
Sub Create2DTable(ByRef tmpSheet As Object, startCell As Object)
Dim oDicCat As Object, oDicSt As Object, sKey, vKey
Dim rCell As Object
Dim rC As Object
Dim i As Long, j As Long
Set oDicCat = CreateObject("scripting.dictionary")
Set oDicSt = CreateObject("scripting.dictionary")
With startCell.CurrentRegion
For Each rCell In .Rows(2).Cells
If Len(rCell) > 0 Then
oDicCat(rCell.Value) = ""
End If
Next
For Each rCell In .Rows(1).Cells
sKey = rCell
If Len(sKey) > 0 Then
If Not oDicSt.Exists(sKey) Then
Set oDicSt(sKey) = CreateObject("scripting.dictionary")
For Each vKey In oDicCat
oDicSt(sKey)(vKey) = ""
Next
End If
For Each rC In rCell.Offset(1).Resize(1, rCell.MergeArea.Count)
oDicSt(sKey)(rC.Value) = rC.Offset(1).Value
Next
End If
Next
End With
Dim xlTab As Object
Set xlTab = tmpSheet.ListObjects("Table1")
xlTab.DataBodyRange.Delete
Dim RowCnt As Long, ColCnt As Long
RowCnt = oDicSt.Count
ColCnt = oDicCat.Count
xlTab.Resize tmpSheet.Range("A1").Resize(RowCnt + 1, ColCnt + 1)
With xlTab.Range
.Cells(1, 1) = "REQ"
For i = 1 To ColCnt
.Cells(1, i + 1) = oDicCat.keys()(i - 1)
Next
For j = 1 To RowCnt
sKey = oDicSt.keys()(j - 1)
.Cells(j + 1, 1) = sKey
For i = 1 To ColCnt
.Cells(j + 1, i + 1) = oDicSt(sKey)(.Cells(1, i + 1).Text)
Next
Next
End With
startCell.CurrentRegion.Clear
End Sub
代码解析
- 第6~7行代码创建两个字典对象。
- 第8行代码获取辅助表格的单元格区域。
- 第9~13行代码循环遍历表格中第二行单元格,将排重的“类别”列表保存在字典对象
oDicCat中。 - 第10行代码判断类别不为空,并且不等于行标题。
- 第14~27行代码循环遍历第一行单元格。
- 第15行代码获取单元格内容。
- 第16行代码判断单元格是否为空,即“评估状态”。
- 第17行代码判断“评估状态”是否存在于字典对象
oDicRes中。 - 第18行代码以
sKey为键,创建嵌套字典对象。 - 第19~20行代码为新建的字典对象增加“类别”,这样可以将数据表转换为规范的2D表格,即每个“评估状态”都包含3个类别,这样数据便于创建图表。
- 第23~25行代码读取第3行单元格数据,保存到对应的嵌套字典对象之中。
- 第30行代码获取工作表中的表格对象(ListObject)。
- 第31行代码清空表格数据区域。
- 第33~34行代码获取获取类别和“评估状态”的个数,这决定了数据表格的维度(行数和列数)。
- 第35行代码重设表格区域。
- 第37行代码写入数据。
- 第38~40行代码循环读取
oDicCat中内容,写入表格标题行(类别)。 - 第41~47行代码写入表格数据。
- 第42~43行代码写入第一列“评估状态”。
- 第44~46行代码写入评估统计数据。
- 第49行代码清空辅助单元格区域。
运行示例代码,最终效果如下图所示。
热门推荐
白色洋桔梗花语:纯洁与纯爱的象征
数学中的极值
医生解读:女人长期吃猪鞭的营养价值与功效
C++为什么要引入智能指针?
花甲的选购方法
认识中药:黄芪被称为千年补气圣品,它有哪些现代养生密码?
石橄榄炖鸡汤的做法(健康营养的家常美食)
Git代码提交规范详解:feat、fix、chore等常见前缀的含义
外科手术安全大揭秘:禁食禁饮,你真的了解它的重要性吗?
除湿机抽湿后怎么办?这份处理和保养指南请收好
鸡吃草的那些营养会比吸收长肉
旅游不是说到处瞎跑,给你推荐这三个地方!体验感不好你打我。
防盗门有风就响怎么办?专家教你解决之道
防盗门合页调整与修复技巧
全球市场如何影响本地金价?这种影响如何进行市场了解?
创业者选择注册地址的四大注意事项
如何办理公积金相关事务并了解其使用规则?
热食保温瓶和保温饭盒使用及选购全攻略
如何在房产市场中明确目标?这个目标怎样影响购买行为?
给“扮演蒋介石”的10位演员排座次:王劲松第9,陈道明第8
自学新媒体运营,从入门到精通的完整指南
薄荷脑:从提取到应用的全面解析
投资白银需要关注哪些全球经济因素
如何分析市场现状及其影响因素
洋桔梗、桔梗、玫瑰的区别,洋桔梗怎么养?
洋桔梗花语及种植方法详解(洋桔梗的品种特点与养护技巧)
热刺与水晶宫的对决,英超联赛中的战术较量与球员表现
年满16岁如何脱离父母监护
集体下跌!“关税风暴”冲击将至,美国“滞胀”阴云笼罩
节后市场回暖 深圳楼市“小阳春”渐行渐近