使用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行代码清空辅助单元格区域。
运行示例代码,最终效果如下图所示。
热门推荐
厘米级精度,无限可能:RTK技术的行业应用与前景
赵九章:中国现代气象学和卫星事业的奠基人
图像以何叙事?
视频:2024 年国际秃鹫日。
从传统剧场到网络热搜——中国舞剧:佳作频现 未来可期
电脑Fn键有什么作用?如何开启Fn键?
全国十大律师事务所前十榜单
老年人频发流鼻血,有哪些保健康方法?
数据库如何查询具体年份
原神5.5版本新角色瓦蕾莎和伊安珊的五种配队攻略
龙息神寂狂野流全攻略:0氪到氪佬阵容搭配与实战技巧
海底管道内腐蚀管控策略:从感知到执行的系统化解决方案
并购关联资产“输血”,宜宾纸业能否解困
人工智能—无人驾驶汽车工作原理及关键技术
无人车搭载无人机技术详解
红雀珊瑚养殖详解:从选购到日常护理的全方位指南
日本奇葩陋习:曾盛行的“夜爬”习俗
冀东水泥源头控碳:优化产能结构,厚植产业绿色底色
娄底市文物古迹介绍
娄底旅游景点排行榜(娄底旅游必去十大景点)
《难哄》的热播让章若楠在现偶赛道上又领先了多少米?
典型新能源汽车热管理系统方案分析
吸塑工艺 vs 注塑工艺,不清楚的看这里!
如何设计提成系统以激励员工提高业绩?
微软 Win11 24H2 二月更新惹祸:性能下降、驱动不兼容等
高蛋白饮食指南:增肌减脂
高中数学成绩太差怎么办?这份逆袭指南请收好
《九章·思美人》的主要意象是什么?表达了什么感情?
如何理解 ETF 的市场波动特征和投资策略调整?波动特征对投资策略调整有何启示?
盘点高校分布最广的十大专业:从课程到就业前景全解析