Word提供了一个强调的文本转表格的功能,结合VBA可以实现文本快速转换表格。
示例文档如下所示。
现在需要将上述文档内容转换为如下格式的表格,表格内容的起始标志为@@@
。
示例代码如下。
vb
Sub SearchTab()
Application.DefaultTableSeparator = "*"
Selection.HomeKey unit:=wdStory
With Selection.Find
.Text = "@@@"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchAllWordForms = False
Do While .Execute
With Selection
.Delete
.Expand wdParagraph
.Font.Italic = True
.Range.Font.TextColor.RGB = RGB(97, 146, 0)
.MoveDown unit:=wdParagraph
.MoveDown unit:=wdParagraph, Count:=6, Extend:=wdExtend
Call textToTable
.Collapse wdCollapseEnd
End With
Loop
End With
End Sub
【代码解析】
第2行代码设置默认表格分隔符为星号(*
),这是文本转换为表格时的相关设置。
第3行代码将光标移动到文档的开头,准备进行查找操作。
第4行代码开始查找,通过Selection.Find
对象定义查找条件。
第5行代码指定要查找的文本为@@@
。
第6行代码定义查找方向为向前。
第7行代码设置查找范围停止在文档的结尾。
第8行代码取消格式匹配选项。
第9行代码禁用同义词匹配。
第10行代码使用Do While
循环查找文档中的所有符合条件的文本。
第11~18行代码对每一个找到的文本执行一系列操作。
第12行代码删除选中的查找到的文本,即起始标志@@@
。
第13行代码将选区扩展到整段,即表格之上的标题行。
第14行代码将整段的字体设置为斜体。
第15行代码将段落的字体颜色设置为指定的绿色。
第16~17行代码向下移动光标两个段落,并选中接下来的6个段落。
第18行代码调用textToTable
子程序,将选中的文本转换为表格。
第19行代码将选区折叠到当前段落的末尾,准备开始查找下一个匹配项。
vb
Sub textToTable()
Dim tempString As String, i As Integer
Selection.ConvertToTable Separator:=wdSeparateByDefaultListSeparator, _
NumColumns:=5, NumRows:=6, AutoFitBehavior:=wdAutoFitFixed
With Selection.Tables(1)
.Style = "Table Grid"
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = False
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = False
For i = 1 To .Rows.Count
If i > 2 Then .Rows(i).Cells.Merge
If Int(i / 2) <> i / 2 Then
.Rows(i).Shading.Texture = wdTextureNone
.Rows(i).Shading.ForegroundPatternColor = wdColorAutomatic
.Rows(i).Shading.BackgroundPatternColor = -603923969
.Rows(i).Range.Font.Bold = True
End If
Next
End With
End Sub
【代码解析】
第3~4行代码将选中的文本转换为表格。具体参数如下:
- Separator:=wdSeparateByDefaultListSeparator 表示使用默认的列表分隔符进行列分隔。
- NumColumns:=5 设置表格为5列。
- NumRows:=6 设置表格为6行。
- AutoFitBehavior:=wdAutoFitFixed 表示表格列宽是固定的,不自动调整。
第5~14行代码在表格转换完成后对其样式和内容进行设置。
第6行代码将表格样式设置为 "Table Grid"(网格样式)。
第7行代码设置表格的标题行(第一行)应用样式。
第8行代码设置最后一行不应用样式。
第9行代码设置表格的第一列应用样式。
第10行代码设置最后一列不应用样式。
第11~19行代码通过For循环遍历表格的每一行:
第12行代码判断当前行的行号是否大于2,如果是,则合并该行的所有单元格,如表格中第3~6行只有单个单元格。
第13行代码判断当前行为奇数行时,将其背景设置为指定颜色,并加粗字体。
第14行代码中Texture = wdTextureNone
表示无纹理。
第15行代码中ForegroundPatternColor = wdColorAutomatic
表示前景颜色为默认值。
第16行代码中BackgroundPatternColor = -603923969
设置背景颜色为指定的RGB值(浅灰色)。
第17行代码设置字体设置为加粗。