1 引言
在日常工作中,由于信息化安全保密管理体系的要求,每一台信息化设备和办公自动化设备都要进入信息化系统台账,由此产生了大量的设备申请单、设备准入单、设备维修单、基本信息变更单、重装操作系统等单据,且每一张表单都需要各部门领导、信息化部门领导、所领导等进行电子会签。这些表单实时存储在保密管理系统中,在定期或保密检查时需要进行归档整理,并输出成册。因此,输出状态是阶段性集中输出。之前主要采用人工截取、单表单审批输出的方式。由于表单数量较多、格式复杂,并具有输出要求时间紧、准确率高等特征,采取人工的方法输出表单生成工作量大、故障率高、审批量多,在短时间难以保质、保量完成。因此,如何优质、高效地完成信息化管理工作中审批表单归档业务工作,提高精细化管理程度,成为信息化管理工作人员当前的专研课题。
本文即通过对Excel办公软件的研究,利用其提供的开发接口,采用VBA技术,将信息化管理工作的功能性要求通过编程将其加载进Excel系统,实现表单合并,使内容不同的多份Excel表单自动合并,并进行自动排序,自动进行打印排版。具体实现方法如下。
2 基于VBA的Excel数据处理方法
2.1 Excel在处理数据表单工作中存在的基本问题
Excel是Microsoft Office的组件之一,是一种功能完备,技术先进和使用方便的电子表格软件,具有灵活的表格数据处理和完善的表格编辑管理功能,形式多样的表格设置和丰富的多色的图标功能。利用Excel不仅能够直观、快捷、方便地输入和管理各种各样表格形式的数据,还能对数据进行分析、统计和处理。
基于保密管理系统输出表单自身格式的特点,输出表单并不能自动进行表格的整理、输出、打印。它只能将表格统一进行导出成Excel格式,导出Excel的业务表单类多,样式复杂,表单零散,这些表单具有以下特点:
(1)数据表格包含大量的合并单元格。
(2)这些单元格因为需求大小,形状各不相同,单元格大小自然要依据数据项的内容变的各不相同。
若此时直接打印,每张表单的打印需要部门领导进行一次审批,打印前需要申请人进行刷卡,这样打印、输出、整理工作就成为非常复杂、繁重的体力劳动,导致整个部门的工作效率下降。如果人为进行表单合并和整理,虽然减少了审批和刷卡次数,但是将工作量和流程压缩到表单合并、整理工作上,要在极短的时间内完成此项工作,也是一个在精力和体力上极具挑战的工作,而且难以保证快速、高效地完成任务。
2.2 VBA简介
VBA是Visal Basic for Application的简称,是一种可视化的、面向对象的机构化高级程序语言,具有和Visual Basic相同的语言功能,主要用来扩展Microsoft Office软件应用程序功能。利用VBA来编制程序,嵌入到Excel中,可以创建个性化、定制化的解决方案,实现一些复杂事件的自动处理。
前面提到的表单,可以利用VBA编制程序完成其特殊的表单合并、排版工作,并且自动适应其多样化的表单合并,减轻劳动者的负担,节约劳动者的时间。
2.3 设计思路
2.3.1 问题分析
对前面提到的特殊表单进行分析,可以得知表单中的具有存在以下特点:
(1)表单中用于存放数据的单元格包括合并单元格和非合并单元格。
(2)表单中用于存放数据的单元格大小不尽相同。
(3)不同种类的表单格式并不相同。
(4)某些表单数据内容多,存在多页显示的问题,表单内容页码的不统一性。
2.3.2 设计方案
面对以上的特点,编写VBA程序需要从以下几个方面进行:
(1)自动检索出完整表单范围大小,并选择识别出的范围。
(2)自动识别合并表单的准确位置,防止数据覆盖现象。
(3)合并表单中,每个合并来的表单要新起一页粘贴,使得表单整齐划一,美观大方。
(4)自动识别不同的表单格式,使其满足表格整理打印要求。
在编制程序时,依据表单的数据将表单分为两类:表单数据分为单页数据及多页数据数据表单,表单还需要按照日期进行排列。这两种情况在合并表单时考虑和处理方法有所不同,以下是具体分析。
将文件排序,根据表单日期,对表单重新排序,并将文件重新按照拷贝顺序进行排列,根据拷贝顺序,对表单进行拷贝。识别出拷贝表单数据的大小,只对数据表单实际使用范围进行拷贝并不是所有Excel的sheet工作区进行拷贝,这个概念不仅是合并表单工作是否成功的关键,而且增加了数据的处理速度。准确定位合并表单的拷贝位置,防止表单数据覆盖和大量空行现象。
2.4 解决问题
编写VBA程序解决Excel中的问题,处理Excel中的数据需要使用Excel对象。在Excel对象模型中最用常用的对象:Workbook表示一个工作簿,Worksheet表示一张工作表,Range表示一个区域。在文件中要处理的数据表格一般处于正在编辑的状态,即数据表格所在的工作表为活动工作薄中的活动工作表,因此可以用ActiveSheet返回数据表格所在工作表的Worksheet对象。然后是用Workbook.Cell(RowIndex,ColumnIndex)获取此工作表中的单元格。用Range.Row.Count获取表格的行数,以避免对表格外的行进行无意义的搜索而浪费时间。
对于好几百的单独表单进行合并,合并成一个适合蓝波系统打印、布局合理的打印文件,应有解决以下问题:
确定合并表单原有数据范围ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column。
通过Range(aaa(i)).End(xlUp).Row某列数据最大实际使用行数,再利用循环比较法得出最大使用行数。
在每个表单数据的末尾直接插入分页符ActiveSheet.HPageBreaks.Add Range("A"& Max),确保新合并进行来新表单都是新起一页。
合并后的文件具有以下特点:
(1)页面布局合理,页面格式,样式统一,美观大方,和单独打印单张表单的形式一致。
(2)合并表单需要按照日期对表单进行排列,打印后直接进行装订,无须人工再次进行表单排序工作。
(3)保证每个表单的数据是完整的,具有单独打印分表的特点。
确定合并表单原有数据具体大小,示例代码如下:
aaa = Array("A65536", "B65536", "C65536", "D65536", "E65536", "F65536", "G65536", "H65536", "I65536", "J65536", "K65536", "L65536", "M65536", "N65536", "O65536", "P65536", "Q65536")
Max = Range(aaa(0)).End(xlUp).Row
For i = 0 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
If Range(aaa(i)).End(xlUp).Row > Max Then Max = Range(aaa(i)).End(xlUp).Row
Next
确定数据具体大小后需要进行数据拷贝工作,拷贝过程中需要得到合并文件路径名称,并得到要拷贝表单的文件路径名称,并实现拷贝工作。示例代码如下:
Application.ScreenUpdating = False
MyPath = ActiveWorkbook.Path
MyName = Dir(MyPath &""&"*.xls")
AWbName = ActiveWorkbook.Name
If MyName <> AWbName Then
Set Wb = Workbooks.Open(MyPath &""& MyName)
With Workbooks(1).ActiveSheet
Wb.Sheets(1).UsedRange.Copy
Windows(AWbName).Activate
Cells(Max, 1).Select
ActiveSheet.Paste
WbN = WbN & Chr(13) & Wb.Name
Num = Num + 1
aaa = Array("A65536", "B65536", "C65536", "D65536", "E65536", "F65536", "G65536", "H65536", "I65536", "J65536", "K65536", "L65536", "M65536", "N65536", "O65536", "P65536", "Q65536")
Max = Range(aaa(0)).End(xlUp).Row
For i = 0 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
If Range(aaa(i)).End(xlUp).Row > Max Then Max = Range(aaa(i)).End(xlUp).Row
Next
Max = Max + 1
ActiveSheet.HPageBreaks.Add Range("A"& Max)
Application.CutCopyMode = False
Wb.Close False
End With
End If
3 结论
经过多次调试和试验证明,通过以上方法可以方便地利用VBA实现同批、同类信息化管理审批表单所有表格的合并。该方法操作简单,自动化程度非常高,提高了工作效率和工作质量,也为更好地实现信息化管理工作中数据处理自动化提供了解决思路。
参考文献
[1]庄东填 利业鞑 Excel 2007中文版实用教程[M].北京:中国水利水电出版社,2008.
[2]许小荣,夏跃伟,高翔. Excel VBA语法与应用手册[M].北京:电子工业出版社,2010.
(作者系中国船舶重工集团公司第760研究所信息管理中心工程师)