快速汇总Word表格

ops/2024/12/26 18:03:12/

示例需求:Word文档中的有多个表格,其中最后一个表格为汇总表格,其他的为数据表格,如下图中左侧所示。

现在需要根据Category1Category2,在数据表格中查找,如果找到匹配行,那么

  1. 为数据表中改行创建书签Bookmark
  2. 汇总表格中记录匹配行位置,例如表格Table_1中第3行
  3. 为上述文字添加超链接指向书签

完成后的效果如下图中右侧所示。

在这里插入图片描述

示例代码如下。

Sub LinkMatches()Dim i As Long, j As Long, r As LongDim oDoc As Document, tabIndex As StringDim sumTab As Table, oTab As TableDim sKey1 As String, sKey2 As String, bFirst As BooleanDim cellRange As Range, paraRng As RangeConst S_ROW = 3Set oDoc = ThisDocumentSet sumTab = oDoc.Tables(oDoc.Tables.Count)For r = 3 To sumTab.Rows.CountsKey1 = GetTxt(sumTab.Cell(i, 2).Range.Text) & "|" & _GetTxt(sumTab.Cell(i, 3).Range.Text)Set cellRange = sumTab.Cell(i, 5).RangecellRange.Text = ""bFirst = TrueFor i = 1 To oDoc.Tables.Count - 1Set oTab = oDoc.Tables(i)tabIndex = "Table_" & iFor j = 3 To oTab.Rows.CountsKey2 = GetTxt(oTab.Cell(j, 2).Range.Text) & "|" & _GetTxt(oTab.Cell(j, 3).Range.Text)If sKey1 = sKey2 ThenoTab.Rows(j).Range.Bookmarks.Add tabIndex & "Row" & jIf Not bFirst ThencellRange.InsertAfter vbCrEnd IfcellRange.InsertAfter "表格" & tabIndex & "中第" & j & "行"Set paraRng = cellRange.Paragraphs.Last.RangeparaRng.MoveEnd wdCharacter, -1cellRange.Hyperlinks.Add Anchor:=paraRng, _Address:="", SubAddress:=tabIndex & "Row" & j, _TextToDisplay:="表格" & tabIndex & "中第" & j & "行"bFirst = FalseEnd IfNextNextNext
End Sub

【代码解析】
第7行代码定义常量,指定数据行从表格第3行开始。
第8行代码获取当前文档对象。
第9行代码获取文档中最后一个表格对象,即汇总表格。
第10行代码在汇总表格中从第3行开始遍历每一行。
第11~12行代码读取第2列和第3列,并组合为关键字。
第13行代码获取第5列单元格。
第14行代码清空第5列单元格。
第15行代码设置首个匹配记录标志位为True。
第16~36行代码循环遍历工作表中的表格(不包含汇总表格)。
第17行代码获取表格对象。
第18行代码为表格标识名称(表格对象的Name属性可能不规范,并且和表格在文档中出现的顺序不同,例如Table1在Table2之后)。
第19~35行代码循环遍历数据表格的每行数据。
第20~21行代码从当前行提取关键字。
第22行代码判断两个关键字是否相同。
第23行代码为当前数据行添加书签。
第24行代码判断是否为首个匹配记录,如果是的话,第25行代码将在汇总单元格中插入回车符。
第27行代码在汇总单元格中追加匹配记录信息。
第28行代码获取汇总单元格中的最后一个段落。
第29行代码将段落结束位置向前移动一个字符,即不包含单元格结束标志。
注意:如果没有第29行代码,并且汇总单元格中包含多个段落时,虽然cellRange为最后一个段落的Range对象,但是第30~32行代码将为第一个段落设置超链接,听起来似乎不可思议,但是多次测试Word 365就是这个效果。
第30~32行代码为汇总单元格最后一个段落条件超链接。
第33行代码将标识变量设置为False。

下面的自定义函数用于清理Word表格单元格内容,去除不可见字符。

Function GetTxt(sTxt As String) As StringsTxt = Replace(sTxt, Chr(7), "")sTxt = Replace(sTxt, vbCr, "")sTxt = Replace(sTxt, vbLf, "")sTxt = Replace(sTxt, Chr(160), "")GetTxt = Trim(sTxt)
End Function

【代码解析】
第2行代码清除Word表格单元格标志。
第3~4行代码清除回车换行符。
第5行代码清除Word的非间断空格(no-break space,不可见字符)。


http://www.ppmy.cn/ops/145177.html

相关文章

常用JavaScript工具函数封装与优化

通用JavaScript方法封装 在现代Web开发中,许多应用程序都需要处理常见的操作,如日期格式化、表单重置、数据字典回显、树形结构数据构建等。为了提高开发效率并减少重复代码,我们可以将这些常用的操作封装成通用函数,以便在多个项…

CSS|15 CSS3结构伪类border-collapse伪元素

15 CSS3 15.1 CSS3和CSS2之间的区别 css3 css2 新语法 新的属性 就是对css2进行扩充 删减 优化 15.2 结构伪类 案例一&#xff1a;结构伪类 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&qu…

深入理解.NET内存回收机制

&#xff3b;前言&#xff1a;&#xff3d;.Net平台提供了许多新功能&#xff0c;这些功能能够帮助程序员生产出更高效和稳定的代码。其中之一就是垃圾回收器(GC)。这篇文章将深入探讨这一功能&#xff0c;了解它是如何工作的以及如何编写代码来更好地使用这一.Net平台提供的功…

详细介绍如何使用rapidjson读取json文件

本文主要详细介绍如何使用rapidjson库来实现.json文件的读取&#xff0c;分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中&#xff0c;{} 和 [] 分别表示不同的数据结构&…

Java课程设计:基于tomcat+jsp+sqlserver的javaweb计算机配件报价系统

一、项目介绍 前台功能模块&#xff1a;系统首页、我的信息、留言板、用户登陆、公告以及日历模块 后台功能模块&#xff1a;修改个人信息、管理员管理、注册用户管理、类别信息管理、类别信息添加、散件信息管理、散件信息添加、公告信息管理、公告信息添加 二、项目技术栈…

Ubuntu 24使用systemctl配置service自动重启

总体流程和互联网上差不多 &#xff0c;但是Ubuntu 24的 system配置文件位于 /usr/lib/systemd/system/ 网上的文章还停留在/etc/下 让我一顿好找 举个例子 主要是添加这个参数 Restartalways [Unit] DescriptionBuda Website Service Afternetwork.target[Service] Type…

《Java 与 Deeplearning4j:开启深度学习高效训练之旅》

在当今科技飞速发展的时代&#xff0c;深度学习无疑是人工智能领域的一颗璀璨明珠。Java 作为一种广泛应用的编程语言&#xff0c;与 Deeplearning4j 框架的结合&#xff0c;为开发者们开辟了一条在深度学习领域大展身手的新路径。那么&#xff0c;如何在 Java 中高效地使用 De…

从自动驾驶到具身智能漫谈

0. 简介 从作者的眼光来看自动驾驶和具身智能已经是越来越接近了。无论是技术栈以及实现的最终目的。其实都是希望人在环内。这个是古月直播的文字相关的大致梳理。主要会展开聊一聊自动驾驶的变迁以及作为自动驾驶的从业人员要着重关注的一些技术点 1. 自动驾驶的变迁 在自…