ExcelVBA程序开发自学通2020-3-18第1页/共471页入门篇:VBA优势、功能与概念第一章从Excel插件认识VBA简单的说,ExcelVBA是依附于Excel程序的一种自动化语言,它可以使常用的程序自动化,类似于DOS(磁盘操作系统)中的批处理文件(后缀名“.bat”)。那么它有什么具体的功能?在工作中与常规操作方式相比,具有哪些优势?笔者试图通过一个简单却实用的插件来展现。本章要点:从身份证号获取个人信息在工作中如何发挥Excel插件的优势1.1从身份证号获取个人信息制作人事资料时,通常需要录入职员身份证号码,以及生日、年龄、性别等等。除身份证号码需要手工逐一录入以外,其它三项信息的录入有四种方法:手工录入、内置公式、自定义函数法、插件法。手工输入方式效率极差,且出错机率也最高,本节通过后三种方式来实现并比较,从而让读者对VBA之优势与用法得以初步认知。1.1.1常规公式法以图1.1数据为例,利用公式从身份证中提取生日、年龄、性别等信息,可以有多种方法。本例列举其中之一。图1.1根据身份证号提取职工年龄、生日与性别通过公式计算职工的年龄、出生日期与性别,步骤如下:(1)在单元格C3输入以下公式,用于计算年龄:=DATEDIF(DATE(MID(B3,7,4-(LEN(B3)=15)*2),MID(B3,11-(LEN(B3)=15)*2,2),MID(B3,13-(LEN(B3)=15)*2,2)),NOW(),Y)(2)在单元格D3输入以下公式,用于计算出生日期:=TEXT(RIGHT(19&MID(B3,7,LEN(B3)/2-1),8),#年##月##日)(3)在单元格E3输入以下公式,用于计算性别:=IF(ISODD(MID(B3,15,3)),男,女)ExcelVBA程序开发自学通2020-3-18第2页/共471页注意:在Excel2003中,ISODD函数默认状态下无法使用,需要加载“分析工具库”才可以正常使用,为了使公式通用,通常改用MOD函数。即公式改为:=IF(MOD(MID(B3,15,3),2),男,女)(4)选择C3:E3区域,将公式向下填充即完成身份证信息提取。效果如下:图1.2公式法获取身份证信息点评:相对于手工输入法,利用公式从身份证号码获取个人信息有着效率更高、错误率更低之优点,人员越多时越能体现出其高效优势。本例文件参见光盘:..\第一章\提取身份证信息.xlsm1.1.2自定义函数法自定义函数是指利用VBA编写的外置函数。在本例的随书光盘中已经录入了相关的VBA代码,可以随时调用。对于代码的含义和录入方式在后面的章节后有详细介绍,本章仅通过具体应用了解其用法与优势。具体操作步骤如下:(1)进入“自定义函数法”工作表;(2)在C3:E3区域分别输入以下三个公式,用于计算年龄、出生日期和性别:=SFZ(B3,NL)=SFZ(B3,SR)=SFZ(B3)或者=SFZ(B3,XB)(3)选择C3:E3单元格,将公式向下填充,结果见图1.3所示。图1.3自定义函数法获取身份证信息本例中的函数SFZ即身份证函数,用于从身份证号码中获取年龄、生日与性别等信息。它不属于Excel内置函数,需要利用VBA编写代码才可以使用。读者可以从随书光盘中获取该完整代码。ExcelVBA程序开发自学通2020-3-18第3页/共471页SFZ函数有两个参数,第一参数为单元格引用,第二参数为信息描述,即用于指定需要获取身份证中哪一部分信息。当它为“NL”(不区分大小写)时,获取年龄;当它为“SR”时,获取生日,当它为“XB”或者省略第二参数时,获取性别。点评:相对于内置函数法/公式法,自定义函数法是借用VBA编写的外置函数完成,它的优势在于公式简短,且容易理解。任何不熟悉函数与VBA者皆可一分钟内学会操作并理解其公式含义。1.1.3插件法插件法是指借用Excel插件操作工作表,该插件不隶属于当前工作簿,但却可以实现与当前工作簿交互的功能,批量、迅速完成身份证信息提取工作。操作步骤如下:(1)关闭Excel程序的前提下,将随书光盘中的插件(位置:..\第一章\批量获取身份证信息.xlam)复制到以下自启动文件夹中即安装完成:C:\ProgramFiles\MicrosoftOffice\Office12\XLSTART注意:如果您的OFFICE没有装在C盘,那么上面的磁盘号需要根据实际情况做修改;如果您使用OFFICE2003,则将其中“Office12”修改为“Office11”。(2)打开光盘文件“提取身份证信息.xlsm”,进入“插件法”工作表;(3)选择单元格区域B3:B6,单击右键,从右键中选择【批量获取身份证信息】菜单,程序将弹出一个对话框“确定计算区域”。该对话框中默认显示当前选区地址,如果需要修改地址,可以输入新的地址,也可以用鼠标在工作表中选择身份证存放区域,该区域的地址会自动产生在对话框中。见图1.4所示;(4)单击“确定”按钮,程序在瞬间就会从选区的所有身份证中提取年龄、生日和性别等信息。图1.4插件法批量获取身份证信息点评:插件法从身份证号码中获取信息的优点是速度快,通用性好。相对于内置函数法,它在操作上更简单,不需要任何函数知识,不需要输入长长的公式,只点几次鼠标即可;相对于自定义函数,它的优点是通用性好,在任何工作表、任何工作簿皆可使用本工具。而前一方法之自定义函数非插件方式存在,只能在当前工作簿中使用。ExcelVBA程序开发自学通2020-3-18第4页/共471页1.1.4浅谈VBA优势前面三个案例中我们可以看出,Excel具有强大的计算功能,但常规方式对于某些大型数据运算显得比较繁琐。用户需要学习复杂的函数知识,设置长长的公式才可以解决某些运算。而VBA可以使公式简化、易懂,甚至根本不需要公式,一个字母不用录入即可完成一些专业性较强的计算。具体说来,相对于Excel自带的功能,VBA或者说VBA开发的插件具有以下优势:批量地对操作对象进行数据处理以前一节插件法完成身份证信息进行例证,它可以瞬间完成多个单元格数据的运算,甚至多个工作表中存放的身份证号码也可瞬间完成信息提取。较传统的逐一处理方式在效率上有大幅提升。多任务一键完成多任务是指对同一个对象需要进行多个操作,例如前一节是从身份证号码中获取三类信息,VBA可以单击一个按钮后瞬间完成,完全感觉不到它在分三步逐一完成任务。这是高效办公地最佳体现。将复杂的任务简化Excel是很多很多小工具的综合体。这些工具可以嵌套运用,完成更强大的数据处理。但当嵌套过多时,就需要用户要较深的功底才能操纵或者理解。另一方面,对于某些特殊行业的工作、任务,也要经过很复杂的操作才可以完成,而对于某些只需要应用不需要深入研究、理解的普通办公文员们来说是一个技能考验。而通过VBA进行二次开发可以将复杂的任务变得更简单。简单是指理解和操作上同时简化。就像1.1.3节中通过右键菜单提取身份证号码三类信息一样,不需要用户去录入长长的公式,以及理解信息是如何提取出来的,单击菜单即可完成。再如企业中生成工资条,10000个人的资数用手工操作需要处理10000*N次,而利用Excel插件可以单击按钮完瞬间成。将工作表数据提升安全性利用VBA代码可以对数据进入多层保护,在某些特殊需求下,VBA可以保护数据让普通用户无法胡乱修改,或者不小心破坏数据及数组结构。提升数据准确性准确性体现在数据录入和数据运算两方面。首先,通地VBA对输入的数据进入限制,可以防止用户意外录入不规范字符。如数字中有两个小数点,或者录入数值时不小心录入了标点或者字母,造成无法计算或者漏算。其次,在数据运算时,人工设置大量公式,或者每天在不同地方重复录入同一个公式。在大量地操作中难以避免不产生一次错误。而利用VBA可以让工作简化,工作量越小,出错的机率一定越小;同时,在大量重复性工作中VBA可以确保不产生错误。完成Excel本身无法完成的任务弹出提示、警告对话框、行程安排与预告,或者到磁盘中查找需要的数据、修改注册表等等,Excel常规方式是不可能完成的。如果需要类似功能,VBA完全可以胜任。开发专业程序利用VBA还可以开发一些专业型的程序,如报表汇总软件、进销存管理系统、人事管理系统等等,可以将界面设置成其它任何软件的显示方式媲美专业的程序软件ExcelVBA程序开发自学通2020-3-18第5页/共471页1.2插件特点及其如何发挥插件的优势在前一节中,通过一个身份证信息获取的插件认识了Excel插件,那么在工作中应如何发挥Excel插件的优势呢?1.2.1Excel插件的特点Excel插件是利用VBA程序开发的外置工具,通常是xla、xlam格式或者dll格式。其中xla和xlam插件直接用Excel就可以开发,而dll插件通常采用VB或者C++来编写。不管何种软件开发的插件,它都需要在外观和功能两方面具有某些特征,以方便用户调用。1.外观特征有若干个菜单或者工具按钮在插件封装后,调用其代码有两种方式:用代码调用,用菜单或者工具栏按钮,显然菜单更方便。用户通过菜单单击即可完成相对于常规方式较复杂的操作或者运算。利用窗体实现与工作表数据交互在弹出的窗体中可以调用工作表的数据,也可以将窗体中录入的数据导到工作表。而在窗体中录入数据时,相对于工作表中录入数据,可更好地控制。例如某个文字框中可以指定只能录入数字,而另一个文字框可以指定只能入日期。也可以设定录入某项目后自动跳转到指定目标位置,而不用手动去移动光标插入点。甚至可以在录入时核对是否与工作表中数据是否重复等等……有一个帮助界面对于开发者来说,不管自己开发的工具如何简单,都有必要向用户说明其功能和操作方式。所以在工具中通常加入一个窗体,进行文字说明或者动画演示。特别是工具没有提供菜单、而是通过函数调用或者快捷键调用时,更需要一个说明窗体。对函数做参数说明对于函数类插件,必须对每个函数的参数进入详细说明,让用户插入函数时可以清晰明了地看到每个函数中每个参数的功能与使用方式。2.功能特征Excel插件中的代码和普通宏程序的代码在编写上具有一些差异,这是它们的设计目的不同造成的。其中宏代码通常用于解决某个具体的问题,它可能限用一次,也可能需要反复调用。但都只为解决自己的某个具体问题而录制。而开发Excel插件则通常是开发者开发后,给其他的终端用户使用。用户不确定,需要操作的区域对象不确定。所以插件有不同的需求,它需要具有以下特征:没有具体的区域地址由于开发插件通常是给其他的终端用户使用,所以不能指定数据区域地址,而是提供一个自由选择目标区域的选择对话框,或者利用代码计算目标工作表中的待计算区域。这是和录制宏最大的差异。不使用具体的工作表名或者工作簿名原理与前一条一致。必须有通于菜单或者窗体供用户调用命令,而不是在工作表中建立按钮来调用命令。dll格式的插件不存在工作表,而xla和xlam格式插件的工作表是隐藏状态,工作表不可能在用户的界面呈现出来,所以必须建立一个通用的菜单栏,使其在打开任意工作簿都会显示出来供用户操作。如果使设置了快捷键,那么是可以不用菜单或工具栏的,界面将会更简洁。ExcelVBA程序开发自学通2020-3-18第6页/共471页尽可能提供自定义选项插件的针对性不强,即它需要有广泛性。插件通常不是为某一个固定用户开发,或者需要处理的数据并非永远一致,那么在不同用户使用同一功能时,需要有自定义其参数或者选项的空间,工具才能有更好的通用性。例如设计一个工资条制作插件,那么工资条的表头行数就有必要让用户选择,而非强制一行或者两行。这和编写一个解决临时性问题的编程思路不同。具有多版本适应能力目前办公用户使用的Excel版本差异很大,有Excel2000、ExcelXP、Excel2003,也有Excel2007。开发者不会假定用户都用某个版本的Excel,而是通过代码判断当前用户的版本号,然后调用不同的代码,以适应当前版本,否则某些功能可以无法使用。防错机制自用型宏程序通常不用防