目录
引言
问题的分析与设计
Word文档读取操作
一堆名字拆分并按列写入Excel单元格
代码入口设计
代码实现
运行结果
回顾总结
引言
如下图,Word文档中有一堆名字,名字中间是用空格隔开的,现在需要将它们逐一分开并输出到Excel表中,排成一列显示,即每个单元格中只能有一个名字

工作中遇到这类问题,大家都是怎么操作的呢?是不是还在用手工一个个粘贴复制过去呢?那样太费时间了,现在就提供给大家一种处理这类问题的方法,一键操作绝对省时省力!按照文中步骤操作,再多的数据也不怕,又有时间去品茶了,惬意!
问题的分析与设计
Word文档读取操作
首先我们需要定义两个特殊变量,WordApp和wordDoc
WordApp就是Word应用,把所有打开的Word文档关闭后(菜单栏顺次选择“文件”、“关闭”)就可以看到它了
至于wordDoc,这个就比较好理解了,我们经常编辑、修改的具体文档,它是和文件存储路径及文件名紧紧绑定在一起的,换句话说只要知道文件存放的路径和文件名我们就能成功得打开word文档了
接着是文档的打开及读取操作
已经创建好的Word文档,想用WordApp打开就需要用到:wordApp.Documents.Open(“完整的路径+文件名”)
可以一段一段的读取Word中内容:wordDoc.Paragraphs(Index).Range.Text
最后关闭打开的Word文档,养成好的习惯,程序有始有终
不需要保存更改,wordDoc.Close SaveChanges:=False,若需要改为True即可
App关闭退出,wordApp.Quit
如果想关闭所有的Word可以使用Set wordApp = Nothing;如果只是想关闭程序中打开的Word,不影响其他Word文件的正常使用,可以不用,根据实际情况来定
释放资源,Set wordDoc = Nothing
一堆名字拆分并按列写入Excel单元格
将获取到的一堆名字进行拆分,最简单的就是正则表达,只需要获取2~3个汉字即可解决,汉字编码区间[u4e00-u9fa5],因此提取规则设置为:([u4e00-u9fa5]{2,3})
具体的操作可以查看代码实现:regx 及myMatch变量的设置及处理
该功能还可以利用数组实现,可参考前期文章:
【Excel VBA编程】单元格数据拆分成一列OR一列数据汇总到一个单元格,利用数组轻松搞定_excel vba 合并单元格怎样装入数组-CSDN博客
代码入口设计
考虑使用方便,还是选取在Sheet页面插入命令按钮(Active x控件)
第一步:Excel文件首先要另存为.xlsm格式文件,第一次打开.xlsm文件会有安全警告,选择启用即可
第二步:顺次选择工具栏 –开发工具–插入–命令按钮(Active X控件),在表单中的适当位置拖动鼠标即可插入。如果该步骤有问题,可以查看我前期写的公众号文章,里面有详细的步骤:如何快速开始编程还不用搭建环境,那一定就是它了……
第三步:双击添加的命令按钮,快速打开VBA代码并且默认会创建类似如下的两行代码,然后我们只要在中间添加代码就可以通过命令按钮调用了
Private Sub CommandButton1_Click()
End Sub
Sheet页面插入命令按钮后显示

代码实现
执行以下代码前,首先要关联两个库,一个是针对Word操作的库,另一个因为程序中使用了正则表达式,因此还需要引用正则库
具体方法:在VBA编辑器中,点击”工具”菜单,选择”引用”。在弹出的”引用 – VBAProject”对话框中,滚动查找”Microsoft Word XX.0 Object Library(XX代表版本号,如16.0对应Word2016)”,和Microsoft VBScript Regular Expressions 5.5,全部勾选它们,点击”确定”即可
Private Sub CommandButton1_Click()
Dim wordApp As Object
Dim wordDoc As Document
Dim content As String
Dim i As Long '读取时指定的类型为long,Paragraphs(i)
Dim FileName As String '界面输入文件路径+文件名,不需要修改代码
Dim ws As Worksheet 'Excel指定Sheet
Dim iRow As Integer '行号
Dim regx As New RegExp
Dim myMatch As Object
Set ws = Worksheets("Sheet1")
FileName = InputBox("请输入Word文档的全路径及文件名(如C: est名单.docx)")
If FileName <> "" Then '输入了内容
'Word文档中内容读取到content变量中
If Dir(FileName) <> "" Then '判断是否正确输入了路径及文件名、或者输入的路径和文件名是否存在
Set wordApp = CreateObject("Word.Application") '创建word应用程序对象
wordApp.Visible = True '可见Word窗口
Set wordDoc = wordApp.Documents.Open(FileName) ',打开Word文档,输入框中输入的文件
' 读取文档内容
content = ""
For i = 1 To wordDoc.Paragraphs.Count
content = content & wordDoc.Paragraphs(i).Range.Text & vbCrLf '
Next i
Else
MsgBox "文件不存在,请确认输入信息是否正确或输入的路径文件是否存在!"
Exit Sub '程序退出
End If
'顺次截取姓名,并输出到Excel中A列中
iRow = 1
regx.Pattern = "([u4e00-u9fa5]{2,3})" '正则表达式匹配规则,提取2~3个汉字,Word文档中姓名之间用空格或是其他符号隔开都可以使用这个规则
regx.Global = True
Set myMatch = regx.Execute(content) ' content中存放着全部姓名
For Each Match In myMatch '获取全部数字,并拼接到一起就是电话号码
ws.Cells(iRow, 1).Value = myMatch(iRow - 1).Value '取姓名,使用iRow-1 表示Index,省去一个变量定义
iRow = iRow + 1 '下一个
Next Match
'关闭打开的Word文档
wordDoc.Close SaveChanges:=False ' 保存修改True,如果不需要保存更改,设置为False
wordApp.Quit '还是要退出来的,否则一个孤零零的Word窗口很难看
'Set wordApp = Nothing'会将所有Word关闭,影响使用
Set wordDoc = Nothing
MsgBox "Word中姓名全部读取完毕,并保存到Sheet1中A列,请查看!"
Else
MsgBox "没有输入内容,程序退出!"
End If
End Sub
运行结果
在Sheet1页面点击命令按钮“获取Word文档内姓名并输出一列”后程序开始运行,程序启动后会弹出输入框,用户通过输入框输入指定的Word文档及路径,如果输入错误或是没有输入内容程序自动退出

只有输入了正确的路径和文件名才会继续执行,执行完成后会有提示信息,关闭提示框后即可查看Sheet1中A列数据,已经全部转化完毕

提醒一下,数据处理及转化特别快速不大1秒,时间特别短我们基本上感觉不到;但是代码执行过程中需要打开Word APP及文档,这个操作比较耗费时间,大概7秒左右(类似于电脑开机后首次打开Word文档的速度),具体时间根据电脑情况有所差别,请耐心等待
回顾总结
本期分享了VBA针对Word文档的打开和读取操作,并利用正则表达式将一堆数据拆分成一列显示,大家可以一步步跟着做起来,相信你也可以的
如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想着提升自我,都可以已关注我的公众号,解锁更多的VBA技能
我的分享对你有帮助的话,麻烦点赞、加已关注支持一下吧,你的支持就是我最大的创作动力!
最后,再提醒一下大家,如果你有需求但因为各种问题搁置,可以把你的问题反馈给我,一起帮你出谋划策哦!搜索公众号“努力鸭是黑色的”,已关注我的公众号能够更加及时沟通反馈哦!


















暂无评论内容