VBA宏实现Word论文自动排版

一、灵感与动机

        作为一名即将毕业的大四学生,不仅经历了设计、编写系统的痛苦,还经历了撰写论文的烦恼,尤其是最后论文排版阶段,非常的繁琐和费时。所以我就希望可以有一个自动排版的“脚本”,一开始认为可以通过Python完成(因为Python属实强大),但经过大量的搜索和学习,我发现Office中给用户提供了一个宏语言,用户可以自己通过编码完成除现有功能外的其他功能。其默认支持VB,此外还有JS和Python也可以进行下载并切换开发环境。

二、现状与开发过程

        在开发的过程中,也是遇到了很多很多困难。最重要的可能还是我还是太菜了ヽ(ー_ー)ノ,目前VBA宏的编写对Excel的操做更加实用和方便,所以网络资源中基本都是Excel的教程学习。导致关于Word中使用的VB操做的案例和教程微乎其微,只能自己通过摸索、阅读文档和让ChatGPT帮忙。给也想练习的小伙伴一些建议吧,少走弯路:

(1)一开始我参考的开发文档是VB的,如果你VB不好可以参考,地址:Visual Basic 文档 - 入门、教程、参考。 | Microsoft Learn

但如果是word中的VBA开发文档需要参考Microsoft提供的,地址:Visual Basic for Applications (VBA) 的 Word 对象模型 | Microsoft Learn

(2)AI不是全部,不能给你提供直接搬来就能用的代码,需要你辨识和改变,这才是AI在帮助你编码中最正确的用法。

三、总体效果

使用VB的窗体与宏功能建立联系,目前已实现的功能:

(1)目录样式

(2)1、2、3...级标题样式

(3)正文样式

(4)图注、表注样式

(5)表格样式

(6)页面设置样式

(7)摘要(中英)样式,包括关键词样式 

四、部分功能实现

(1)修改标题样式(1、2、3...级标题)

        以1级标题为例,首先找到类型为“标题 1”的样式段落,再修改其具体样式,如加粗、下划线、倾斜、行距、段前段后等。实现代码如下:

Sub FormatHeading2()   '修改1级标题Dim p As ParagraphFor Each p In ActiveDocument.ParagraphsIf p.Style = ActiveDocument.styles("标题 1") Thenp.Range.Font.Bold = Truep.Range.Font.Italic = True '设置倾斜p.Range.Font.Underline = wdUnderlineSingle '设置下划线(单下划线)            p.Range.Font.Size = 15p.Range.Font.name = "宋体"p.Range.ParagraphFormat.Alignment = wdAlignParagraphRightp.Range.ParagraphFormat.spaceBefore = 20p.Range.ParagraphFormat.spaceAfter = 10p.Range.ParagraphFormat.LineSpacingRule = wdLineSpaceSingle   '单倍行距p.Range.ParagraphFormat.CharacterUnitFirstLineIndent = 0p.Range.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0)End IfNext p
End Sub

其他更多详细的属性可自行查阅开发文档。

(2)修改目录内容样式

        对于目录中不同级别的标题的样式会存在差异,我查找并修改样式的过程是,先找到所有标题的名称,不同级别放入不同数组中,在每个数组遍历寻找第一次出现的段落修改其样式。注意注意:目录中的文本属于超链接文本!实现代码如下(以修改目录中1级标题为例):

Sub updateDirectoryContentOneStyle()        '注意超链接文本问题Dim p As ParagraphDim one() As StringDim oneCount As IntegerDim i As IntegerFor Each p In ActiveDocument.ParagraphsIf p.Style = ActiveDocument.styles("标题 1") ThenReDim Preserve one(oneCount) '扩展一级标题数组one(oneCount) = p.Range.textoneCount = oneCount + 1End IfNext p'输出数组中保存的标题内容For i = 0 To UBound(one)Dim myRange As RangeDim myStyle As StyleSet myRange = ActiveDocument.ContentmyRange.Find.Execute FindText:=one(i), Forward:=True  '查找If myRange.Find.Found = True ThenWith myRange.Font.Bold = False.Font.name = "宋体".Font.Size = 14End WithEnd IfNext
End Sub

(3)查找特定文本并修改其样式

        本文以查找“关键词”三字为例。使用Find关键字进行查找,找到后修改其样式即可。更多的详细属性请参考开发文档,实现代码如下:

Sub findText()Set myRange = ActiveDocument.ContentmyRange.Find.Execute FindText:="关键词", Forward:=TrueIf myRange.Find.Found = True ThenWith myRange.Font.Bold = False.ParagraphFormat.Alignment = wdAlignParagraphLeft '左对齐.Font.Color = wdColorBlack.Font.name = "黑体".Font.Size = 14.ParagraphFormat.PageBreakBefore = False.ParagraphFormat.CharacterUnitFirstLineIndent = 0   '去除首行缩进.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0)End WithEnd If
End Sub

(4)表格样式

        修改表格样式,可以查阅开发文档与网络资源。我也参考了AI的一些代码。实现代码如下(最基本的不加样式的表格):

Sub execlOperate()   '表格样式操作Application.ScreenUpdating = False  '关闭屏幕刷新Application.DisplayAlerts = FalseOn Error Resume Next  '忽略错误Dim mytable As Table, i As LongIf Selection.Information(wdWithInTable) = True Then i = 1For Each mytable In ActiveDocument.TablesIf i = 1 Then Set mytable = Selection.Tables(1)With mytable'取消底色.Shading.ForegroundPatternColor = wdColorAutomatic.Shading.BackgroundPatternColor = wdColorAutomaticOptions.DefaultHighlightColorIndex = wdNoHighlight.Range.HighlightColorIndex = wdNoHighlight.Style = "表格主题"'单元格边距.TopPadding = PixelsToPoints(0, True) '设置上边距为0.BottomPadding = PixelsToPoints(0, True) '设置下边距为0.LeftPadding = PixelsToPoints(0, True)  '设置左边距为0.RightPadding = PixelsToPoints(0, True) '设置右边距为0.Spacing = PixelsToPoints(0, True) '允许单元格间距为0.AllowPageBreaks = True               '允许断页'.AllowAutoFit = True                 '允许自动调整尺寸'设置边框.Borders(wdBorderLeft).LineStyle = wdLineStyleNone.Borders(wdBorderRight).LineStyle = wdLineStyleNone.Borders(wdBorderTop).LineStyle = wdLineStyleNone.Borders(wdBorderBottom).LineStyle = wdLineStyleNone.Borders(wdBorderTop).LineStyle = wdLineStyleThinThickMedGap.Borders(wdBorderTop).LineWidth = wdLineWidth2pt.Borders(wdBorderBottom).LineStyle = wdLineStyleThickThinMedGap.Borders(wdBorderBottom).LineWidth = wdLineWidth225ptWith .Rows.WrapAroundText = False '取消文字环绕.Alignment = wdAlignRowCenter '表水平居中  wdAlignRowLeft '左对齐.AllowBreakAcrossPages = False '不允许行断页.HeightRule = wdRowHeightExactly '行高设为最小值   wdRowHeightAuto '行高设为自动.Height = CentimetersToPoints(0) '上面缩进量为0.LeftIndent = CentimetersToPoints(0) '左面缩进量为0End WithWith .RangeWith .Font '字体格式.name = "宋体".name = "Times New Roman".Color = wdColorAutomatic '自动字体颜色.Size = 12.Kerning = 0.DisableCharacterSpaceGrid = TrueEnd WithWith .ParagraphFormat '段落格式.CharacterUnitFirstLineIndent = 0 '取消首行缩进.FirstLineIndent = CentimetersToPoints(0) '取消首行缩进.LineSpacingRule = wdLineSpaceSingle '单倍行距  wdLineSpaceExactly '行距固定值'.LineSpacing = 20 '设置行间距为20磅,配合行距固定值.Alignment = wdAlignParagraphCenter '单元格水平居中.AutoAdjustRightIndent = False.DisableLineHeightGrid = TrueEnd With.Cells.VerticalAlignment = wdCellAlignVerticalCenter  '单元格垂直居中End With'设置首行格式.Cell(1, 1).Select ' 选中第一个单元格With Selection.SelectRow '选中当前行Selection.Rows.HeadingFormat = wdToggle '自动标题行重复.Range.Font.Bold = False '表头加粗黑体.Shading.ForegroundPatternColor = wdColorAutomatic '首行自动颜色'.Shading.BackgroundPatternColor = -603923969 '首行底纹填充End With'自动调整表格.Columns.PreferredWidthType = wdPreferredWidthAuto.AutoFitBehavior (wdAutoFitContent) '根据内容调整表格.AutoFitBehavior (wdAutoFitWindow) '根据窗口调整表格End WithIf i = 1 Then Exit ForNextErr.Clear: On Error GoTo 0             '恢复错误捕捉Application.DisplayAlerts = True       '开启提示Application.ScreenUpdating = True      '开启屏幕刷新
End Sub

(5)修改图注样式(表注同理)

        修改图注的样式,我的思路是查找所有的图片并获取图片的上一段文本,修改其样式。修改表注同理,实现代码如下。

注:代码中使用了InlineShape库,只能查找Word文档中样式为嵌入式的图片。

Sub GetAllImageNextLineText()       '修改所有图注的样式Dim shp As InlineShapeDim nextLine As RangeFor Each shp In ActiveDocument.InlineShapesIf shp.Type = wdInlineShapePicture ThenSet para = shp.Range.Paragraphs(1)Set nextPara = para.NextIf Not nextPara Is Nothing Then'修改下一行文本的样式With nextPara.Range.ParagraphFormat.Alignment = wdAlignParagraphCenter '文本居中.ParagraphFormat.LineSpacingRule = wdLineSpaceSingle '行距.Font.name = "黑体" '字体名称.Font.Size = 12    '字体大小.ParagraphFormat.CharacterUnitFirstLineIndent = 0.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0)End WithEnd IfEnd IfNext shp
End Sub

(6)页面设置

        这里就罗列的一些常用的页面设置方法,仅供参考和copy。更多详细的属性可自行查阅开发文档。

代码如下:

Sub installPage()       '修改页面设置Dim doc As DocumentSet doc = ActiveDocumentWith doc.PageSetup.LineNumbering.Active = False.Orientation = wdOrientPortrait '页面方向为纵向.topMargin = CentimetersToPoints(3.3) '上边距.bottomMargin = CentimetersToPoints(3.3) '下边距.LeftMargin = CentimetersToPoints(2.8)  '左边距.RightMargin = CentimetersToPoints(2.6)  '右边距.Gutter = CentimetersToPoints(0) '装订线.HeaderDistance = CentimetersToPoints(1.5) '页眉.FooterDistance = CentimetersToPoints(1.75) '页脚.PageWidth = CentimetersToPoints(21) '纸张宽.PageHeight = CentimetersToPoints(29.7) '纸张高.FirstPageTray = wdPrinterDefaultBin.OtherPagesTray = wdPrinterDefaultBin.SectionStart = wdSectionNewPage '节的起始位置:新建页.OddAndEvenPagesHeaderFooter = False '不勾选“奇偶页不同”.DifferentFirstPageHeaderFooter = False '不勾选“首页不同”.VerticalAlignment = wdAlignVerticalTop '页面垂直对齐方式为“顶端对齐”.SuppressEndnotes = False '不隐藏尾注.MirrorMargins = False '不设置首页的内外边距.TwoPagesOnOne = False.BookFoldPrinting = False.GutterPos = wdGutterPosLeft '装订线位于左侧.LayoutMode = wdLayoutModeLineGrid '版式模式为“只指定行网格”End With
End Sub

        到此,所有分享结束了,希望上述经历和代码可以帮助你们。还有更多功能和方法值得我和你们去研究,感谢浏览。有其他好的问题和经验可以在评论区留言或私信我。٩(๑❛ᴗ❛๑)۶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16660.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python自动排版Word文档:提高生产效率的神奇工具

Python自动排版Word文档:提高生产效率的神奇工具 介绍 随着电子文档的普及,Word文档成为了各种场合中最常用的文档格式。尤其在企业中,各种报告、规范、合同等文档的排版工作常常会占据很大比重,但是传统的手工排版往往效率低下…

YOLOv5全面解析教程⑥:模型训练流程详解

作者 | Fengwen、BBuf 欢迎Star、试用One-YOLOv5: https://github.com/Oneflow-Inc/one-yolov5 1 结构项目预览 2 安装 git clone https://github.com/Oneflow-Inc/one-yolov5 # clone cd one-yolov5 pip install -r requirements.txt # install 3 训练 两种训练…

发布4大“业界首个”产品,华为让数据中心变革开启“狂飙”模式

华为聚焦数字基础设施创新,通过4大“业界首个”产品的发布,不仅将引领新型数据中心发展,也将进一步支持企业的数字化转型,释放数字生产力。 在全球经济增速放缓的今天,数字经济正在成为经济增长的新引擎,为…

数据治理在学术上的发展史以及未来展望

数据治理是大数据领域中非常重要的一环,从早期的学术研究到如今的各大企业落地实践,经历了漫长的过程,数据治理的实践落地本身也是一场马拉松。 从百度学术通过精确关键词匹配,搜索中文期刊的“数据治理” 和外文期刊的“data gov…

于变革时代探寻破局之光 | LeaTech全球CTO领导力峰会圆满落幕

引言 2023 年 3 月 4 日,腾讯云 TVP 与 51CTO 联合主办的 LeaTech 全球 CTO 领导力峰会于上海扬子江丽笙精选酒店圆满落幕。 本届峰会聚集了腾讯云 TVP 技术专家、TVP 行业大使、CTO 训练营导师、CTO 训练营历届校友,以及来自各个领域和行业的技术领导者…

【原创】理解ChatGPT之注意力机制和Transformer入门

作者:黑夜路人 时间:2023年4月27日 想要连贯学习本内容请阅读之前文章: 【原创】理解ChatGPT之GPT工作原理 【原创】理解ChatGPT之机器学习入门 【原创】AIGC之 ChatGPT 高级使用技巧 GPT是什么意思 GPT的全称是 Generative Pre-trained …

新传专业需要计算机二级吗,大学生有必要去考取计算机二级证书吗?

满意答案 JKSNX 2020.09.22 采纳率:41% 等级:12 已帮助:4161人 这是个很常见的问题。每年总有两个月,学校的教务会发一则“计算机二级报考通知”,大家便开始讨论计算机二级有没有用,身体却很诚实地交上7…

跨考安大计算机研究生难吗,关于跨考安大新传这件事,你现在纠结的问题我们都知道!...

灵魂拷问:你为什么想要跨考新传? 因为兴趣…?热爱…?新闻理想…? 还是因为…? (开玩笑啦)即便有以上因素存在,大家选择了新传也有大部分原因是因为喜欢,比如说我,虽然综合…

新传工作运用计算机吗,Windows 7正式退休,这些解决办法你必须了解

2020年1月14日,微软Windows 7系统正式停止技术支持,你的计算机将不会中断或停止工作,但如果你的Windows 7计算机出现问题,它将不再收到任何问题的技术支持、软件更新、安全更新或修复。 现在微软在官方网站上公布了最新的Windows …

新传工作运用计算机吗,计算机等现代办公技术运用给文秘工作带来的新思考1...

电子计算机技术的运用发展被称为人类科学技术发展的"第三次革命",计算机技术在办公室的普及运用也使秘书工作由"笔杆子"向"键盘子"转变,计算机的运用操作成为了现代从业秘书的必备技能,与运而生的办公自动化大…

新传要不要学计算机,大学新生入学要带电脑吗?学长给出建议,不知道的会很“吃亏”...

教之而不受,虽强告之无益。譬之以水投石,必不纳也,今夫石田虽水润沃,其干可立待者,以其不纳故也。——张载 01前言 今年高考结束已经走了一段时间了,虽然成绩都还没有被公布,但相信很多考生的心…

服开与编排,老兵新传

前段时间,有同学问:编排与服开是什么关系?现在运营商都建设编排系统,那是不是服务开通以后就退出 OSS 舞台了?为什么会出现编排?这些问题对于行业老兵来说感慨万千,而对于新兵来说就要通过追溯其…

考研最卷的专业,我提名新传

不少专业的研究生统招考试都是一场“千军万马过独木桥”的残酷竞争,只是有的专业卷得明明白白,而有的专业多少让人意想不到 ——“钱途”一般,却也能卷上天,比如新传。 新传,指的是新闻传播类学科,除了主要…

Hitachi Vantara老兵新传

Hitachi Vantara正在书写一部“老兵新传”! 所谓“老”,是指Hitachi Vantara的前身HDS(Hitachi Data Systems)资历老,它曾是企业级存储市场的领导者;何为“新”?Hitachi Vantara于2017年9月才正…

计算机知识讲座图片,计算机ppt辅导讲座

原标题:计算机ppt辅导讲座 2020年11月4日下午1:30,在竞秀南楼304,润园书院学习部请到了赵燕飞老师为大家带来了一次细致实用的计算机关于ppt的辅导讲座。同时也是为了丰富同学们的计算机知识,教同学们熟练运用计算机知识制作精美的ppt。本次讲…

【简单】使用ChatGPT和QT从零开始构建一个计算器应用

在这篇博文中,我将向大家展示如何使用ChatGPT和Qt来构建一个完整的计算器应用。我们将从零开始,逐步引导您完成整个项目,包括需求分析、软件设计、代码编写等环节。该项目代码全部由GPT编写,10分钟完成。 一,项目概述 本项目旨在…

太突然了,不会ChatGPT就被淘汰,很多公司开始行动了!

上周末分别和两拨朋友约了饭局。周六约的是国内最大ERP厂商的朋友,饭桌上大家聊的最多的话题就是ChatGPT,他们上面领导发话了,让尽快引入ChatGPT,寻求突破。周日约见的是一波搞游戏开发的朋友,聊的最多话题也是ChatGPT…

ChatGPT 大浪潮下,哪些行业会被淘汰?

在 ChatGPT 大浪潮下,随着新技术的不断涌现和应用,一些传统行业或者是不适应发展节奏的行业可能会被淘汰。 我们先来看看,以下是可能受到影响的一些行业: 1、银行和金融行业:区块链技术的发展和数字货币的出现使得原本…

chatgpt赋能python:如何用Python打包项目不卡顿

如何用Python打包项目不卡顿 随着Python语言的普及和不断发展,越来越多的开发者选择使用Python作为主要的开发语言来开发应用程序。然而,许多Python开发者不知道如何打包他们的项目,或者他们打包后的项目存在性能问题。在本文中,…

告别卡顿困扰:IDEA 性能优化设置

大家好,我是老赵 在我们日常使用IDEA进行开发时,可能会遇到许多卡顿的瞬间,明明我们的机器配置也不低啊?为什么就会一直卡顿呢? 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限(通常很小…