概述:接上一章 中篇, 本节涉及是Sub Function 等过程和函数
8、Sub 过程, 基本的程序单元
过程处理事情的步骤,例如:坐公交 , 上车-》刷卡-》找位子-》坐下
8.1、 关于VBA过程
什么是VBA过程
其实你要完成某一任务所需要步骤,也就是代码块集合
VBA里有哪些过程
VBA的基本过程有Function过程和Sub过程两种
8.2、 编写Sub过程需要了解的内容
语法:
[Private| Public] [Static] Sub 过程名([参数列表]) (如果不写默认是Public, Static表示保存该过程里声明的本地变量)
[语句块]
[Exit Sub] (退出过程)
[语句块]
End Sub
8.3、从另一个过程执行过程
以上篇评定学生成绩为例
方法一:输入过程名以及参数、参数用逗号隔开
Sub caseTest()
Dim i# '定义变量保存结果,你是否记得#代表整数
For i = 1 To 10 Step 1
rank (i)
Next i
End Sub
Sub rank(i)
Dim score As String
Select Case Range("A" & i) '获取单元格Ai的值
Case Is >= 90
score = "优"
Case Is >= 80
score = "良"
Case Is >= 70
score = "中"
Case Is >= 60
score = "及格"
Case Else
score = "不及格"
End Select
Range("B" & i) = score '将值写到单元格Bi
End Sub
方法二:在过程名称以及参数前使用Call关键字,参数用括号括起来,并用逗号隔开
语法: Call 过程名 [(参数1,参数2,...)]
上面例子只要将 rank(i) 修改成 Call rank(i) 即可
方法三:利用 Application 对象的Run方法,
语法: Application.Run 表示过程名的字符串(或字符串变量) , 变量一,变量二。。。。
上面例子:将rank(i) 修改成 Application.Run "rank", i
8.4、过程的作用域
公共过程(默认就是公共过程)
Public Sub 公共()
MsgBox "公共过程"
End Sub
私有过程 (Private修饰,表示只能在本模块使用)
Public Sub 私用()
MsgBox "这是私有过程"
End Sub
注意:如果你将一个模块所有的方法声明为私有方法,只要在最前面写上"Option Private Module"可以了。
3.9、 自定义函数、Function过程
Function与Sub的区别就是Function有返回值,而Sub没有
语法:
Function 函数过程名(参数1,参数2,...)
函数过程名 = 结果 (注意返回的结果变量和过程名一样)
End Function
9.3、怎么统计指定颜色的单元格个数
问题一:单元格是什么颜色
Range("B1").Interior.Color = RGB(255, 255, 0) (意思就是将单元格B1设置底纹为黄色)
写一个判断是否单元格是否为黄色函数,如果是值为1,否则为0
'温馨提示:在写过程或函数,先写死后写活。
'就是先指定某个单元格,后设置为变量
Function countColor()
'引用单元格的值改变函数会重写计算,注意是值
'利用背景色,字体颜色都不会引起函数重新计算
Application.Volatile True
If Range("A1").Interior.Color = RGB(255, 255, 0) Then
countColor = 1
Else
countColor = 0
End If
End Function
修改一下,计算A1:A10单元格所有颜色为黄色的单元格的数量
'温馨提示:在写过程或函数,先写死后写活。
'就是先指定某个单元格,后设置为变量
Function countColor()
'引用单元格的值改变函数会重写计算,注意是值
'利用背景色,字体颜色都不会引起函数重新计算
Application.Volatile True
Dim rng As Range
For Each rng In Range("A1:A10")
If rng.Interior.Color = RGB(255, 255, 0) Then
countColor = countColor + 1
End If
Next rng
End Function
继续修改升级,计算某个区域所有的黄色单元格的数量
Function countColor(arr As Range)
Application.Volatile True
Dim rng As Range
For Each rng In arr
If rng.Interior.Color = RGB(255, 255, 0) Then
countColor = countColor + 1
End If
Next rng
End Function
继续升级,自定义函数指定第二个参数,第二参数就是某个单元格,与这个单元格底纹颜色的个数是多少
Function countColor(arr As Range, c As Range)
Application.Volatile True
Dim rng As Range
For Each rng In arr
If rng.Interior.Color = c.Interior.Color Then
countColor = countColor + 1
End If
Next rng
End Function
9.4、声明函数过程、规范的语句
[Public | Private] [Static] Function 函数名([参数列表]) (As 数据类型)
[语句块]
[函数名=过程结果]
[Exit Function]
[语句块]
[函数名=过程结果]
End Function
10、合理地组织程序,让代码更优美
10.1、代码排版,必不可少的习惯
10.2、怎么排版代码
缩进、代码更优层次
更改长行代码为短行代码
Sub test()
Application.Workbooks("Book1").Worksheets("Sheet1") _
.Range("A1:D100").Font.Bold = True
End Sub
也就是采用 “
_” 空格下划线进行换行
把多行合并为一行
Sub test()
Dim a%, b%, c%: a = 1: b = 2: c=3
End Sub
采用“
:” 采用冒号,注意都是英文模式下的
10.3、注释,让代码的意图清晰明了
添加注释
方法一: "'" 单引号开头 (英文模式下的)
方法二: Rem 替换 单引号
10.4、批量注释