Excel VBA 从入门到精通
2018-04-25 17:31:37 83 举报
AI智能生成
《Excel VBA 从入门到精通》是一本系统全面讲解Excel VBA编程的教程,适合初学者和有一定基础的用户。全书分为基础篇、进阶篇和实战篇三部分,逐步引导读者掌握VBA的基本语法、常用函数、对象操作、事件处理等知识。通过丰富的实例和案例分析,帮助读者深入理解VBA编程思想,提高编程能力。此外,本书还介绍了如何在Excel中利用VBA实现自动化办公、数据分析等功能,使读者能够将所学知识应用于实际工作中,提高工作效率。《Excel VBA 从入门到精通》是学习Excel VBA编程的理想教材,也是提升个人技能的必备工具书。
作者其他创作
大纲/内容
十、使用VBA代码管理单元格
10.1 认识单元格对象
10.2 单元格引用
10.3 直接获取单元格信息
10.4 编辑单元格
10.5 设计表格格式
10.6 实例延伸
十一、Excel数据高效能处理
11.1 使用Name方法自定义名称
11.2 数据的排序与筛选
11.3 使用图形分析单元格数据
11.4 使用Windows对象操作窗口
11.5 批注的导入与导出
11.6 实例延伸
十二、图表与数据透视表的程序设计
12.1 使用Char对象创建图表
12.2 自动设置图表对象格式
12.3 使用辅助结分析图表
12.4 使用PivotTable对象创建动态图表
12.5 实例延伸
十三、随心所欲地使用对话框
13.1 使用用户窗体自定义对话框
13.2 实例延伸
十四、使用控件创建文件系统
14.1 认识控件
14.2 设置控件属性
14.3 为控件指定宏
14.4 实例延伸
十五、自定义菜单栏和命令栏
15.1 使用Excel VBA代码自定义菜单命令
15.2 新建选项卡和组
15.3 实例延伸
十六、员工档案与薪资管理系统
16.1 员工资料登记系统
16.2 员工工资管理系统
十七、问卷调查系统
17.1 设计新产品网络问卷调查
17.2 自动统计调查结果并创建分析图表
17.3 自动生成新产品市场调查报告
一、了解VBA开发平台
1.1、Excel 2010VBA的新增功能与名词解释
1.1.1、VBA 与VB的区别
名称 VB VBA<br>语言特性 计算机编程语言 自动化语言<br>开发环境 拥有独立的开发环境 依赖于已有的应用程序<br>运行条件 能够独立运行 需要EXCEL等应用程序的支持<br>用途 用于创建标准的应用程序 用于使用已有的应用程序自动化
1.1.2、新增功能
1、新增加条件格式对象
1、ACtion 代表要在数据透视表中执行的操作
2、Chartview 代表图表的视图
3、ColorScale 代表色阶条件格式规则
4、Databar 代表数据条件格式规则
5、HeaderFooter 代表一个单独的页眉或者页脚
6、IconSetCondition 代表图标集条件格式规则
7、Tableatyle 代表可应用于表格的单个样式
2、新增应用程序属性
1、ShowDevTools 返回或者设置一个Boolean值,<br>该值表示是否在功能区中显示“开发工具”选项卡。可读写Boolean类型<br>
2、ShowMenuFloaties 返回或设置一个Boolean值,<br>该值表示当用户在工作簿窗口中按鼠标中键时是否显示浮动工具栏。可读写Boolean类型
3、ShowSelectionFloaties 该值 表示当用户选择文本时是否显示浮动工具栏。
4、MeasurementUnit 指定应用程序中使用度量单位
5、FormulaBarHeight 指定用户指定行中编辑栏的高度。
3、新增应用程序方法
1、ApplyCharTemplate 将标准图表类型或自定义图表类型应用于图表
2、ApplyLayout 应用功能区中显示的版式
3、ExportAsFixedFormat 用于将指定格式的文件导出
4、ModifyAppliesToRange 设置此格式规则所应用于的单元格区域
1.1.3、名词解释
1、对象 即讨论的实体,如控制项、工作表、工作簿、单元格等。
2、对象的属性 如单元格的字体格式、显示格式、填充背景、单元格高度和宽度等
3、对象的方法 如复制、粘贴等
4、集合 如workbook, Workbooks,worksheet,Worksheets,range,ranges等
1.2、VBE开发环境介绍
1.2.1、打开VBE开发窗口 Alt+F11
1.2.2、VBE窗口
1、属性窗口
2、代码窗口
3、立即窗口
4、对象浏览器窗口
5、监视窗口
1.3、工程资源管理器基本操作
1.3.1、添加模块
1.3.2、导出/导入模块
1.3.3、设置环境选项
1.4、调试程序
1.4.1、调试的相关概念
1、错误的类型
1、编译错误
2、运行时错误
2、中断
插入与清除断点
3、逐语句调试
1.4.2、编译
1.5、帮助文件获取
1.5.1、Ctrl+J 有助于选择需的属性和方法。
1.5.2、获取属性的相关参数:Ctrl+Shift+J
1.5.3、快速显示参数信息:Ctrl+I
1.5.4、设置代码缩进与凸出:Tab,Shift+Tab
1.5.5、保护VBA程序代码
二、宏的基本操作
2.1、认识宏
2.2、录制宏
2.3、执行宏
2.3.1、按快捷键执行宏<br>
2.3.2 通过“宏”对话框执行宏
2..3.3 在模块文件中执行宏
2.3.4 单击按钮执行宏
2.3.5 单击快速访问工具栏中的宏按钮执行宏
2.4 加载宏
2.4.1 提供了哪些加载宏
1 、加载的宏类型及其来源
1)Excel加载宏
2)Com加载宏
3)自动化加载宏
2、Excel中已有加载宏及功能
1)分析工具库
2)分析工具库-VBA函数
3)条件求和向导
4)欧元转换工具
5)Internet Assistant VBA
6)查找向导
7)规划求解
2.4.2 加载与卸载加载宏程序
2.5 宏的数字签名
2.5.1 数字签名及其创建
Microsoft Office工具-VBA项目的数字证书
2.5.2 对宏项目进行数字签名
打开VBE窗口:工具-数字签名
2.5.3 使用图章进行数字签名
插入-签章行:一旦修改,签章出现变化
2.6 其他操作
2.6.1 自行决定宏的保存位置
1、个人宏工作簿
2、新工作簿
3、当前工作簿
2.6.2 直接卸载加载宏
2.6.3 加载COM加载项程序
2.6.4 加载自动化加载宏
2.6.5 将宏模块复制到另一个工作簿中
直接拖动到另一个工程中即可
三、VBA的语法基础
3.1 VBA的优势
1、创建报表
2、对数据进行复杂的操作和分析
3、使重复的工作自动化
4、自定义工具栏、菜单和对话框
5、自定义Excel,使其成为开发平台
3.2 VBA字符集和标识符
1、用户指定的标识符
可以用来表示程序名、对象名、常量名、变量名等。<br>一般要“见名知意”。
1)避免命名冲突。
2)长度不能超过255个字符
3)首字母必须是英文或者汉字,名字中不能包含空格、句号、惊叹号,也不能包含字符@、&、$、#
2、关键字
VBA中有42个关键字是保留的,不能用于其他用途
3.3 VBA的常量
1、固有的常量或者系统定义的常量<br>如Color.Blue、Color.Red
1)通过前缀限定常量<br>以两个字符为前缀来指出定义这些常量的对象库。通常以混合大小写格式显示。
2)通过库引用限定常数
2、用户自定义常量
1)字符常量
2)符号常量
3、条件编译常量
声明格式<br><font color="#c41230">[public|Private] Const constname [As Type]=Expression</font><br><b><font color="#0076b3">Public:</font></b> 可选,在过程中不能使用、<br><font color="#0076b3"><b>Private</b></font>: 可选,该关键字用于在模块级声明只能在包含该声明的模块中使用的常数,不能在过程中使用。<br><b><font color="#0076b3">Constname</font></b>: 必选。是指常数的名称,需遵循标准的变量命名约定。<br><b><font color="#0076b3">Type</font></b>:可选,用于表示常数的数据类型,所声明的每个变量都要使用一个单独的As类型子句。<br><b><font color="#0076b3">Expression</font></b>:必选,其值可以是文字、其他常数或由除Is之外的任意算术运算符和逻辑运算符构成的任意组合。
3.4 VBA的变量
3.4.1 VBA变量的命名规则
1)第一个字符必须使用英文字母。
2)不能在名称中使用空格、句号、感叹号、或者@、&、$、#等字符。
3)名称长度不超过255个字符
4)使用的名称不能与系统本身的函数、表达式以及方法的名称冲突,而且不能与程序语言的关键字相同。
5)不能在相同层次范围内使用重复名称。
6)不区分大小写,它会保留在表达式声明时所用的大写字母或小写字母。
3.4.2 变量的类型
1、常见的基本类型
1)布尔型(<font color="#c41230">Boolean</font>)<br>其值只能是True或False。
例:使用布尔型存储显示逻辑值<br><b><font color="#c41230">sub a()<br>dim XL as Boolen<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>i=2<br>do<br>XL=sht.cells(i,3)>500<br>sht.cells(i,5)=XL<br>i=i+1<br>Loop until sht.cells(i,3)=""<br>end sub</font></b>
2)字节型(<font color="#c41230">Byte</font>)<br>存储单精度型、无符号整型、1个字节的数值形式,取值范围是0~255之间的无符号数。
3)货币型(<font color="#c41230">Currency</font>)<br>存储为8个字节,是整型的数值形式,是一种比例数据模型。<br>
4)日期型(<font color="#c41230">Date</font>)<br>占用8个字节,用来存储日期和时间的数据类型。<br>任何可辨认的文本日期都可以赋值给Date变量
例:使用变量存放日期。<br><b><font color="#c41230">sub a()<br>dim NowDate as Date<br>NowDate=Now()<br>msgBox "当前日期和时间为:“ & NowDate<br>end sub</font></b>
5)小数型(<font color="#c41230">Decimal</font>)<br>存储为12个字节带符号的整型形式,并除以一个10的幂数
6)双精度型(<font color="#c41230">Double</font>)<br>存储为8个字节的浮点数值。双精度型的声明字符是数字符号#。
7)整型(<font color="#c41230">Integer</font>)<br>存储为两个双字节的数值形式。<br>整型声明使用百分比符号(%)
8)长整型(<font color="#c41230">Long</font>)<br>存储为32位(4个字节)有符号的数值形式,长整型声明字符为和号(&)。
9)对象型(<font color="#c41230">Object</font>)<br>存储为4个字节的地址形式,其为对象的引用。利用Set语句声明为对象型的变量。
10)单精度浮点型(<font color="#c41230">Single</font>)<br>存储为4个字节浮点数值。其声明字符为感叹号(!)
11)字符串型(<font color="#c41230">String</font>)<br>有两种:变长字符串与定长字符串,其声明字符为美元符号($)
例:获取工作表名称<br><b><font color="#c41230">sub a()<br>dim MyName as string<br>i=1<br>for each one in worksheets<br> MyName=one.Name & ":" & MyName<br>next one<br>msgBox "工作簿中默认工作表名称:" & MyName<br>end sub</font></b>
12) 变体型(<font color="#c41230">Variant</font>)<br>未被显式声明的(如Dim、Private、Public或者Static)<br>其他类型变量的数据类型。可以用VarType()函数或TypeName()函数来决定如何处理变体型中的数据。
函数的语法格式:<br>TypeName(Varname)<br>VarType(varname)<br><b><font color="#c41230">varname</font></b>:为必选参数,实验室是一个Variant变量,包含用户定义的任何变量。
2、用户自定义数据类型
Type<类型名><br> <元素名1> As <类型1><br> <元素名2> As <类型2><br> ....<br> <元素名n> As <类型n><br>end Type
例:定义一个销售数据变量<br><b><font color="#c41230">Type SalesNum<br> S_Date as Date<br> S_No as Integer<br> S_Name as String<br> S_SaleNum as Single<br> S_Price as Currency<br>end Type</font></b>
3.4.3 声明变量
1、使用<font color="#c41230">Dim</font>语句声明变量
语法结构:<br><font color="#c41230">Dim [WithEvents] varname [([subsripts])] [As [new] type] [,[WithEvents] varname [([subscripts])] [As [new] type]]...</font><br><b><font color="#0076b3">withevents</font></b>:可选参数,可以声明任意个单变量,但不能声明数组,也不能和New一起使用<br><b><font color="#0076b3">VarName</font></b>:必要参数,指变量的名称<br><b><font color="#0076b3">Subscripts</font></b>:可选参数,表示数组变量的维数,最多可定义60多维数组。<br><b><font color="#0076b3">New</font></b>:可选参数,表示可隐式地创建对象关键字。<br><b><font color="#0076b3">Type</font></b>:可选参数,表示变量的数据类型,所声明的每一个变量都要有一个单独的As Type子句。
例:学习如何声明变量<br><b><font color="#c41230">sub a()<br>dim myString as string<br>dim myDate as Date<br>dim myDays as Integer<br>myString="2018-04-25+12"<br>myDate="2018/04/25"<br>myDays="30-11"<br>msgbox "变量myString的值:" & myString & chr(10)_<br> "变量myDate的值:" & myDate & chr(10)_<br> "变量myDays的值:" & myDays <br>end sub</font></b>
2、使用<font color="#c41230">Public</font>语句声明变量
语法结构同Dim。<br>在式个模块或者程序过程中调用同一个变量时,Dim语句声明不能达到要求。<br>可以在不同模块中调用公用变量。
例:公用变量声明<br><b><font color="#c41230">Public myDate as date<br>sub a()<br>dim myToday as date<br>myDate=Now()<br>myToday=Now()<br>end sub</font></b>
3、使用<font color="#c41230">Private</font>语句声明变量
语法结构:<br><font color="#c41230">Private [WithEvents] varname [([subsripts])] [As [new] type] [,[WithEvents] varname [([subscripts])] [As [new] type]]...</font><br><b><font color="#0076b3">withevents</font></b>:可选参数,可以声明任意个单变量,但不能声明数组,也不能和New一起使用<br><b><font color="#0076b3">VarName</font></b>:必要参数,指变量的名称<br><b><font color="#0076b3">Subscripts</font></b>:可选参数,表示数组变量的维数,最多可定义60多维数组。<br><font color="#0076b3"><b>New</b></font>:可选参数,表示可隐式地创建对象关键字。<br><b><font color="#0076b3">Type</font></b>:可选参数,表示变量的数据类型,所声明的每一个变量都要有一个单独的As Type子句。<br><br>*将变量声明为私有变量,一旦不在同一模块中使用,则变量为无效变量
3.4.4 变量的生存周期
1、局部变量
Dim,过程级别,只能在过程运行中使用。
2、私有变量
Private,模块级别,只能在同一模块中使用
3、公有变量
Public,工程级别,在整个工程中都可以调用。
4、静态变量
Static,过程级别。在过程运行中起作用、
5、实例:使用变量统计业绩达标人数
'定义常量<br>Const Price1 as Currency=125<br>Const Price2 as Currency=254<br>Const Price3 as Currency=186<br>Const Price4 as Currency=147<br>Const S_Name1 as String="产品A"<br>Const S_Name2 as String="产品B"<br>Const S_Name3 as String="产品C"<br>Const S_Name4 as String="产品D"<br><br><b><font color="#c41230">sub a()<br>dim PNum as integer<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim I as integer<br>dim Per1 ,Per2,Per3,Per4 as single<br>I=2<br>Do<br> If sht.cells(I,3)=S_Name1 then<br> Per1=sht.cells(I,4)*Price1<br> end if<br> If sht.cells(I,3)=S_Name3 then<br> Per3=sht.cells(I,4)*Price3<br> end if<br> If sht.cells(I,5)=S_Name2 then<br> Per2=sht.cells(I,6)*Price2<br> end if<br> If sht.cells(I,5)=S_Name4 then<br> Per1=sht.cells(I,6)*Price4<br> end if<br>sht.cells(I,7)=Per1+Per2+Per3+Per4<br>if Per1+Per2+Per3+Per4>10000 then<br> PNum=PNum+1<br>end if<br>i=I+1<br>Loop until sht,cells(I,2)=""<br>sht.Range("B7")=PNum<br>end sum</font></b>
3.5 VBA变量类型转换函数
1、<font color="#c41230">CBool(expression)</font>,返回Blooean值
2、<font color="#c41230">CByte(expression)</font>,返回Byte值
3、<font color="#c41230">CCur(expression)</font>,返回Currency值
4、<font color="#c41230">CDate(expression)</font>,返回Date值
5、<font color="#c41230">CDbl(expression)</font>,返回Double值
6、<font color="#c41230">CVar(expression)</font>,返回Variant值
7、<font color="#c41230">CDec(expression)</font>,返回Decimal值
8、<font color="#c41230">CInt(expression)</font>,返回Integer值
9、<font color="#c41230">CLng(expression)</font>,返回Long值
10、<font color="#c41230">CSng(expression)</font>,返回Single值
11、<font color="#c41230">CStr(expression)</font>,返回String值
12、实例:数据类型转换
<font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim J as Integer<br>J=2<br>Do<br> sht.celss(2,J)=CStr(sht.cells(1,J))<br> sht.celss(3,J)=CInt(sht.cells(1,J))<br> sht.celss(4,J)=CLng(sht.cells(1,J))<br> sht.celss(5,J)=CDate(sht.cells(1,J))<br> sht.celss(6,J)=CSng(sht.cells(1,J))<br> sht.celss(7,J)=CBool(sht.cells(1,J))<br> sht.celss(8,J)=CCur(sht.cells(1,J))</font><br>
3.6 VBA的运算符
3.6.1 算术运算符
1、^,幂
2、*,乘
3、/,除
4、\,取商
5、mod,取余数
6、+,加
7、-,减
3.6.2 比较运算符
1、<,小于
2、<=,小于等于
3、>,大于
4、>=,大于等于
5、<>,不等于
6、=,等于
7、Is,比较两个对象的引用变量
8、Like,比较两个字符串
3.6.3 字符串连接运算符
常见的连接运算符有”+“和”&“,<br>且两种运算符可以在同一个环境中混合使用
1、”+“运算符可以进行加法运算。
2、”&“运算符用于实现两个表达式进行字符串的强制连接
3.6.4 逻辑运算符
1、Not,非
2、And,与
3、Or,或
4、Xor,异或
5、Eqv,相等
6、Imp,蕴涵
7、实例:根据绩效等级计算月工资
<b><font color="#c41230">const mylevel1 as single=1200<br>const mylevel2 as single=1000<br>const mylevel3 as single=800<br><br>sub a()<br>dim sht as worksheet<br>set sht =worksheets("sheet1")<br>dim I as Integer,Per as Single<br>I=2<br>Do<br> If sht.Cells(I,5)="A" then<br> Per=mylevel1<br>elseif sht.cells(I,5)="B" then <br> Per=mylevle12<br>else <br> Per=mylevel3<br>end if<br>sht,cells(I,6)=sht.cells(I,4)+Per<br>I=I+1<br>Loop Until sht.cells(I,1)=""<br>end sub</font></b>
3.7 实例延伸
1、对象变量的定义与赋值
例:格式化表格<br><b><font color="#c41230">sub a()<br>dim MyRange as range<br>set MyRange=worksheets("sheet1").range("A2:L18")<br>MyRange.select<br>with selection<br> .Font.Name="黑体"<br> .Font.Size=13<br> .HorizontalAlignment=xlCenter<br> .VerticalAlignment=xlCenter<br> .Columns.AutoFit<br> .RowHeight=21<br>end sub</font></b>
2、<font color="#c41230">Variant</font>数据类型定义与应用
例:检测Variant变量值类型<br><b><font color="#c41230">sub a()<br>dim myVar1,myVar2,myVar3<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>myVar1=sht.range("B3")<br>myVar2=sht.range("C3")<br>myVar3=sht.range("D3")<br>sht.range("B4")=TypeName(myVar1)<br>sht.range("c4")=TypeName(myVar2)<br>sht.range("D4")=TypeName(myVar3)<br>end sub</font></b>
3、使用<font color="#c41230">Is</font>运算符比较两个对象引用
例:提取账号与联系方式<br><font color="#c41230"><b>sub a()<br>dim sht1,sht2,sh3 as worksheet<br>set sht1=worksheets("员工档案")<br>set sht2=worksheets("联系方式")<br>set sht3=worksheets("提取账号与联系方式")<br>if sht1 is sht2 then<br> msgBox"工作表引用错误"<br>else<br>msgbox "工作表引用正确"<br>end if <br>sht1.activate<br>sht1.range("F:F").select<br>selection.copy<br>sht3.activate<br>sht3.range("C:C").select<br>Activesheet.paste<br>sht2.activate<br>sht2.range("F:F").select<br>selection.copy<br>sht3.activate<br>sht3.range("C:C").select<br>Activesheet.paste<br>end sub</b></font>
4、使用<font color="#c41230">Like</font>运算符进行模糊查询
例:统计人数<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim MyStr as string<br>MyStr="刘*”<br>dim I ,Num as integer<br>I=2<br>Do<br> if sht.cells(I,2) Like MyStr then<br> Num=Num+1<br>end if<br>I=I+1<br>Loop until sht.celss(I,1)=""<br>sht.range("H2")=left(MyStr,1)+"姓人数"<br>sht.range("H3")=Num<br>with sht.range("H2:h3")<br> .font.Name="黑体"<br> .font.Size=11<br> .HorizontalAlignment=xlCenter<br> .VericalAlignment=xlCenter<br> .Columns.AutoFit<br> end with<br>end sub</font></b>
四、VBA的流程控制
4.1 VBA程序的结构
1、顺序结构
按照语句出现的顺序逐一执行。结构比较简单
2、选择结构
根据条件判断选择执行的语句
例:检测图书逾期情况<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim myStr as string<br>if sht.range("C3")+sht.range("D3")>sht.range("E3") then<br> myStr="按时归还"<br>else<br> myStr="逾期"<br>end if<br>sht.range("F3")=myStr<br>end if</font></b>
3、循环结构
重复执行一行或者多行代码。
例:检测图书逾期情况<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim myStr as string<br>dim I as Integer<br>I=3<br>Do<br>if sht.cells(I,3)+sht.cells(I,4)>sht.cells(I,5) then<br>myStr="按时归还"<br>else<br>myStr="逾期"<br>end if<br>sht.cells(I,6)=myStr<br>I=I+1<br>Loop until sht.cells(I,1)=""<br>end sub</font></b>
4.2 顺序结构常用语句
4.2.1 赋值语句
赋值语句是对变量或者对象属性进行赋值的语句。<br>采用“=”实现,对于对象变量必须采用Set语句实现。
例:设置单元格格式<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>dim Myrange as range<br>set sht=worksheets("明细表")<br>set Myrange=sht.range("A2:K15")<br>Myrange.select<br>with selection<br> .Font.name="黑体"<br> .Font.Size=13<br> .Borders.Linestyle=xlContinuous<br> .Columns.Autofit<br> .RowHeight=22<br> end with<br>end sub</font></b>
4.2.2 注释语句
用来说明程序中某些语句的功能和作用。
<br>注释语句以绿色显示,且不会运行。
1、使用单引号(')
2、使用语句标识注释。Rem
4.2.3 错误转移语句
1、<font color="#c41230">On Error Goto</font>语句实现
语法结构:<br><font color="#c41230">On Error Goto line</font><br><font color="#0076b3">line</font>:为必选参数,可以是任何行标签或行号。指定的line必须在同一个过程中,
<b><font color="#c41230">sub a()<br>on error goto msg<br>dim sht as worksheet<br>for each sht in worksheets<br> if sht.name="档案机密" then<br> sht.name="机密文件"<br> exit sub<br> end if<br>next sht<br>msg:<br>msgbox "档案中不存在机密档案工作表"<br>end sub</font></b>
2、使用<font color="#c41230">On Error Resume Next</font>语句跳过错误语句继续执行
<b><font color="#c41230">sub a()<br>on error Resume Next<br>dim sht as worksheet<br>for each sht in worksheets<br> if sht.name="档案机密" then<br>sht.name="机密文件"<br>exit sub<br>end if<br>next sht<br>worksheets.add<br>activesheet.Name="机密档案"<br>msg:<br>msgbox "档案中不存在机密档案工作表"<br>end sub</font></b>
4.2.4 使用<font color="#c41230">InputBox</font>输入对话框
1、使用<font color="#c41230">InputBox()</font>函数获取输入信息
语法结构:<br><font color="#c41230">InputBox(prompt [,title] [,default] [,xpos] [,ypos] [,helpfile,context])</font><br><font color="#0076b3"><b>Prompt</b></font>:必选,作为对话框消息出现的字符串表达式。<br><font color="#0076b3"><b>Title</b></font>:可选,显示在对话框标题栏中的字符串表达式。<br> 如果省略,则把应用程序名放入标题栏。<br><b><font color="#0076b3">Default</font></b>:可选,显示文本框中的字符串表达式,如果省略,则文本框为空。<br><b><font color="#0076b3">Xpos</font></b>:可选,其值是数值表达式,是成对出现的。用于指定对话框左边缘与屏幕左边的距离。<br> 如果省略,则对话框会水平居中。<br><b><font color="#0076b3">Ypos</font></b>:可选,其值是数值表达式,是成对出现的。用于指定对话框上边缘与屏幕上边的距离。<br> 如果省略,则对话框放置在屏幕垂直方向距下边大约三分之一的位置。<br><b><font color="#0076b3">Helpfile</font></b>:可选。用于识别帮助文件,提供上下文相关的帮助<br><font color="#0076b3"><b>Context</b></font>:可选,由帮助文件的作者指定给某个帮助主题的上下文编号。
例:查询员工联系方式<br><font color="#c41230"><b>sub a()<br>dim sht as worksheet<br>set sht worksheets("sheet1")<br>dim myStr as String<br>mystr=inputbox("请输入需要查询的员工姓名:","查询联系方式")<br>dim I as integer<br>I=3<br>Do<br> if sht.cells(I,2)=myStr then<br> msgbox "员工" & myStr & "的联系方式为:" + chr(10) & sht.cells(I,9)<br>exit Do<br>I=I+1<br>Loop until sht.cells(I,1)=""<br>end sub</b></font>
2、使用<font color="#c41230">InputBox</font>方法实现交互式操作
语法结构:<br><font color="#c41230">Object.InputBox(Prompt,Title,Default,Left,Top,Helpfile,HelpContextID,Type)</font><br><b><font color="#0076b3">Object</font></b>: 必选。是指一个代表Application对象的变量。<br><b><font color="#0076b3">Prompt</font></b>:必选。要在对话框中显示的信息,可为字符串、数字、日期或布尔值。<br><b><font color="#0076b3">Title</font></b>:可选。文本框的标题。省略时,默认为Input。<br><b><font color="#0076b3">Default</font></b>:可选。该值在对话框最初暗淡无光时出现在文本框中,省略时,默认为空。<br><b><font color="#0076b3">Left</font></b>:可选,相对于屏幕左上角Xr坐标。<br><b><font color="#0076b3">Top</font></b>:可选,相对于屏幕左上角的Y坐标。<br><b><font color="#0076b3">HeipFile</font></b>:可选。<br><font color="#0076b3"><b>HelpContextID</b></font>:可选。<br><b><font color="#0076b3">Type</font></b>:可选。省略时,默认为对话框将返回文本。<br><br>Type参数值及其含义:<br>1) 0:公式<br>2) 1:数字<br>3) 2:文本(字符串)<br>4) 4:逻辑值(True或者False)<br>5)8:单元格引用,作为一个Range对象<br>6)16:错误值,如#/A<br>7)64:数值数组<br>
例:抽样统计男女比例<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim myRange as Range<br>set myRange=application.InputBox("选取包含性别列的单元格区域","选取单元格区域",type:=8)<br> myRange.Font.ColorIndex=3<br>dim Boy,Girl as Integer<br>for each mycell in myrange<br> if mycell="男" then<br> Boy=Boy+1<br>Elseif mycell="女" then<br> Girl=Girl+1<br>end if<br>next mycell<br>msgbox "选取单元格中" & chr(10) & "男性有:" & Boy & "人" & chr(10) & "女性有:" & Boy & "人" & chr(10)<br>end sub</font></b>
4.2.5 使用<font color="#c41230">MsgBox() </font>函数显示信息
语法结构:<br><font color="#c41230">MsgBox(prompt [,button] [,title] [,helpfile,context])</font><br><b><font color="#0076b3">Prompr</font></b>:必选。它是字符串表达式,作为显示在对话框中的消息。<br><font color="#0076b3"><b>Button</b></font>:可选,表示指定按钮的数目和形式。<br>其余的参考InputBox中参数说明。
例:交互式清除内容<br><b><font color="#c41230">sub a()<br>dim MyRange as Range<br>set MyRange=application.InputBox("选取需要清除的单元格","选取单元格",Type:=8)<br>dim Myclear as Integer<br>MyClear=MsgBox("是否清除选定单元格区域中的内容,YES/No?",vbOkCancel+vbQuestion,Title:="清除内容")<br>if MyClear=1 then<br>MyRange.clearContents<br>end if<br>end sub</font></b>
4.3 分支结构语句
4.3.1 单重选择语句<font color="#c41230">If...Then...Else</font>
语法结构:<br><font color="#c41230">If condition then statements 或</font><br><font color="#c41230">if condition then</font><br><font color="#c41230"> statements</font><br><font color="#c41230">[else</font><br><font color="#c41230"> statements]</font><br><font color="#c41230">end if</font><br><br><font color="#0076b3"><b>condition</b></font><font color="#5c5c5c">:必选。表示一个或多个数值表达式,其运算结果为True或者False。<br></font><font color="#0076b3"><b>statements</b></font><span style="color: rgb(92, 92, 92);">:在块形式中是可选参数,但是在单行形式中是必选参数,</span><font color="#5c5c5c"><br> 表示一条或多条以冒号分开的语句,并在condition为True时执行。</font>
例:提取员工称呼<br><font color="#c41230"><b>Const Bstr as string="先生"<br>Const Gstr as String="女士"<br><br>sub a()<br> Dim sht as worksheet<br> set sht worksheets("sheet1")<br> dim I as Integer<br> dim as myName as string<br>I=3<br>Do<br> if left(sht.cells(I,2)=4 then<br> myName=Left(sht.cells(I,2),2)<br>else<br> myName=Left(sht.cells(I,2),1)<br>end if<br> if sht.celss(I,3)="男" then<br> sht.cells(I,10)=myName & Bstr<br>else<br> sht.cells(I,10)=myName & Gstr<br>end if<br>I=I+1<br>loop Until sht.cells(I,1)=""<br>end sub</b></font>
4.3.2 多重选择语句<font color="#c41230">If...Then...Elseif</font>
语法结构:<br><font color="#c41230">if condition then<br> statements<br>elseif condition-n then<br> elseifstatements...<br>[else<br> elsestatements]<br>end if</font><br><br>else和else if子句都是可选的。在if块中,可以放置任意多个Else if子句,但是都必须在Else子句之前。
例:录入津贴补助<br><font color="#c41230"><b>sub a()<br>dim sht as worksheet<br>dim I as Integer<br>set sht=worksheets("sheet1")<br>I=3<br>Do<br>if sht,cells(I,4)="总裁" then<br> sht.cells(I,10)=2000<br>elseif sht,cells(I,4)="副董" then<br>sht.cells(I,10)=1000<br>elseif sht,cells(I,4)="经理" then<br>sht.cells(I,10)=800<br>elseif sht,cells(I,4)="主任" then<br>sht.cells(I,10)=500<br>elseif sht,cells(I,4)="助理" then<br>sht.cells(I,10)=200<br>else<br> sht,cells(I,10)=100<br>end if<br>I=I+1<br>Loop until sht.cells(I,1)=""<br>end sub</b></font>
4.3.3 多重选择语句<font color="#c41230">Select Case</font>
语法结构:<br><font color="#c41230">select case testexpression<br> [case expressionlist-n<br> [statements-n]]...<br>[case else<br> [elsestatements]]<br>end select</font><br><br><b><font color="#0076b3">testexpression</font></b>:必选,表示任何数值表达式或字符串表达式<br><font color="#0076b3"><b>Expressionlist-n</b></font>:如果有Case出现。则为必选参数,表示一个或多个组成的分界列表。<br><b><font color="#0076b3">statements-n</font></b>:可选。表示一条或多条语句,当testexpression与expressionlist-n中的任何部分匹配时执行。<br><font color="#0076b3"><b>Elseststements</b></font>:可选,表示一条或多条语句,当testexpression不匹配case子句的任何部分时执行。
例:录入津贴补助<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>dim I as Integer<br>set sht=worksheets("sheet1")<br>I=3<br>Do<br>select Case sht,cells(I,4)<br>case "总裁" <br> sht.cells(I,10)=2000<br>case "副董" <br> sht.cells(I,10)=1000<br>Case "经理" <br>sht.cells(I,10)=800<br>case "主任" <br>sht.cells(I,10)=500<br>Case "助理" <br>sht.cells(I,10)=200<br>case else<br>sht,cells(I,10)=100<br>end select<br>I=I+1<br>Loop until sht.cells(I,1)=""<br>end sub</font></b><br>
例:根据员工业绩进行考核<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>dim I as Integer<br>set sht=worksheets("sheet1")<br>I=3<br>Do<br> if sht.cells(I,3)="市场部" then<br> select Case sht.cells(I,4)<br> case is >10000<br> sht.cells(I,5)="A"<br> sht.cells(I,6)=500<br> case is >6000<br> sht.cells(I,5)="B"<br> sht.celss(I,6)=200<br> Case is >3000<br> sht.celss(I,5)="C"<br> sht.Celss(I,6)=100<br> Case else<br> sht.cells(I,5)="不达标"<br> sht.celss(I,6)=-500<br> sht.cells(i,6).Font.ColorIndex=3<br>end select<br>end if<br>end sub</font></b>
4.4 循环结构语句
4.4.1 指定次数循环 <font color="#c41230"><b>For...Next</b></font>语句<br>
<font color="#c41230">for counter=start to end [Step step]<br> [statements]<br>[exit for]<br> [statements]<br>next [counter]</font><font color="#0076b3"><b><br>counter</b></font>:必选,用做循环计数器的数值变量,该变量不能是布尔或者数组元素<br><b><font color="#0076b3">start</font></b>:必选,表示counter的初值。<br><b><font color="#0076b3">end</font></b>: 必选,表示counter的终值。<br><b><font color="#0076b3">step</font></b>:可选。默认值1,也可以是负值。<br><b><font color="#0076b3">statements</font></b>:可选,表示放在For和Next之间的一条或多条语句,被执行指定的次数。<br>
1)例:在A列从A1开始输入1-10的数字<br><font color="#c41230"><b>sub a()<br>dim i as integer<br>for i=1 to 10<br> range("A:"& i)=i<br>next i<br>end sub</b></font>
2)例:统计各部门人数<br><font color="#c41230"><b>sub a()<br>dim sht as worksheet<br>dim Num as integer<br>sht=worksheet(1)<br>Num=sht.range("A2:A164").currentRegion.rows.count<br>dim AdmStr,PerStr,SalStr,PrStr,TecStr,PrdStr,PrpStr,MarStr as integer<br>for i=3 to Num<br> select case sht.cells(i,5)<br> case "行政部"<br> AdmStr=AdmStr+1<br>...<br> end select<br>next i<br>end sub</b></font>
4.4.2 根据条件进行循环<font color="#c41230"><b>Do...Loop</b></font>语句<br>
<font color="#c41230">Do<br> [statements]<br>[exit Do]<br>[statements]<br>Loop Until|While condition</font><font color="#0076b3" style="font-weight: bold;"><br>condition</font>:必选,表示数值表达式或字符串表达式,其值为True或False。<br><font color="#0076b3"><b>Statements</b></font>:表示一条或多条命令,它们会补重复执行。直到Condition为True。<br><b><font color="#0076b3">Exit Do</font></b>语句用于强制退出循环。<br>Until表示在条件成立时结束循环;While表示当条件成立时才进行循环。
1)例:统计各部门人数。<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>dim Num,i as integer<br>set sht=worksheets("sheet1")<br>Num=sht.range("A2:A164").currentRegion.rows.count<br>dim AdmStr,PerStr,SalStr,PrStr,TecStr,PrdStr,PrpStr,MarStr as integer<br>i=3 <br>Do <br> select case sht.cells(i,5)<br> case "行政部"<br> AdmStr=AdmStr+1<br>...<br>end select<br>Loop while sht.cells(i,1)<>""<br>end sub</font></b>
4.4.3 针对数组进行循环<font color="#c41230"><b>For Each...Next</b></font>语句<br>
<font color="#c41230">For Each element In group<br> [statements]<br>[exit for]<br> [statements]<br>Next [element]</font><font color="#0076b3"><b><br>element</b></font>:必选,用来遍历集合或者数组中所有元素的变量。<br><b><font color="#0076b3">group</font></b>:必选,表示对象集合或者数组的名称。<br><font color="#0076b3"><b>statements</b></font>:可选,是指针对group中的每一项执行的一条或多条语句。<br>不能在 For Each...Next语句中使用自定义类型数组。
例:突出显示员工的工资额。<br><b><font color="#c41230">sub a()<br>Dim myRange as range,RowN as Integer<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>RowN=sht.range("A1").currentRegion.rows.count<br>set myRange=sht.Range(sht.cells(2,7),sht.cells(RowN,7))<br>for each one in myRange<br> if one.value>2000 then<br> one.Font.ColorIndex=3<br> end if <br> Next one<br>end sub</font></b>
4.4.4 循环语句的嵌套使用<br>
<font color="#c41230"> For I=1 to 10<br> ...<br> For J=1 to 10<br> ...<br> Next J<br> ....<br>Next I</font><br>正常情况下,应先执行内层循环,然后执行外层循环。
例:格式化表格的填充颜色(隔行):<br> <font color="#c41230"><b>sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim RowN as integer,Col as Integer<br>RowN=sht.range("A1").currentRegion.Rows.count<br>Col=sht.range("A1").CurrentRegion.columns.count<br>For i=3 to RowN Step 2<br> For J=1 to Col step 2<br> sht.cells(i,j).interior.color=RGB(255,204,255)<br> Next j<br>Next i</b></font>
4.5 实例延伸
4.5.1 使用<font color="#c41230"><b>IIF()</b></font>函数实现单重条件的判断<br>
<font color="#c41230">IIF(expr,truepart,falsepart)</font><font color="#0076b3"><b><br>expr</b></font>:必选,是用于判断真伪的表达式。<br><font color="#0076b3"><b>truepart</b></font>:必选,如果expr为True,则返回这部分的值或者表达式。<br><b><font color="#0076b3">falsepart</font></b>:必选,如果expr为False,则返回这部分的值或者表达式。
例:检测员工是否有休假。<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim I as integer<br>I=3<br>Do<br>sht.cells(I,5)=iif(Cint((Now()-sht.cells(I,4)))>365,"休假","无休假")<br> I=I+1<br> Loop until sht.Cells(I,1)=""<br>end sub</font></b>
4.5.2 使用<font color="#c41230"><b>Switch()</b></font>函数实现多重条件判断<br>
<font color="#c41230">Switch(expr-1,value-1[,expr-2,value-2[,expr-n,value-n]])</font><br><font color="#0076b3"><b>expr</b></font>:必选。表示要加以计算的Variant表达式。<br><b><font color="#0076b3">value</font></b>:必选,如果相关的表达式为TRue,则返回此部分的数值或者表达式。
例:根据员工入职年限,计算休假天数<br><b><font color="#c41230">sub a()<br>dim sht as worksheet|<br>set sht=worksheets("sheet1")<br>dim I as Integer:I=3<br>dim Wdays as Integer<br>Do<br> Wdays=CInt((Now()-sht.cells(I,4)))<br>sht.cells(I,6)=Switch(Int(Wdays/365)=1,5,_<br> Int(Wdays/365)=2,8,_<br> Int(Wdays/365)=3,10,_<br> Int(Wdays/365)>3,15)<br> I=I+1<br> Loop Until sht.cells(I,1)=""<br>end sub</font></b>
4.5.3 使用<b><font color="#c41230">Choose()</font></b>函数返回特写值
语法结构:<font color="#c41230">Choose(index,choice-1[,choice-2,...choice-n]])</font><br><font color="#0076b3" style="font-weight: bold;">index:</font>必选,表示数值表达式或字段,它运算结果是一个数值,<br>且介于1和可选择的项目数之间。<br><b><font color="#0076b3">choice:</font></b>必选,表示Variant表达式,包含可选择项目之一。<br><br>* inex索引号是介于1到参数项目数之间的数值,不能为0,<br> 也不能大于参数列表数据项目数
例:将员工休假天数以中文显示出来。<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim I as Integer:I=3<br>dim myInt,myDays as Integer<br>Do<br> myDays=sht.cells(I,6)<br> myInt=Switch(myDays=0,0,myDays=5,1,_<br> myDays=8,2,myDays=10,3,myDays=15,4)<br> sht.cells(I,7)=choose(myInt+1,"零天","伍天","捌天","拾天","壹拾伍天")<br> I=I+1<br>Loop until sht.cells(I,1)=""<br>end sub</font></b>
4.5.4 使用<b><font color="#c41230">With</font></b>对同一对象的不同属性进行设置
语句结构:<br><font color="#c41230">With<br>...<br>end With</font><br>用于对某个对象执行一系列语句,简化程序代码,而不用重复指出对象的名称。
例:一键调整单元格区域内格式<br><b><font color="#c41230">sub a()<br>with selection<br> .Font.Name="黑体"<br> .Font.Size=13<br> .Font.Bold=True<br> .Interior.Color=Rgb(255.204.255)<br> .Columns.Autofit<br> .HorizontalAlignment=XlCenter<br> .VerticalAlignment=Xlcenter<br>end with<br>end sub</font></b>
4.5.5 <b><font color="#c41230">If</font></b>语句的嵌套使用
若要同时满足多个条件,可以利用多个IF语句嵌套来达到目的。<br><br>* 注意,一般IF语句的嵌套不要超过3层、
例:统计市场部男员工人数<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim I,PeoN as Integer<br>I=3<br>Do<br> if sht.cells(I,5)="市场部" then<br> if sht.cells(I,3)="男" then<br> PeoN=PeoN+1<br> end if<br> I=I+1<br>Loop Until sht.cells(I,1)=""<br>MsgBox "市场部男职工人数:"& PeoN<br>end sub</font></b>
五、数组的使用
5.1 声明数组
5.1.1 声明一、二维数组
1、一维数组的声明
语法结构:<br><font color="#c41230">Dim <数组名> ([索引下界 to] 索引下界) as <数据类型></font><br><br><b><font color="#0076b3">数组名</font></b>:是一个标识符,它的命名规则与变量命名规则相同。<br><b><font color="#0076b3">索引下界</font></b>:指数组中索引号的最小值。<br><b><font color="#0076b3">索引上界</font></b>:指数组中索引号的最大值。索引上界值必须大于下界值。<br><b><font color="#0076b3">数据类型</font></b>:是指常见的12类基本数据类型。
例:计算实发工资<br><font color="#c41230"><b>sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim BS(0 to 3) as single<br>for i=0 to 3<br> BS(i)=sht.cells(i+2,10) '基本工资设置单元格区域<br> next i<br>dim RowN as Integer<br>RowN=2<br>Do<br> select case sht.cells(RowN,3)<br> Case "行政部"<br> sht.cells(Rown,7)=sht.cells(RowN,4)+sht.cells(RowN,5)+sht.cells(RowN,6)+BS(0)<br> Case "市场部"<br> sht.cells(Rown,7)=sht.cells(RowN,4)+sht.cells(RowN,5)+sht.cells(RowN,6)+BS(1)<br> Case "技术部"<br> sht.cells(Rown,7)=sht.cells(RowN,4)+sht.cells(RowN,5)+sht.cells(RowN,6)+BS(2)<br> Case else<br> sht.cells(Rown,7)=sht.cells(RowN,4)+sht.cells(RowN,5)+sht.cells(RowN,6)+BS(3)<br> end select<br>RowN=RowN+1<br>Loop until sht.cells(RowN,1)=""<br>end sub</b></font>
2、二维数组的声明
语法结构:<br><font color="#c41230">Dim <数组> (行数,列数) as <数据类型></font><br><br>行数、列数是定义二维数组必不可少的参数,行数与列数拥有各自的索引下界与索引上界值。<br>例如:Dim MyArray(3,4) as string 即表明MyArray为二维数组,且能存放4行5列的数据,<br>默认索引下界值为0.
例:利用数组计算实发工资<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht =worksheets("sheet1")<br>dim myArray(3,1)<br>for i=0 to 3<br> for j=0 to 1<br> myArray(i,j)=sht.cell(i+2,j+9)<br>next j<br>next i<br>dim RowN as Integer:RowN=2<br>Do<br> for i=0 to 3<br> if sht.cells(RowN,3)=myArray(i,0) then<br> sht.cells(RowN,7)=sht.cells(RowN,4)+sht.cells(RowN,5)+sht.cells(RowN,6)<br> myArray(i,1)<br>next i<br>RowN=RowN+1<br>Loop until sht.cells(RowN,1)=""<br>end sub</font></b>
5.1.2 设置默认下界值
语法结构:<br><font color="#c41230">option Base {0|1}</font><br><br>其中Option base 0表示声明数组中省略索引下界值,默认下界值为0;<br>而Option Base 1 则默认值为1.
例:利用数组存放基本工资<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim myArray(4,2)<br>for i=1 to 4<br> for j=1 to 2<br> myArray(i,j)=sht.cells(i+1,j+8)<br> next j<br> next i<br>end sub</font></b>
5.1.3 查看数组的索引上界与下界
1、语法结构:<br><font color="#c41230">LBound(arrayname[,dimension])</font><br>其值为指定数组可用的索引下界。<br><b><font color="#0076b3">arrayname</font></b>:必选,表示数组变量的名称。<br><b><font color="#0076b3">dimension</font></b>:可选,其数据类型为Variant(Long)。用于指定返回哪一维的下界,1表示<br>第一维,2表示每二维,如果省略dimension,默认为1.
2、语法结构:<br><font color="#c41230">UBound(arrayname [,dimension])</font><br>其值为指定数组的索引上界值。<br><br>参数与LBound类似。
5.2 为数组赋值
5.2.1 使用循环语句初始化数组
语法结构:<br><font color="#c41230">for <循环变量>=索引下界值 to 索引上界值<br> <数组元素>=<初始值><br>next 循环变量</font>
例:计算业绩提成<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim myArray(4) as single<br> for i=0 to 4<br> myArray(i)=sht.cells(i+2,7)<br>next i<br>dim RowN as Integer<br>RowN=2<br>Do<br> select case sht.cells(RowN,3) <br> case is>100000<br> sht.cells(RowN,4)=sht.cells(RowN,3)*myArray(0)<br> case is>50000<br> sht.cells(RowN,4)=sht.cells(RowN,3)*myArray(1)<br> case is>30000<br> sht.cells(RowN,4)=sht.cells(RowN,3)*myArray(2)<br> case is>10000<br> sht.cells(RowN,4)=sht.cells(RowN,3)*myArray(3)<br> case else<br> sht.cells(RowN,4)=sht.cells(RowN,3)*myArray(4)<br>end select<br>RowN=RowN+1<br>Loop Until sht.cells(RowN,1)=""<br>end sub</font></b>
5.2.2 使用Array()函数初始化数组
语法结构:<br><font color="#c41230">Array(arglist)</font><br><br><b><font color="#0076b3">Arglist:</font></b> 必选。是一个用逗号隔开的数据序列表。<br>如果不提供参数,则创建一个长度为0的数组
例:计算业绩提成<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>myArray=array(0.018,0.014,0.011,0.0086,0.00057)<br>dim Rown as Integer<br>Rown=2<br>Do<br> select case sht.cells(Rown,3)<br> case is >=100000<br> sht.cells(Rown,4)=sht.cells(Rown,3)*myArray(0)<br> case is >=50000
<br> sht.cells(Rown,4)=sht.cells(Rown,3)*myArray(1)<br> case is >=30000
<br> sht.cells(Rown,4)=sht.cells(Rown,3)*myArray(2)<br> case is >=10000
<br> sht.cells(Rown,4)=sht.cells(Rown,3)*myArray(3)<br> case else <br> sht.cells(Rown,4)=sht.cells(Rown,3)*myArray(4)<br>end select<br>Rown=Rown+1<br>Loop until sht.cells(Rown,1)=""<br>end sub</font></b>
5.2.3 使用数组值初始化数组
例:计算各部门员工人数所占比例<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim BM(1,1)<br>for i=0 3<br> for j=0 to 1<br> Bm(i,j)=sht.cells(i+2,J+1)<br> next j<br>next i<br>dim PeoN(3) as Integer<br> for i=0 to 3<br>PeoN(i)=BM(i,1)<br>next i<br>dim Peo as Integer<br>Peo=PeoN(0)+PeoN(1)+PeoN(2)+PeoN(3)<br>for i=0 to 3<br>sht.cells(i+2,3)=PeoN(i)/Peo<br>next i<br>end sub</font></b>
5.3 动态数组
5.3.1 声明动态数组
1、语法结构:<br><font color="#c41230">Dim <数组名> () as <数据类型></font><br><br>动态数组也可以利用Static、Dim、Private或Public语句来说明,并使数组特号内为空<br><br>
2、语法结构:<br><font color="#c41230">Redim <数组名> ([索引下界] to 索引上界</font><br><br>1)对于过程中的数组范围,可以使用Redim语句反复更改。<br>2)每次使用Redim,数组中存在的值会丢失,若要保存数组中原有的值,<br>则可以使用Redim Preserv语句扩充数组。<br>3)Redim语句只能用于更改数组中元素的个数,即数组的大小,<br>而不能改变数组元素的数据类型。
5.3.2 数组的清除与重定义
语法结构:<br><font color="#c41230">Erase arraylist</font><br><br><font color="#0076b3"><b>arraylist</b></font>是一个或多个用逗号隔开的需要清除的数组变量。<br>1)固定数值数组:将每个元素设为0<br>2)固定字符串数组(长度可变):将每个元素设为0长度字符串("")<br>3)固定字符串数组(长度固定)将每个元素设为0<br>4)固定Variant数组:将每个元素设为Empty<br>5)用户定义类型的数组:将每个元素作为单独的变量来设置<br>6)对象数组:将每个元素设为特定值Nothing
例1:将员工编号赋给数组<br>'声明变量类型<br><font color="#c41230"><b>sub a()<br>dim Num as integer,CB() as string<br>num=cells(65536,1).end(xlup).row<br>redim CB(Num-2)<br>for i=0 to Num-2<br> CB(i)=cstr(cells(i+2,1).value)<br>next i<br>for i=0 to num-2<br> debug.print "数组元素CB(" & i & ")的值为:":CB(i)<br>next i<br>end sub</b></font>
例2:给现有数组添加数据<br><b><font color="#c41230">sub 计算总投资额()<br>dim myarray<br>myarray=array("摄影类","¥100,000.00","办公类","¥120,000.00","三维类","¥80,000.00","机械类","¥50,000.00"<br>dim Num as integer<br>num=Ubound(myarray)<br>redim preserve myarray(Lbound(myarray) to num+4)<br>myarray(num+1)=inputbox("请输入新增加项目1名称:","新增项目名称")<br>myarray(num+2)=inputbox("请输入新增加项目1投资额:","新增项目投资额")<br>myarray(num+3)=inputbox("请输入新增加项目2名称:","新增项目名称")<br>myarray(num+4)=inputbox("请输入新增加项目2投资额:","新增项目投资额")<br>dim myIve as single<br>for i=Lbound(myarray)+1 to num+4 step 2<br>myIve=myive+myarray(i)<br>next i<br>worksheets(1).range("D1")="所有项目总投资额为:" & myive & "元"<br>with worksheets(1).range("D1")<br>.font.name="宋体"<br>.font.size=13<br>.font.bold=true<br>.font.color=rgb(255,255,255)<br>.interior.colorindex=3<br>.columns.autofit<br>end with<br>end sub</font></b>
5.4 实例延伸
5.4.1 检测变量是否为数组<b><font color="#c41230">IsArray</font></b>
<b><font color="#c41230">IsArray(varname)</font></b><br><br><font color="#0076b3"><b>varname</b></font>是一个指定变量的标识符,也就是变量名称
例1:检测变量是否为数组<br><font color="#c41230"><b>sub b()<br>myarray=array(“申",“酉",“丑",“子")<br>mystr=“申、酉、丑、子"<br>if isarray(myarray)=true then<br>result1="变量myarray为数组变量"<br>else<br>result1="变量myarray为非数组变量"<br>end if<br>if isarray(mystr)=true then<br>reault2="变量mystr为数组变量"<br>else<br>result2="变量mystr为非数组变量"<br>end if <br>msgbox result1 & chr(10) & result2<br>end sub</b></font>
5.4.2 数组中使用<b><font color="#c41230">for each</font></b>语句控制的变量必须是varint
该语句的循环变量必须是Variant变量,否则会出现错误提示
5.4.3 不能改变数组元素的数据类型
使用Redim语句只能改变数组元素的数目,而不能更改单独数组元素的数据类型
5.4.4 不能直接给整个数组赋值
不能直接给数组赋值,必须指定此元素的下标,然后为数组元素赋值
5.4.5 数组中不能放置监视断点
数组中没有相关的单一值。
六、过程与函数使用
6.1 过程的类别
6.1.1 <font color="#c41230"><b>sub</b></font>过程
按值传递和按地址传递两种方式。
<font color="#c41230"><b>sub password(ByVAl x as integer,ByRef y as integer)<br>if y=100 then y=x+y else y=x-y x=x+100<br>end sub<br>sub call_password()<br>dim x1 as integer<br>dim y1 as integer<br>x1=12<br>y1=100<br>rem 调用过程方式:1.call 过程名(参数1,参数2,...);2.过程名 参数1,参数2,...<br>call password(x1,y1)<br>rem 结果是12,、112,y1按地址传递改变了值,而经按值传递,未改变原值<br>debug.print x1,y1<br>end sub</b></font>
6.1.2 <font color="#c41230"><b>Function</b></font> 函数
实际上是实现一种映射,它通过一定的映射规则完成运算并返回结果。<br>传递有两种:按值传递(ByVal)的按地址传递(Byref)
<font color="#c41230"><b>function password(ByVal x as integer,ByRef y as integer)as boolean<br>if y=100 then y=x+y else y=x-y<br>x=x+100<br>if y=150 then password=true else password=false<br>end function<br>rem 设计调用自定义函数password()的过程代码<br>sub call_password()<br>dim x1 as integer<br>dim y1 as integer<br>x1=12:y1=100<br>rem 调用函数:1.作为一个表达式放在=号右端;2.作为参数<br>if password then<br>debug.print x1<br>end if <br>end sub<br></b></font><br>
6.1.3 <font color="#c41230"><b>Property</b></font>属性过程
6.1.4 <font color="#c41230"><b>Event</b></font>事件过程
6.2 函数与子过程简介
可以分为两类:函数和子过程
1、具有一个过程名
2、具有一个参数列表
3、函数与子过程的区别
1)函数具有一个特定的返回值
2)子过程没有返回值
6.3 定义Sub过程
6.3.1 通过对话框定义子过程
其实就是利用“录制宏”功能创建任务流程代码,以Sub...End Sub语句显示任务过程代码
6.3.2 使用代码创建Sub过程
直接利用Sub...End Sub语句定义子过程
语法格式:<br><font color="#c41230"><b>[Private|Pulic|Friend] [Static] Sub name [(arglist)]<br> [statements]<br>[Exit Sub]<br> [statements]<br>end sub</b></font>
1) <font color="#0076b3"><b>Pulic</b></font>:可选,表示所有模块的所有其他过程都可访问该Sub过程。<br>2)<font color="#0076b3"><b>Private</b></font>:可选,表示只有在包含其声明的模块中的其他过程可以<br> 访问该Sub过程。<br>3)<font color="#0076b3"><b>Friend</b></font>:可选,只能在类模块 中使用。<br>4)<font color="#0076b3"><b>Static</b></font>:可选,表示在调用之间保留Sub过程的局部变量值。Static<br> 属性对在Sub过程外声明的变量不会产生影响。<br>5)<font color="#0076b3"><b>Name</b></font>:必需,Sub名称,遵循标准的变量名称约定。<br>6)<font color="#0076b3"><b>Arglist</b></font>:可选,代表在调用时要传递给Sub过程的参数变量列表,<br> 多个变量之间用逗号隔开。<br>7)<font color="#0076b3"><b>statsments</b></font>:可选,Sub过程中所执行的任何语句组。
例:格式化表格<br><font color="#c41230"><b>sub a()<br>'设置整个表格的字体、边框等格式<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim rown as integer,Col as integer<br>rown=sht.range("A1").currentRegion.rows.count<br>Col=sht.Range("A1").CurrentRegion.columns.count<br>sht.range(cells(2,1),cells(rown,col)).select<br>with selection<br> .font.name="宋体"<br> .font.size=11<br> .borders.linestyle=xlcontinuous<br> .columns.autofit<br>. horizontalAlignment=xlcenter<br> .VerticalAlignment=xlcenter<br>end with<br>sht.range(cells(2,1),cells(2,col)).select<br>with selection<br>.font.size=14<br>.font.bold=true<br>.columns.autofit<br>end with<br>end sub</b></font>
6.4 使用Function语句
与Excel提供的内置函数相似,可以直接在Excel中使用自定义函数
语法格式:<br><b><font color="#c41230">[Public | Private | Friend][Static]Function name [(arglist)][As type]<br> [statements]<br> [name=expression]<br>[Exit Function]<br> [statements]<br> [name=expression]<br>. ...<br>end function</font></b>
1)<b><font color="#0076b3">Public</font></b>:可选,表示所有模块的所有其他过程都可以访问该Function过程。<br>2)<font color="#0076b3"><b>Private</b></font>:可选,表示只有包含其声明的模块的其他过程可以访问该过程。<br>3)<b><font color="#0076b3">Friend</font></b>:可选,表示只能在类模块中使用。<br>4)<b><font color="#0076b3">name</font></b>:必选,表示Function过程的名称。<br>5)<b><font color="#0076b3">Arglist</font></b>:可选,代表在调用时要传递给Function过程的参数列表。<br>6)<b><font color="#0076b3">type</font></b>:可选,表示Function过程返回值的数据类型。<br>7)<b><font color="#0076b3">statements</font></b>:可选,表示在Function过程中执行的任何语句组。<br>8)<b><font color="#0076b3">expression</font></b>:可选,表示Function过程的返回值。
例:自定义函数计算利润额<br><b><font color="#c41230">Function profits(Price,Number,rate) as single<br> profits=price*number*(rate/price)<br>end function</font></b>
6.5 过程的调用
调用子过程的方法<br><br>1、使用Call语句调用<br>2、使用程序名直接调用<br>3、将自定义函数赋值给变量<br>
6.5.1 使用Call语句调用子过程
语法格式:<br><font color="#c41230" style="font-weight: bold;">[call ] name [argumentlist]</font><br><br><font color="#0076b3"><b>call</b></font><b style="color: rgb(92, 92, 92);">:</b><span style="color: rgb(92, 92, 92);">可选参数,关键字。如果指定了这个关键字,则参数必须加上括号。如</span><br><span style="color: rgb(92, 92, 92);"> call myProc(0)</span><br><font color="#0076b3"><b>name:</b></font><span style="color: rgb(92, 92, 92);">过程名,必要参数,表示要调用的过程名称</span><br><font color="#0076b3"><b>arglist</b>:</font><span style="color: rgb(92, 92, 92);">参数列表,可选 参数,都可以加上关键字ByVal或ByRef,以描述被 调用</span><br><span style="color: rgb(92, 92, 92);"> 的过程将如何处理这些参数。</span>
6.5.2、使用程序名直接调用
语法结构:<br><font color="#c41230">name argumentlist</font><br><br><font color="#0076b3"><b>argumentlis</b></font>t参数是指传递过程的变量\数组或者表达式,各参数之间用逗号隔开.<br>
6.5.3、调用自定义函数
例:一键获取各产品折扣价<br><br><font color="#c41230"><b>sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>num=sht.range("A1").currentregion.rows.count<br>for i=3 to num<br> sht.cells(i,4)=discount(cells(i,3),0.65)<br> sht.cells(i,5)=discount(cells(i,3),0.75)<br> sht.cells(i,6)=discount(cells(i,3),0.95)<br> sht.cells(i,7)=discount(cells(i,3),1)<br>next i<br>end sub<br><br>function discount(price,rate)<br> discount=price*rate<br>end function</b></font><br><br>
6.6 过程的调试
6.6.1 控制程序执行的工具
1、控制程序起停的功能
2、控制程序执行间隔的功能
3、监视
6.6.2 调试技术
1、程序浸入式调试
1)print过程
2) Assert过程
2、变量监视
6.7 常用字符串函数
6.7.1 Len()函数计算字符串长度
语法结构:<br><font color="#c41230">len(string|varname)<br>lenb(string|varname)</font><br><br><font color="#0076b3"><b>string</b></font>:任何有效的字符串表达式。<br><b><font color="#0076b3">Varname</font></b>:任何有效的变量名称。
<font color="#c41230"><b>sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim i as integer:i=3<br>do<br> if len(sht.cells(i,1))=15 then<br> sht.cells(i,6)="正确"<br>else<br> sht.cells(i,6)="不正确"<br>end if <br>i=i+1<br>loop until sht.cells(i,1=""<br>end sub</b></font>
6.7.2 截取字符串
语法结构:<br><font color="#c41230">left() left(string,lwngth) 返回指定字符串中从左算起指定数量的字符<br>Mid() Mid(string,start,[length]) 返回指定字符串中指定位置、指定数量的字符<br>Right() Right(string,length) 返回指定字符串从右算起指定数量的字符</font><br><br><b><font color="#0076b3">string</font></b>:必选,字符串表达式。<br><b><font color="#0076b3">length</font></b>:Left()和Right()函数中必选<br><b><font color="#0076b3">start</font></b>:Mid()函数中为必选,为Long型,指定string中被取出部分的字符位置。
例:截取字符串<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim i as integer:i=3<br>do<br>sht.cells(i,6)=left(sht.cells(i,2),2)<br>sht.cells(i,7)=mid(sht.cells(i,2),3,4)<br>sht.cells(i,8)=right(sht.cells(i,2),6)<br>i=i+1<br>loop until sht.cells(i,2)=""<br>end sub</font></b>
6.7.3 用String()函数生成重复字符串
语法结构:<br><font color="#c41230">string(number,character)</font><br><br><b><font color="#0076b3">number</font></b>:必选,long型,返回字符串的长度,如果number为空,将返回Null<br><font color="#0076b3"><b>character</b></font>:必选,variant型,为指定字符串的字符码或字符串表达式
6.7.4 用replace()函数替换指定的字符串
语法结构:<br><font color="#c41230">replace(expression,find,repalce[,start[,count[,compare]]])</font><br><br><b><font color="#0076b3">expression</font></b>:必选,字符串表达式,包含要替换的字符串。<br><font color="#0076b3"><b>find</b></font>:必选,要搜索到的子字符串。<br><b><font color="#0076b3">replace</font></b>:必选,用来替换的子字符串。<br><font color="#0076b3"><b>star</b></font>:可选,在表达式中子字符串搜索的开妈位置,若省略,则从1开始。<br><b><font color="#0076b3">count</font></b>:可选,子字符串进行替换的次数,默认值为-1,它表示进行所有可能的替换。<br><b><font color="#0076b3">compare</font></b>:可选,数字值,表示判别子字符串时所用的比较方式。
例:用星号替换号码第4至7位数字<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim i as integer:I=3<br>dim Tel as string<br>do<br>Tel=sht.cells(i,4)<br>sht.cells(i,4)=left(tel,3) & Replace(Tel,mid(tel,4,4),string(4,"*"),4)<br>i=i+1<br>Loop until sht.cells(i,4)=""<br>end sub</font></b>
6.7.5 使用StrConv()函数实现字符的转换
语法结构:<br><font color="#c41230">StrConv(string,conversion,LCID)</font><br><br><font color="#0076b3"><b>string</b></font>:必选,要转换的字符串表达式。<br><b><font color="#0076b3">conversion</font></b>:必选,Integer型,其值的和决定转换的类型。<br><b><font color="#0076b3">LCID</font></b>:可选 ,如果与系统LocaleID不同,则为LocalID(默认值)
6.7.6 使用LCase()/UCase()函数实现字母大小写转换
语法结构:<br><font color="#c41230">LCase(string)<br>UCase(string)</font><br><br><font color="#0076b3"><b>string</b></font>为必选参数,可以是任何有效的字符串表达式,如果string包含Null,将返回Null
6.7.7 使用StrComp()函数比较两个字符串是否相同
语法结构:<br><font color="#c41230">StrComp(string1,string2[,compare])</font><br><br><b><font color="#0076b3">string1</font></b>:必选,任何有效的字符串表达式。<br><b><font color="#0076b3">string2</font></b>:必选,任何有效的字符串表达式。<br><b><font color="#0076b3">compare</font></b>:可选,指定字符串比较的类型
compare参数设置值列表
6.8 常见的日期函数应用
6.8.1 使用日期型变量的函数
1、 使用Now()获取当前日期与时间
2、使用Day()、Month()、Year()函数获取指定日期字符串中的日、月、年
3、 使用Hour()、minute()、Second()和Time()函数获取当前时间的时、分、秒
4、使用weekday()或weekdayName()函数查看日期的星期数
firstdayofweek参数值列表
weekday()返回值
6.8.2 使用函数对日期进行计算
1、计算日期与整数之和
语法结构<br><font color="#c41230">DateAdd(interval,number,date)</font><br><br><b><font color="#0076b3">interval</font></b>:必选,字符串表达式,是要加上的时间单位<br><b><font color="#0076b3">number</font></b>:必选,数值表达式,是要加上的时间间隔,其数值可以为正数(得到未来的日期),也可以为负数<br><b><font color="#0076b3">date</font></b>:必选,表示日期的字符串或字符串表达式<br>
例:统计预计完成时间<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim i as integer:i=4<br>do<br>if sht.cells(i,4)<>"" then<br>sht.cells(i,8)=DateAdd("YYYY",sht.cells(I,4),sht.cells(i,3))<br>elseif sht.cells(i,5)<>"" then<br>sht.cells(i,8)=DateAdd("Q",sht.cells(i,5),sht.cells(i,3))<br>elseif sht.cells(I,6)<>"" then<br>sht.cells(i,8)=dateadd("M",sht.cells(i,6),sht.cells(i,3))<br>else<br>sht.cells(i,8)=dateadd("D",sht.cells(i,7),sht.cells(i,3))<br>end if<br>i=i+1<br>loop until sht.cells(i,2)=""<br>end sub</font></b>
2、计算两日期间的间隔
语法结构<br><font color="#c41230">Datediff(interval,date1,date2[,firstdayofweek[,firstweekofyear]])</font><br><br><b><font color="#0076b3">interval</font></b>:必选,字符串表达式,是要加上的时间单位。<br><b><font color="#0076b3">date1/date2</font></b>:必选,Date型,计算中要用到的两个日期。<br><font color="#0076b3"><b>firstdayofweek</b></font>:可选,指定一个星期的第一天,默认星期日为第一天。<br><b><font color="#0076b3">firstweekofyear</font></b>:可选,指定一年的第一周,
例:计算到期日期及剩余天数<br><b><font color="#c41230">sub a()<br>dim sht as worksheet<br>set sht=worksheets("sheet1")<br>dim i as integer:i=2<br>Do<br>sht.cells(i,4)=dateadd("M",sht.cells(i,3),sht.cells(i,2))<br>sht.cells(i,5)=datediff("D",date,sht.cells(i,4))<br>i=i+1<br>loop until sht.cells(i,1)=""<br>end sub</font></b>
interval参数值列表
firstweekofyear参数值列表
3、使用Datepart()获取指定日期在指定年的第几天、第几周或第几月
语法结构<br><font color="#c41230">Datediff(interval,date1,date2[,firstdayofweek[,firstweekofyear]])</font><br>返回的值为Integer数据<br><b><font color="#0076b3">interval</font></b>:必选,字符串表达式,是要加上的时间单位。<br><b><font color="#0076b3">date</font></b>:必选,Date型,表示要指定的日期。<br><b><font color="#0076b3">firstdayofweek</font></b>:可选,指定一个星期的第一天,默认星期日为第一天。<br><b><font color="#0076b3">firstweekofyear</font></b>:可选,指定一年的第一周,
例:检测今天是本年度的第几天<br><b><font color="#c41230">sub a()<br>dim Myday as integer,myJD as integer<br>dim myweek as integer,mymonth as integer<br>myday=datepart("Y",date)<br>myjd=datepart("Q",date)<br>myweek=datepart("ww",date,vbmonday,vbfirstJan1)<br>mymonth=datepart("M",date)<br>msgbox "今天的日期:" & date & chr(10) & "今天是本年的第" & myjd & "季度" & _<br> "今天是本年的第" & mymonth & "个月" & "今天是本年的第" & myweek & "周" &_<br> "今天是本年的第" & myday & "天" <br>end sub</font></b>
6.8.3 日期格式转换
语法结构<br><font color="#c41230">formatDateTime(Date[,NamedFormat])</font><br><br><b><font color="#0076b3">date</font></b>:必选,是指要被格式化的日期表达式。<br><b><font color="#0076b3">namedformat</font></b>:可选,数字值。
Nameformat参数的设置值列表
例:自制秒表计时器<br><br><b><font color="#c41230">dim Stime as Date,Etime as Date<br>sub a()<br>stime=format(now(),"HH:mm:SS“)<br>range("b1")=stime<br>range("b2:b3").clearcontents<br><br>sub b()<br>etime=format(Now(),"HH:MM:SS")<br>range("B2")=etime<br>range("B3")=format(datediff("S",stime,etime),"#0.00)<br>end sub</font></b>
6.9 实例延伸
七、使用Application控制应用程序
7.1 了解Application控制应用程序
7.2 控制应用程序
7.3 实例延伸
八、使用VBA代码管理工作簿
8.1 了解Workbook对象
8.2 控制工作簿
8.3 响应用户的动作
8.4 实例延伸
九、使用VBA代码管理工作表
9.1 了解Worksheet对象
9.2 管理工作表
9.3 制定工作表响应事件
9.4 实例延伸
收藏
收藏
0 条评论
下一页