使用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
        ' get the unique CatX list
        For Each rCell In .Rows(2).Cells
            If Len(rCell) > 0 Then
                oDicCat(rCell.Value) = ""
            End If
        Next
        ' loop through table
        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
                ' store values with nested Dict
                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 ' Excel.ListObject
    Set xlTab = tmpSheet.ListObjects("Table1")
    xlTab.DataBodyRange.Delete
    ' get the size of output table
    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
        ' populate output
        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行代码清空辅助单元格区域。


运行示例代码,最终效果如下图所示。

在这里插入图片描述

相关推荐

  1. word表格图片批处理参考程序

    2024-05-25 18:25:12       56 阅读
  2. 使用aspose.Words更新表格列宽

    2024-05-25 18:25:12       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-25 18:25:12       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-25 18:25:12       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-25 18:25:12       82 阅读
  4. Python语言-面向对象

    2024-05-25 18:25:12       91 阅读

热门阅读

  1. 设计模式--策略模式

    2024-05-25 18:25:12       32 阅读
  2. React hooks - useRef

    2024-05-25 18:25:12       34 阅读
  3. MybatisPlus优雅实现加密?

    2024-05-25 18:25:12       33 阅读
  4. arm-day6控制灯

    2024-05-25 18:25:12       34 阅读
  5. Apache Doris 2.1.3 版本正式发布!

    2024-05-25 18:25:12       30 阅读
  6. 【前端每日基础】day30

    2024-05-25 18:25:12       30 阅读
  7. 二叉树的序列化---广义表

    2024-05-25 18:25:12       36 阅读
  8. go全部版本下载目录

    2024-05-25 18:25:12       32 阅读
  9. C++

    2024-05-25 18:25:12       33 阅读
  10. C语言中的指针第2篇

    2024-05-25 18:25:12       27 阅读
  11. pillow学习2

    2024-05-25 18:25:12       27 阅读
  12. Gin框架HTML文件的加载与渲染

    2024-05-25 18:25:12       33 阅读