不称深度指南,只愿浅度指北
在编辑一些文档中,你肯定会遇到下面的这种情况:
需要填写一些姓名专业等信息,尤其是一些档案的封面页。而你也看到了,大部分的文档,都会使用空格+下划线的方式实现。
而使用这种方式的文档,当你在上面填写文字时,上下两行的下划线无法完全对齐,用两个空格太多,一个又太窄,怎样都调整不好:
逼死强迫症!
而正确的做法就是使用表格,然后隐藏边框线:

这样,无论你如何调整,都不会破坏之前的结构:

当然,如果你经常遇到这种问题,就可以录制+修改宏来完成:

但这里有几个小问题:
获取行列数 文本转表格首先,我们可以「插入 -表格」中的「文本转表格」功能,通过特定的符号,将文本转化为表格:
但这里,需要我们录入行列数以及分隔符:
但可能每次的表格行列数都不同,我们需要根据具体的内容获取。另外,我们可能会多选择了一个空段,这就需要我们在代码中排除啦。
其中的代码逻辑,主要是根据整个选区的制表符个数和段落数,同时用int函数进行取整。
该部分完整代码如下:
'判断几行几列
Dim rng
Dim iCols, iRows
'统计有多少制表符
For Each ichar In Selection.Characters
If ichar.Text = vbTab Then
iCols = iCols + 1
End If
Next
'统计段落标记数目
For Each rng In Selection.Paragraphs
If Len(rng) <> 1 Then '兼容多选部分段落
iRows = iRows + 1
End If
Next
If iRows = 0 Or iCols = 0 Then Exit Sub
iCols = Int(iCols / iRows) '去掉多余选择的空段
框线及列宽调整
表格格式设置
转换为表格后,我们就需要设置下边框线和各列宽度。
而这里的一个重点是,我们首先需要获取表格,才可以访问其中的单元格。
这在录制的宏中,是用 Selection.Tables(1) 来实现的,而我们其实有更方便的方法,定义一个表格,让其与之前添加的表格等同,也就是:
Dim t
Set t = Selection.ConvertToTable(Separator:=wdSeparateByTabs, NumColumns:=iCols, _
NumRows:=iRows, AutoFitBehavior:=wdAutoFitFixed)
这样,我们就可以定义各列的宽度啦:
'录制中可能会有多条语句,以最后的数值为准 t.Columns(1).SetWidth ColumnWidth:=106.85, RulerStyle:= _wdAdjustNone
另外,在设置最后一列单元格的下划线时,需要每个单元格都设置一次,不能直接选择一列,否则会出现仅应用于整表的最后一行:
因此,我们需要在代码部分,使用循环来实现:
t.Cell(1, iCols + 1).Select '1行最后一列
Word.Selection.SelectColumn '选择word的列
For Each oCell In Word.Selection.Cells
With oCell.Borders(wdBorderBottom)
.LineStyle = Options.DefaultBorderLineStyle
.LineWidth = Options.DefaultBorderLineWidth
.Color = Options.DefaultBorderColor
End With
Next
框线及对齐方式
表格单元格字体段落格式
接下来,我们需要设置每个单元格的段落对齐和清除原有下划线。
通常,我们的第一列单元格是分散对齐的,这样,无论是几个字,都可以整齐排列:
.Range.Font.Underline = wdUnderlineNone '清除原有下划线
另外,表格整体的位置,一般会是居中对齐:
t.Rows.Alignment = wdAlignRowCenter '整体居中
细节决定产品
一(亿)点点细节
最后,可以增加一点点细节,但这部分就需要你自己来完成了。
1. 去掉选区中的空格,不用再次删除了;
2. 获取第一列中每个单元格的字符数,取最大值,然后据此和字体大小设置列宽;
3. 提示用户警告操作,如在未选取文字时、选取的文字不包含制表符的时候,进行错误提示;
……
参考完整代码:
Sub 自动转换为信息表() '公众号「未央暮城」作者「莫浅北」原创
Dim msg
If MsgBox("请确认已用制表符分隔", vbOKCancel) = vbOK Then
Application.ScreenUpdating = False
'判断几行几列
Dim rng
Dim iCols, iRows
'统计有多少制表符
For Each ichar In Selection.Characters
If ichar.Text = vbTab Then
iCols = iCols + 1
End If
Next
'统计段落标记数目
For Each rng In Selection.Paragraphs
If Len(rng) <> 1 Then '兼容多选部分段落
iRows = iRows + 1
End If
Next
If iRows = 0 Or iCols = 0 Then Exit Sub
iCols = Int(iCols / iRows)
Dim iTable
Set iTable = Selection.ConvertToTable(Separator:=wdSeparateByTabs, NumColumns:=iCols + 1, _
NumRows:=iRows, AutoFitBehavior:=wdAutoFitContent) '根据内容调整表格,但好像不怎么好用
iTable.AutoFitBehavior (wdAutoFitContent) '根据内容自动调整表格
With iTable
'清除全部边框线
.Borders(wdBorderTop).LineStyle = wdLineStyleNone
.Borders(wdBorderLeft).LineStyle = wdLineStyleNone
.Borders(wdBorderBottom).LineStyle = wdLineStyleNone
.Borders(wdBorderRight).LineStyle = wdLineStyleNone
.Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone
.Borders(wdBorderVertical).LineStyle = wdLineStyleNone
.Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
.Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
.Rows.Alignment = wdAlignRowCenter '整体居中
.Range.Font.Underline = wdUnderlineNone '清除原有下划线
.Cell(1, iCols + 1).Select '1行最后一列
Word.Selection.SelectColumn '选择word的列
For Each oCell In Word.Selection.Cells
With oCell.Borders(wdBorderBottom)
.LineStyle = Options.DefaultBorderLineStyle
.LineWidth = Options.DefaultBorderLineWidth
.Color = Options.DefaultBorderColor
End With
oCell.Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
Next
.Cell(1, 1).Select '1行1列
Word.Selection.SelectColumn '选择word的列
Selection.ParagraphFormat.Alignment = wdAlignParagraphDistribute '分散对齐
End With
Application.ScreenUpdating = True
End If
End Sub
最后的叨逼叨
如果对于有一点点帮助,可以评论区踩个jio印再走呀,这样,也更能促进我更文不是?
—— THE END ——
