【摘 要】针对期刊编辑工作中常见的表格加工问题,利用Word VBA建立表格窗口,实现表格转置、求和校验、三位分节、单位提取以及表序与文中提及校验功能。实践工作表明,该窗口操作简便,可帮助编辑节省时间以及提升表格编校质量。
【关键词】表格;编校;Word;VBA;宏;期刊编辑
编校质量是期刊质量的重要一环,由于编校环节所需考虑的专业知识与标准规范较为繁杂,因此往往会耗费编辑大量的时间。2020年《报纸期刊质量管理规定》[1]更是提出了期刊编校差错率不超过万分之二的要求,这使编辑工作面临巨大挑战,因此,寻求辅助编辑提升编校质量的方法具有重要意义。
目前,Office Word已成为稿件的主要载体,Word VBA因其强大的开发能力,使编辑大量重复性工作的自动化成为可能。已有研究对Word VBA在辅助编辑工作中的应用进行了探索。例如,文献[2]利用Word VBA进行不规范用词的检查与替换;文献[3]基于Word VBA实现了错误科技名词的检测、快速编辑批注以及量和单位的查询;文献[4]基于Word VBA建立智能编校系统,进行敏感词与重复词句的标注、格式调整等。上述文献均实现了特定功能的自动化,可在一定程度上提升稿件编校效率。表格具有简洁、清晰、准确等特点[5],是稿件的重要组成部分,但是目前关于表格编校功能自动化方面的研究较少。文献[6]利用Word VBA编程查找表序并突出显示,但其仍需编辑查看突出显示的表序来核实连续性,自动化程度不够高。
我们在编校工作实践中时常遇到表格纵向与横向栏目位置颠倒、数据求和错误、数据没有进行三位分节、表身中单位没有放在栏目中、表没有按顺序编号以及表没有在文中提及等问题,本文针对这些问题,基于Word VBA建立表格窗口,通过编程实现各种问题的自动化解决或提示,以期帮助编辑提高编校质量。
1 表格窗口的建立
在Word VBA编辑器的Normal工程下插入用户窗体UserForm1[7],并将其Caption属性设为“表格”。在窗体上添加5个标签(Caption属性分别设为“表序号:”“起始行:”“终止行:”“起始列:”“终止列:”)、5个文本框(名称属性分别为TextBox1~TextBox5)和6个命令按钮(名称属性分别为CommandButton1~CommandButton6,Caption属性分别设为“表格转置”“行求和校验”“列求和校验”“三位分节”“单位提取”和“表序与文中提及校验”)。表格窗口如图1所示。其中,表格转置、三位分节、单位提取功能只需输入表序号点击相应按钮即可自动实现;表序与文中提及校验功能只需点击按钮;行求和校验及列求和校验功能在默认的常见表格情况下只需输入表序号并点击相应按钮,对于特殊的求和校验需求则可通过同时输入起始行、终止行、起始列和终止列来实现。

图1 表格窗口
2 功能实现与示例
2.1 表格转置
表格中栏目与表身中信息应纵向排列,在稿件中经常出现图2中上表所示横向排列的情况,若重建表格并将每个单元格信息复制粘贴将极其耗费时间,通常可借助Excel进行选择性粘贴的转置操作,再复制粘贴到Word稿件中,这种方法较为简便,但仍需借助外力。本文利用编程实现只需输入表序号,一键点击“表格转置”即可自动建立图2中下表所示新表格。

图2 表格转置示例
实现思路为新建表格,再将原表格中各单元格信息按照行列互换方式写入新表格中。具体方法为双击“表格转置”按钮,输入如下代码:
Private Sub CommandButton1_Click()
Dim i%,j%
Dim tb,tz As Table
Set tb=ActiveDocument.Tables(TextBox1.Value)
Settz=ActiveDocument.Tables.Add(Range:=Selection.Range,NumRows:=tb.Columns.Count,NumColumns:=tb.Rows.Count)'新建表格
tz.Select
WithSelection.Range'设置格式。
Style="三线表".
Paragraphs.Alignment=wdAlignParagraphCenter
.Cells.VerticalAlignment=wdCellAlignVerticalCenter End With
For i=1 To tb.Columns.Count
For j=1 To tb.Rows.Count
tz.cell(i,j)。Range.Text=tb.cell(j,i)。Range.Text
Next j
Next i
End Sub
需要说明的是,由于三线表应用广泛,代码中“三线表”为自定义表格样式,该方法适用于对无合并单元格的表格进行转置。
2.2 数据求和校验
为了确保稿件中数据的科学性和准确性,编辑对于表格中出现的求和数据都应进行校验,并将有出入的数据及时与作者进行沟通核实。对图3中上表运行本文表格窗口中“行求和校验”程序,最后一个单元格中原数据71后键入了“,77”并以黄色突出显示,提醒编辑该数据存在问题。

图3 行求和校验示例
该功能的实现思路为逐列计算求和值,再与表格中原求和值进行比较,若不相等则在原求和值后键入新的求和值进行提示。实践中发现最常见的情况为表格最后一行为求和值,因此为了操作简便,程序中设置“只输入表序对应常见情况”。考虑到一些复杂表格的特殊求和校验需求,设置在输入表序号的同时输入起始行、终止行、起始列和终止列,则认为终止行下一行为求和值,程序对起始列和终止列之间各列的起始行和终止行之间各行求和后与原求和值进行比较。具体方法为双击“行求和校验”按钮,输入如下代码:
Private Sub CommandButton2_Click()
Dim m%,n%
Dim sum As Single
Dim ta As Table
Set ta=ActiveDocument.Tables(TextBox1.Value)
If TextBox1.Value<>""AndTextBox2.Value=""
And TextBox3.Value=""AndTextBox4.Value=""
And TextBox5.Value=""Then
'只输入表序对应常见情况
For m=1 To ta.Columns.Count
sum=0
For n=2 To ta.Rows.Count-1
sum=sum+Val(ta.cell(n,m)。Range.Text)
Next n
If sum<>Val(ta.cell(ta.Rows.Count,m).Range.Text)Then
With ta.cell(ta.Rows.Count,m)。Range.
InsertAfter"," & sum
.HighlightColorIndex=wdYellow
End With
End If
Next m
ElseIf TextBox1.Value<>""And TextBox2.Value<>""And TextBox3.Value<>""And TextBox4.Value<>""And TextBox5.Value<>""Then
'输入表序、起止行、起止列对应特殊情况
For m=TextBox4.Value To TextBox5.Value
sum=0
For n=TextBox2.ValueToTextBox3.Value
sum=sum+Val(ta.cell(n,m)。Range.Text)
Next n
If sum<>Val(ta.cell(TextBox3.Value+1,m).Range.Text)Then
With ta.cell(TextBox3.Value+1,m).Range
.InsertAfter","& sum
.HighlightColorIndex=wdYellow
End With
End If
Next m
End If
End Sub
列求和校验的原理与行求和校验相同。
2.3 三位分节
在我们的工作实践中发现,知道数据三位分节规范的作者较少,基本需要编辑手动对数据进行三位分节。利用本文表格窗口中的“三位分节”程序可将图4中上表数据自动进行三位分节得到图中下表形式。

图4 三位分节示例
本文首先以“*####*”Like运算规则判断是否为需要进行三位分节的数据,再以“[-0-9]*[.][0-9]*”Like运算规则判断数据是小数还是整数,由于三位分节为以小数点为分割点朝向相反方向每3位留空,因此对整数部分采用正则表达式“^(\-?\d+)(\d{3})”进行匹配,对小数部分采用正则表达式“(\d{3})(\d+)”进行匹配,以test方法对数据循环判断是否与正则表达式匹配来完成所有三位分节。具体实现方法为双击“三位分节”按钮,输入如下代码:
Private Sub CommandButton4_Click()
Dim a%,b%
Dim regex1,regex2 As Object
Dim tc As Table
Dim arr,cel
Set regex1=CreateObject("VBScript.RegExp")
Set regex2=CreateObject("VBScript.RegExp")
Withregex1'小数点左边正则表达式
.Global=True
.Pattern="^(\-?\d+)(\d{3})"
End With
With regex2'小数点右边正则表达式
.Global=True
.Pattern="(\d{3})(\d+)"
End With
Set tc=ActiveDocument.Tables(TextBox1.Value)
For b=1 To tc.Columns.Count
For a=2 To tc.Rows.Count
cel=tc.cell(a,b)。Range.Text
If cel Like"*####*"Then'判断是否需进行三位分节
If celLike"[-0-9]*[.][0-9]*"Then'小数
arr=Split(cel,".")
Do While regex1.test(arr(0))'小数点左边
arr(0)=regex1.Replace(arr(0),"$1$2")
Loop
Do Whileregex2.test(arr(1))'小数点右边
arr(1)=regex2.Replace(arr(1),"$1$2")
Loop
cel=arr(0)&"."&arr(1)'合并
Else'整数
Do While regex1.test(cel)
cel=regex1.Replace(cel,"$1$2")
Loop
End If
tc.cell(a,b)。Range=cel
End If
Next a
Next b
End Sub
需要注意的是,由于三位分节难以区分年份等特殊情况,编辑应注意调整,当然也可以通过对特定的列进行三位分节,由于我们在实践中较少遇到,为简化操作程序未进行设置。
2.4 单位提取
在编辑稿件时常会遇到如图5中上表所示单位在表身中的情况。根据量与单位表达的标准化形式,本文利用正则表达式“^(\-?\d*\s?\d*\s?\d+\.?\d*\s?\d*\s?\d*)\s?([A-Za-z\%万亿元]+.+)”进行匹配并分别实现数据与单位的提取,将提取的数据替换原表身中信息,将单位插入栏目中,表格处理后如图5中下表所示。

图5 单位提取示例
具体实现方法为双击“单位提取”按钮,输入如下代码:
Private Sub CommandButton5_Click()
Dim c%,d%
Dim td As Table
Dim ce1,ce2
Dim da
Dim regex3 As Object
Set regex3=CreateObject("VBScript.RegExp")
With regex3
.Global=True
.Pattern="^(\-?\d*\s?\d*\s?\d+\.?\d*\s?\d*\s?\d*)\s?([A-Za-z\%万亿元]+.+)"
End With
Set td=ActiveDocument.Tables(TextBox1.Value)
Ford=1 To td.Columns.Count
For c=2 To td.Rows.Coun
tce1=td.cell(c,d)。Range.Text
If regex3.test(ce1)Then
ce2=regex3.Replace(ce1,"$1")'提取数据
da=regex3.Replace(ce1,"$2")'提取单位
td.cell(c,d)。Range=ce2
End If
Next c
If regex3.test(ce1)Then
td.cell(1,d)。Range.InsertAfter"/"&da'栏目中插入单位
End If
Next d
End Sub
需说明的是,对于提取至栏目中相除或相乘的组合单位,编辑需按照组合单位的构成规则进行格式调整,该方法适用于不是以幂次表示的数据形式。
2.5 表序与文中提及校验
稿件中有时会出现表格重复编号或漏编号的情况,编辑需要对每篇稿件检查表格序号的连续性,同时还需核实文字中是否有对各表格的描述。本文在文献[6]中对表序突出显示的基础上,进一步自动化实现对表序连续性与是否在文中提及的判断与提示。
实现思路为:先判断表格编号的连续性,如果不连续,则提示未见的表格编号并退出程序,如果连续,则再以字典对各表序出现的次数进行统计,<2次则提示表格未在文中提及,≥2次则视为表格已在文中提及。具体实现方法为双击“表序与文中提及校验”,输入如下代码:
Private Sub CommandButton6_Click()
Dim D1 As Object
Dim i%,j%,Flag%
Application.ScreenUpdating=False
For i=1 To ActiveDocument.Tables.Count'表序连续性判断
ActiveDocument.Tables(i).Range.
Previous(wdParagraph,2).Select'选取中文标题,若无英文标题,其中2改为1
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text="表"& i
.Replacement.Text=""
.Forward=True
.Wrap=wdFindContinue
End With
Selection.Range.HighlightColorIndex=wdRed
Selection.Find.Execute
IfSelection.Find.Found=False Then
MsgBox"未见表"&i&",请检查表序"
Exit Sub
End If
Next i
Selection.HomeKeyUnit:=wdStory
Set D1=CreateObject("Scripting.dictionary")
Flag=0
With Selection.Find
.Text="表^#"
.Replacement.Text=""
.Forward=True
.Wrap=wdFindContinue
End With
Do WhileSelection.Find.Execute
Selection.Range.HighlightColorIndex=wdYellow
D1(Selection.Text)=D1(Selection.Text)+1'统计表序出现次数
Loop
For j=1 To ActiveDocument.Tables.Count
If
D1("表"&j)<2Then
MsgBox"表"&j&"未在文中提及"
Flag=1
End If
Next j
If Flag=0 Then
MsgBox"表格按顺序编号且均已在文中提及"
End If
Application.ScreenUpdating=True
End Sub
选择3篇稿件,分别为无编号为表3的表格(实际为2个表格重复编号为表4)、表格按顺序编号但表2未在文中提及、表格按顺序编号且均在文中提及,点击“表序与文中提及校验”按钮,消息框分别提示“未见表3,请检查表序”“表2未在文中提及”“表格按顺序编号且均已在文中提及”,验证了该功能的有效性。
3 结束语
编校是一项繁琐且重复性很高的工作,探索编校功能的自动化实现有助于提高编辑工作效率以及提升期刊质量。本文基于Word VBA编程自动完成一系列表格编校工作,包括表格转置、表格中求和数据的校验、数据三位分节、表身中单位的提取、表格顺序及在文中提及的校验。实践工作表明,该表格窗口极大节省了编校时间,提高了编校质量。
4 参考文献
[1]国家新闻出版署.报纸期刊质量管理规定[EB/OL].[2021-01-10].http://www.nppa.gov.cn/nppa/con-tents/279/74416.shtml
[2]刘铁英,黄春燕,程爱婕,等.稿件中不规范用词快速修订或标注方法[J].编辑学报,2015,27(3):273
[3]郑小光,田旭,张强.基于WORDVBA及宏的计算机辅助编辑加工[J].编辑学报,2017,29(增刊1):89
[4]崔玉洁,文娟,廖坤,等.基于WordVBA技术的一键智能编校系统[J].编辑学报,2018,30(6):624
[5]陈浩元.科技书刊标准化18讲[M].北京:北京师范大学出版社,1998
[6]毛星,李艳娜,董里.基于WordVBA的科技论文自动编校技术[J].天津科技,2020,47(1):98
[7]龙马高新教育.VBAOffice从新手到高手[M].北京:人民邮电出版社,2015