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