总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!你工作中有没有遇到过这样的情况?快下班了,领导发过来一个Word文档,让把Word文档中姓名对齐,他第二天早上要用,一再叮嘱尽快完成别耽误了
打开Word文档,就傻眼了,密密麻麻的名字总有上百个,显示还错综复杂的,没有一行数据是对齐的......本想着手工敲敲空格,也用不了多少时间,一看到内容计划也泡汤了 。怎么办呢,真是叫天天不应叫地地不灵呀
为了预防以后这类问题发生在自己身上,赶紧和我一起看看这类需求该怎么完美解决,还不耗费时间,俗话说的好:“技多不压身”。
又要到周末了赶紧完成工作,早点回家陪孩子,高质量的陪伴离不开和爸爸妈妈的互动,推荐几款产品,好玩又不贵,让孩子远离手机还能开心一整天
问题的分析与设计
因为本期需求不涉及Excel,所以分享另一种方式,不需要打开Excel文档,直接在Word文档中也能使用VBA编码,一起跟着步骤做起来吧
Word文档中直接添加可执行的宏操作
Word文档启用宏
步骤一,打开要排版的Word文档,点击【文件】选择另存为,在打开的对话框中,保存类型选择.docm,即启用宏的Word文档,如下图

步骤二 ,检查菜单栏中是否有“开发工具”,没有的话点击【文件】顺次选择【更多...】 【选项】,在打开的选项界面,选中【自定义功能区】,找到【开发工具】,打钩后选择确定即可

上述步骤完成后,就可以在Word中添加宏了
整体设置类似于Excel,如果Excel文档能熟练设置,那么Word文档也不在话下,都是相同的原理及操作步骤
Word文档中添加宏
- 步骤二,弹出的对话框中,添加宏名和宏的位置,这两个选项必填,建议刚开始不熟悉的朋友设置宏的位置为当前Word文档,否则误操作影响其他Word文档数据。说明非必选,为了便于以后查看使用,最好写清楚宏的功能及注意事项等
- 步骤三,全部填写好之后点击创建即可添加宏,同时打开VBA开发界面
注意:一定是先填写好【宏名】,再填写【说明】,【说明】强依赖【宏名】,也就是说再次修改或编辑【宏名】会导致【说明】内容清空,需要重新填写

Word文档中编写宏
首次添加宏会自动打开VBA开发界面,也可以通过【开发工具】【宏】在打开的页面选择【编辑】来打开VBA开发界面,打开的界面如下,自动生成一个框架,我们只需要将实现的功能代码粘贴复制到红色框内即可,代码参考:代码实现章节
感兴趣的朋友可以尝试着自己独立写一段代码来实现,也可以参考文中提供的代码

Word文档中执行宏
经过以上设置和编辑,最终迎来了执行操作,也是见证奇迹的时刻,心情有点小激动呢
那么从哪里下手执行呢,还是要通过工具栏的【开发工具】【宏】,在弹出的界面上选择第一个按钮【运行】即可
代码实现
执行代码前重要提醒,一定要看
重要的事情说三遍,执行过程中任何数据损失,自行承担责任
备份数据,关闭其他Word文档
备份数据,关闭其他Word文档
备份数据,关闭其他Word文档
完整源代码
执行以下代码前,首先要引用正则库,因为程序中使用了正则表达式
具体方法:在VBA编辑器中,点击"工具"菜单,选择"引用"。在弹出的"引用 - VBAProject"对话框中,滚动查找"Microsoft VBScript Regular Expressions 5.5",全部勾选它们,点击"确定"即可
Sub 姓名排版()'' 姓名排版 宏' Dim para As Paragraph Dim textContent As String textContent = "" Dim regx As New RegExp Dim myMatch As Object Dim i As Integer Dim SName As String ' 遍历文档中的所有段落 For Each para In ActiveDocument.Paragraphs textContent = textContent & para.Range.Text & vbCrLf Next para regx.Pattern = "([\u4e00-\u9fa5]{2,3})" '正则表达式匹配规则,提取2~3个汉字,Word文档中姓名之间用空格或是其他符号隔开都可以使用这个规则 regx.Global = True Set myMatch = regx.Execute(textContent) ' content中存放着全部姓名 i = 0 '默认也是0 ActiveDocument.Content.Delete '清除掉原来数据 '排版重新写入 With ActiveDocument For Each Match In myMatch SName = myMatch(i).Value If Len(SName) < 3 Then '姓名是2个字加空格 SName = Mid(SName, 1, 1) & " " & Mid(SName, 2) End If .Content.InsertAfter (SName & " ") 'Word尾部追加,名字之间3个空格隔开 If (i + 1) Mod 7 = 0 Then '每行限制输出7个姓名 .Content.InsertAfter (vbCrLf) '换行符 End If i = i + 1 '下一个 Next Match End With With ActiveDocument.Content.Font .Name = "Arial" ' 设置字体为Arial .Size = 13 ' 设置字体大小为12磅 .Bold = True ' 设置字体为粗体 .Italic = False ' 设置字体为非斜体 .Color = RGB(0, 0, 0) ' 设置字体颜色为黑色 End WithEnd Sub
代码说明
ActiveDocument即代表当前打开的Word文档,代码中有删除Word文档数据的操作,为了防止误删其他打开的Word文档数据,在Word文档中启用宏,不要直接在VBA界面运行。若是为了调试方便,尽量关闭其他Word文档
重要文件一定要养成备份的习惯,程序执行后,一旦有误伤或读写错误,无法恢复
继续说明一下代码逻辑,可以结合代码阅读
- 首先遍历Word文档,按照段落获取全部数据并保存到变量textContent中,此时就可以删除掉Word中的内容,方便重新写入排版后的内容
- 接着利用正则表达式,逐个获取姓名,文档中给定的姓名只有2个和3个字的,所以正则取数规则为([\u4e00-\u9fa5]{2,3}),获取2~3个连续汉字,如果有其他情况,修改取数规则即可
- 再次将姓名逐个按照提前定义好的格式输入到Word中,即姓名之间保留3个空格,若是两个字的姓名是中间用空格补齐;另外为了保持整洁、对齐,每行只输入7个姓名
- 最后设置Word文档中字体,如字体大小、颜色、是否加粗等等
运行结果
一起来看看自动化排版之后的效果,排版前后对比明显,排版后的效果整洁,看着就舒服
回顾总结
同一类型的需求都可以参考文中提供的代码优化修改,虽然文档中介绍了很多,但是真正做起来特别简单,半分钟的投入换将来的后顾无忧,还是很划算的哈,关键是你还学到了一门技术,不是吗
如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号,解锁更多的VBA技能
为了大家更深入的学习和快速实现办公自动化,"努力鸭是黑色的"公众号同时还开设了付费项目如下:
公众号内发送你的问题或需求,紧急需求请标注紧急+限定日期,以免交付延期耽误你的使用