实例需求:Word文档中的填空题如下图所示。

用户选中题目选项(不多余15个行)文字,运行代码,将选项转换为表格,插入到选中文本段落之后,如下图所示。

实例代码如下。
Sub Demo()
Dim rng As Range, col, lineText As String, ar
Dim lines As Variant, oTab As table
Dim i As Long, j As Long, currentRow As Long
Application.ScreenUpdating = False
Set rng = Selection.Range
lines = Split(rng.Text, vbCr)
rng.Collapse wdCollapseEnd
Set oTab = rng.Parent.Tables.Add(rng, 15, 9)
Dim objRegExp As Object, objMatch As Object
Set objRegExp = CreateObject("vbscript.regexp")
objRegExp.Pattern = "([A-Z]\.)\s([a-zA-Z ]+)"
objRegExp.Global = True
objRegExp.IgnoreCase = False
objRegExp.Multiline = False
currentRow = 1
For i = 0 To UBound(lines)
lineText = Trim(lines(i))
If currentRow > 15 Or Len(lineText) = 0 Then Exit For
ar = Split(lineText, ".")
If IsNumeric(ar(0)) Then
oTab.Cell(currentRow, 1).Range.Text = ar(0) & "."
Set objMatch = objRegExp.Execute(Trim(Mid(lineText, Len(ar(0)) + 2)))
If objMatch.Count > 0 Then
For j = 0 To objMatch.Count - 1
oTab.Cell(currentRow, 2 + j * 2).Range.Text = objMatch(j).SubMatches(0)
oTab.Cell(currentRow, 3 + j * 2).Range.Text = objMatch(j).SubMatches(1)
Next
End If
End If
currentRow = currentRow + 1
Next i
With oTab
.Columns.Width = 25
.Columns(1).Width = 40
.Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
For Each col In Array(3, 5, 7, 9)
.Columns(col).Width = 90
.Columns(col).Select
Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
Next
.Borders.OutsideLineStyle = wdLineStyleSingle
.Borders.InsideLineStyle = wdLineStyleSingle
End With
Application.ScreenUpdating = True
MsgBox "已创建15×9表格!"
End Sub
【代码解析】
第5行代码关闭屏幕刷新,提高 Word 操作过程中的执行效率。
第6行代码获取当前文档中选区对应的 Range 对象,并赋值给变量 rng。
第7行代码按回车符 vbCr 将选区中的文本拆分为多行,并存入数组 lines。
第8行代码将选区折叠到末尾,为后续插入表格预留位置。
第9行代码在当前位置新建一个 15 行 9 列的 Word 表格,并赋值给变量 oTab。
第11行代码创建正则表达式对象,用于后续的文本模式匹配。
第12行代码设置正则表达式模式,用于匹配字母加点 + 空格 + 单词内容的结构。
第13行代码启用全局匹配,使正则表达式可匹配同一行中的多个结果。
第14行代码关闭忽略大小写选项,确保匹配区分大小写。
第15行代码关闭多行模式,按单行文本进行匹配。
第16行代码初始化当前写入表格的行号,从第 1 行开始。
第17行代码通过 For 循环逐行遍历拆分后的文本数组。
第18行代码对当前行文本进行去除首尾空格处理,并赋值给变量 lineText。
第19行代码判断当前行号是否超过 15 行或文本是否为空,若满足条件则提前退出循环。
第20行代码按英文句点将当前行文本拆分,用于判断是否以数字编号开头。
第21行代码判断拆分后的第一个元素是否为数字,以确认该行是否为有效编号行。
第22行代码将编号写入表格当前行的第 1 列,并补全末尾句点。
第23行代码对编号后的正文内容执行正则匹配,并将匹配结果赋值给变量 objMatch。
第24行代码判断是否成功匹配到符合规则的内容。
第25行代码通过内层循环逐个处理匹配结果。
第26行代码将匹配到的首字母缩写写入表格对应的偶数列中。
第27行代码将匹配到的描述文本写入表格对应的奇数列中。
第31行代码将表格写入行号递增一行,准备处理下一条记录。
第32行代码结束对文本行的主循环。
第33行代码开始对表格整体进行格式设置。
第34行代码统一设置所有列的默认列宽。
第35行代码单独调整第 1 列宽度,用于显示编号内容。
第36行代码将整个表格内容设置为段落水平居中对齐。
第37行代码通过 For Each 循环遍历需要左对齐的列编号数组。
第38行代码设置指定列的列宽,用于容纳较长文本。
第39行代码选中当前列,为后续设置段落格式做准备。
第40行代码将当前列的段落格式设置为左对齐。
第41行代码结束列遍历循环。
第42行代码为表格设置外边框样式为单线。
第43行代码为表格设置内部边框样式为单线。
第45行代码重新开启屏幕刷新,恢复 Word 的正常显示。
第46行代码弹出提示框,提示用户表格已成功创建。