Word VBA快速将题目选项转换为多列表格

实例需求: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行代码弹出提示框,提示用户表格已成功创建。

相关推荐
taller_20004 个月前
新奇的Word表格单元格合并
word表格·合并单元格·合并表格·合并word单元格·word合并单元格
taller_20008 个月前
Word VBA快速制作填空题
word vba·替换·文档转换·填空题
taller_20001 年前
快速汇总Word表格
word·汇总·word表格·表格汇总·合并表格
taller_20001 年前
借助Excel实现Word表格快速排序
排序·表格排序·word表格·word排序·随机排序
taller_20001 年前
Word VBA如何间隔选中多个(非连续)段落
word vba·非连续·多选区·选中段落·多段落
taller_20001 年前
快速遍历包含合并单元格的Word表格
合并·word表格·合并单元格·遍历合并表格·变量单元格
taller_20001 年前
使用VBA快速将文本转换为Word表格
word·vba·表格·word vba·文本转表格
E-iceblue2 年前
Python 在Word中创建表格并填入数据、图片
python·word表格·表格图片·python word库
taller_20002 年前
VBA实现Word表格排序
word·多列表格·表格排序·word表格·word vba