VBA实现Word表格排序

实例需求:

在Word文档的多列表格中,需要按照第一列进行排序,同时保持其他列的数据对应顺序不变。想必大家都知道,在Excel中可以简单地使用排序功能实现这种需求,但是对于Word表格则需要使用VBA代码进行处理。

原始数据:

fruit vegetable
apple eggplant
pear carrot
apple cabbage
apple potato
pear yam
orange marrow

排序后的数据:

(第二列保留其在原始表格中的先后顺序)

fruit vegetable
apple eggplant
apple cabbage
apple potato
pear carrot
pear yam
orange marrow

示例代码:

复制代码
Sub SortTableInWord()
    Dim oTable As Table
    Dim aData(), Temp
    Dim i As Long, j As Long
    Dim RowsCnt As Long, c As Range
    Dim Dic As Object, aKey, aItem, k
    Set oTable = ActiveDocument.Tables(1)
    RowsCnt = oTable.Rows.Count
    ReDim aData(1 To RowsCnt, 1 To 2)
    For i = 1 To RowsCnt
        For j = 1 To 2
            Set c = oTable.Cell(i, j).Range
            aData(i, j) = ActiveDocument.Range(c.Start, c.End - 1).Text
        Next j
    Next i
    Set Dic = CreateObject("scripting.dictionary")
    For i = 2 To RowsCnt
        Temp = aData(i, 1)
        If Dic.Exists(Temp) Then
            Dic(Temp) = Dic(Temp) & "|" & aData(i, 2)
        Else
            Dic(Temp) = aData(i, 2)
        End If
    Next i
    aKey = Dic.keys
    For i = 0 To Dic.Count - 1
        For j = i + 1 To Dic.Count - 1
            If aKey(i) = aKey(j) Then
                Temp = aKey(i)
                aKey(i) = aKey(j)
                aKey(j) = Temp
            End If
        Next j
    Next i
    j = 2
    For i = 0 To Dic.Count - 1
        aItem = Split(Dic(aKey(i)), "|")
        For k = 0 To UBound(aItem)
            oTable.Cell(j, 1).Range.Text = aKey(i)
            oTable.Cell(j, 2).Range.Text = aItem(k)
            j = j + 1
        Next
    Next i
End Sub

【代码解析】

第7行代码获取活动文档中的第一个表格对象。

第8行代码获取表格行数。

第9行代码定义二维数组存表格数据。

第10~15行代码双层For循环加载表格数据到数组。

第12行代码获取单元格Range对象。

第13行代码读取单元格文本到数组,其中Range(c.Start, c.End - 1)用于剔除单元格内容结尾的Chr(13),也可以读取Text属性后,使用Replace函数进行替换。

第16行代码创建字典对象。

第17~24行代码循环处理每行数据。

第18行代码获取当前行第一列值为字典对象的键。

第19~23行代码判断键是否存在。

  • 如果存在,则第20行代码将表格中第2列的值追加到字典中,使用竖线作为分隔符。
  • 如果不存在,则第22行代码在字典对象中增加新键。

第25行代码获取字典键列表。

第26~34行代码使用双层For循环对字典键列表排序。

第28~32行代码交换变量实现排序。

第35行代码初始化写入行号。

第36~43行代码循环写入排序后的数据。

第37行代码拆分值列表。

第39~41行代码写入键和对应值。

第42行代码行号指针加一。


小结:

利用字典对象可以方便地存储表格数据,通过键值对应关系保证排序后数据顺序正确性,如果使用普通的排序算法对于二维数组排序,那么在排序过程中交换数组元素时,将打乱第2列数据的顺序。

相关推荐
_处女座程序员的日常1 天前
如何预览常见格式word、excel、ppt、图片等格式的文档
前端·javascript·word·excel·开源软件
学会用脚编程2 天前
word转Pdf,在window正常,放在linux服务器上就转出来中文是空白
pdf·word
跟着珅聪学java2 天前
在Java中判断Word文档中是否包含表格并读取表格内容,可以使用Apache POI库教程
java·开发语言·word
CodeCraft Studio3 天前
国产化Excel处理控件Spire.XLS教程:如何使用 Java 将 TXT 文本转换为 Excel 表格
java·word·excel·spire·文档格式转换·txt转excel
开开心心就好4 天前
电子报纸离线保存:一键下载多报PDF工具
网络·笔记·macos·pdf·word·音视频·phpstorm
书中自有妍如玉4 天前
Node.Js 实现模板生成Word、Word转Pdf文件、Excel生成、上传和下载
pdf·node.js·word
格兰芬多呼神护卫5 天前
python实现Latex格式的公式转OMML并写入word
python·c#·word
不坑老师6 天前
利用不坑盒子在WPS中插入网页,放映的电脑无需安装插件,直接就能显示网页!
microsoft·word·powerpoint·wps
ljh_learn_from_base6 天前
【spring boot 使用apache poi 生成和处理word 文档】
java·spring boot·word·apache
2501_920955576 天前
Word崩溃打不开?实测三款Word文档修复工具!
word