欢迎来到学术参考网

利用VBA实现Excel的自动化处理

发布时间:2015-09-10 09:24

摘 要:摘 要:Excel作为一种办公软件,在数据处理与统计方面具有强大的优势。但是若要把多个或上百的数据进行合并处理,Excel就不能很好的满足用户的这种需求。本文详细介绍了VBA技术及其应用,并针对Excel应用中出现的数据处理问题进行分析,给出相应的解决措施。

关键词:关键词:VBA;Excel;数据处理


中图分类号:TP317     文献标识码:A    文章编号:
    0 引言
    在日常工作中,使用Excel软件进行数据分析、统计和处理时,经常需要对一些表格进行合并等,以便进行统计分析工作。如果报表内容较少、格式简单、时间宽裕等要求不高,可以采用人工方式完成工作。但如果报表内容较多、格式复杂、时间紧迫、准确率要求高等,采用人工的方法将在短时间内无法完成,因此如何Excel软件自身缺陷,提高工作效率,成为工作中的一个难题。
本文即通过对VBA的研究,介绍如何使用VBA开发数据汇总工具,实现格式相同,内容不同的多份Excel数据的自动汇总并自动排序工作。
   1. 基本问题
    1.1  Excel 使用问题
    Excel是Microsoft Office的组件之一,是一个功能完备、技术先进和使用方便的电子表格软件,它具有灵活的表格编辑和完善的管理功能,形式多样的格式设置和丰富多彩的图表功能。利用Excel,我们不仅能够直观、快捷、方便地输入和管理各种各样表格形式的数据,还能对数据进行分析、统计和处理。
    在使用Excel制作数据表格时,通常会利用其自动扩展或填充序列的功能,完成对整个表格的数据编制序号及修订序号。但是使用此功能时有一个前提,就是整个表格,特别是填写序号的列无合并单元格或合并单元格具有相同的大小。
    一般情况下制作的数据表格都能满足这个前提。但是在使用中会因为一些特殊需要,制作的数据表格无法满足这个前提,特殊表格包含以下两个方面:
    (1)制作的数据表格中包含大量的合并单元格;
    (2)这些单元格因为需要大小、形状各不相同,填写序号的单元格大小自然要依据数据项的内容变的各不相同。
    此时编制序号和重排序号就成了一项手动劳动,特别在数据量巨大时,每次因数据项变动而重排序号就显得特别繁琐并耗费劳动者大量的时间。
    1.2  VBA 简介
    VBA是Visual Basic for Application的简称,是一种可视化的、面向对象的结构化高级程序设计语言,具有和Visual Basic相同的语言功能,主要用来扩展Microsoft Office软件的应用程序功能。利用VBA来编制程序,嵌人到Excel中,可以创建自定义的解决方案,实现一些复杂数据的自动处理。
    面对前面提到的特殊数据表格,可以利用VBA编制程序,完成其特殊的序号填充算法,减轻劳动者的负担,节约劳动者的时间。
    2. 设计思路
    2.1  问题分析
    对前面提到的特殊数据表格进行分析,可以得知填写序号的列中单元格存在以下特点:
    a) 用于填写序号的单元格包括合并单元格和非合并单元格;
    b) 用于填写序号的合并单元格的大小不尽相同;
    c) 用于填写序号的单元格间存在不参与编写序号的单元格。
    2.2  设计方案
   面对以上特点,编写的VBA程序需从以下几个方面进行:
    a) 能够自动对序号进行填写并累加;
    b) 能够识别合并单元格范围内不显示的单元格;
    c) 能够甄别需填写序号的单元格和不填写序号的单元格。
    在编制程序时,依据数据表格中序号列的填充情况可分为两类:所有的用于填写序号的单元格已填写序号及未填写序号,即重排序号和编制序号。两种情况下所需考虑和处理的内容略有不同,以下进行具体分析。
    重排序号时,所有的用于填写序号的单元格已填写序号。此时,可以将用于填写序号的单元格内填写的原序号作为标志,用以区分用于填写序号的单元格和不参与编写序号的单元格。因此在编写程序时只需找到填有原序号的单元格,填入新的序号即可完成重排编号。
   编制序号时,由于用于填写序号的单元格为空的,所以没有像重排序号时那样的标志可以借用。因此在编写程序时需要对合并单元格和不参与编写序号的单元格进行考虑,加入分析代码进行甄别。
    3. 解决方案
    编写VBA程序解决Excel中的问题,处理Excel中的数据需使用Excel对象。在Excel对象模型中最常用到三个对象:Workbook表示一个工作簿,Worksheet表示一张工作表,Range表示一个区域。在本文中要处理的数据表格一般处于正在编辑的状态,即数据表格所在的工作表为活动工作簿中的活动工作表,因此可以用ActiveSheet返回数据表格所在工作表的Worksheet对象。然后使用(RowIndex, ColumnIndex)获取此工作表中的一个单元格。在Excel对象模型中RowIndex和ColumnIndex均开始于1,即(1, 1)表示“A1”单元格。在逐行搜索用于填写序号的单元格时,可以先用nge返回数据表格所占用的区域的Range对象,再用获取数据表格的行数,以避免对表格外的行进行无意义的搜素而浪费时间。
    对重排序号编写程序,主要是搜索填有原序号的单元格。作为序号应有两个特点:
    a) 处在同一列,一般在第一列,即ColumnIndex为1;
    b) 数据类型为数字,VBA中使用IsNumeric函数进行判断。
    因此只需遍历工作表中第一列的所有行,找出其中为数字的单元格并赋值即可完成对序号的重排。
    但是这里会出现一个问题:在进行数据类型为数字的判断时,空单元格会当作数字“0”被误判为数字,引起序号计算错误。在合并单元格范围内中,被合并的单元格均为空单元格。为消除这个错误,需增加一个对空单元格的判断,使用IsEmpty函数判定其为空单元格并剔除之。
    完成重排序号任务的示例代码如下:
num = 0
For i = 1 To
cell = (i, 1)
If IsNumeric(cell) And Not IsEmpty(cell) Then
num = num + 1
(i, 1) = num
End If
    Next
    对编制序号编写程序,由于无法搜索具有数据类型为数字的单元格,使得判断条件较为繁琐一些。主要对单元格是否填写序号进行判断,其内容为:
    a) 此单元格不为不参与编号的特殊行,判断条件为单元格内填有数字或为空单元格,可以使用IsNumeric函数同时完成数字或空的判断,将填有其它数据的行剔除;
    b) 此单元格在数据行,判断条件为同行的其它单元格包含数据,即不为空单元格;
    c) 此单元格不为合并单元格范围内的被合并单元格,使用MergeCells判断是否为合并单元格,并使用MergeArea获得合并单元格区域,然后比 较此单元格和合并单元格区域的首单元格地址,确定用于填写序号的单元格。
    在进行完以上判断后,将序号逐次填入符合条件的单元格中即可完成对序号的编制。该任务的示例代码如下:
num = 0
    For i = 1 To
cell1 = (i, 1)
cell2 =(i, 2)
If IsNumeric(cell1) And Not IsEmpty(cell2) Then
If (i, 1).MergeCells Then
ad1 = (i, 1).Address
ad2 = (1, 1).(1, 1).Address
If ad1 <> ad2 Then Next
            End If
num = num + 1
(i, 1) = num
        End If
    Next
   4. 结论
    经过多次调试和试验证明,通过以上方法,可以方便的利用VBA实现Excel工作薄中的数据处理。该方法操作简单,自动化程度高,提高了工作效率,也为实现更多的自动化办公提供了解决的思路。
参考文献:
[1]王斌,吴磊.中文版Excel 2003实用教程[M].北京:清华大学出版社,2007.
[2]许小荣,夏跃伟,高翔.Excel VBA语法与应用手册[M].北京:电子工业出版社,2010.


 

上一篇:IT项目的企业人力资源管理

下一篇:统一身份认证在高校中的应用与实践