vba-类持续更新
一,用途
让代码可读性更强
调用excel对象的一些事件,如程序级事件,内嵌图表事件,菜单命令事件(后续会学)等
封装API,让代码更简捷易懂(后续会学)
创建控件数组
团队协作时,编写完整模块后可以方便队友调用,减少开发时间
- property let
作用:生成对象的可写入属性。
Property Let 属性名称(参数)
语句
End Property
属性名称和参数名称都是自定义的。参数的作用是传递外部信息,是必须的,语句是对传递过来的外部参数进行处理。
2. property Get()
作用:生成对象的可读取属性。
Property Get 属性名称(参数)
语句
End Property
3. Property Set
作用:生成子对象。
Property Set 子对象名称(对象)
语句
End Property
4. Sub语句
作用:生成方法。
5. Function语句
五、使用类模块
使用类,首先要创建一个新的实例。即
dim 变量 as new 类模块名称
创建后,就可以使用该类的对象、方法和属性了。
下面举四个例子:
- MyRng类
定义此类有两个属性,红色单元格和绿色单元格。而选了红色单元格属性就是单元格变红,选了绿色单元格属性就是单元格变绿。参数是单元格。
①创建类模块
Option Explicit
Property Set 红色单元格(rng As Range) '生成可读取属性
rng.Interior.ColorIndex = 3
End Property
Property Set 绿色单元格(rng As Range) '生成可读取属性
rng.Interior.ColorIndex = 4
End Property
②调用
Sub 设置单元格()
Dim rggg As New MyRng '定义变量rggg是MyRng类
Set rggg.红色单元格 = Range("B5") '把单元格B5划分到rggg类,让B5具有红色单元格属性
Set rggg.绿色单元格 = Range("B6") '把单元格B6划分到rggg类,让B5具有绿色单元格属性
End Sub
当你输入rggg.的时候,就会弹出红色单元格和绿色单元格属性供选择,这也是创建类的一个方便之处。而且如果创建了类模块,但没有弹出属性,那就可能是没有创建好类模块了。
2. 日报表类
定义日报表类的参数是工作表,它的Range("A1:G1")合并,并输入居中标题"营业日报表"
①创建类模块
Property Set 模板(sh As Worksheet)
sh.Range("A1:G1").Merge
sh.Range("A1") = "营业日报表"
sh.Range("A1").HorizontalAlignment = xlCenter
End Property
②调用
Sub 设置模板工作表类模块方法()
Dim shh As New 日报表 '创建一个日报表类的变量
Set shh.模板 = Sheets("sheet2") '把工作表"sheet2"划分为日报表类
End Sub
3. 梯形面积类
创建一个类用于计算梯形面积,梯形面积=(上底+下底)*高/2,根据公式,需要三个属性:上底、下底、和高。用参数来传递数值给属性。
①创建类模块
Option Explicit
Dim Shangdi, Xiadi, gao '设置公共变量去传递到属性的参数,以便后续计算
Property Let 上底(shdi) '生成可写入属性
Shangdi = shdi
End Property
Property Let 下底(xdi) '生成可写入属性
Xiadi = xdi
End Property
Property Let 高(g) '生成可写入属性
gao = g
End Property
Property Get 面积() '生成可读取属性
面积 = (Shangdi + Xiadi) * gao / 2
End Property
② 调用
Sub 面积之类模块()
Dim 梯形 As New 梯形面积
With 梯形
.上底 = 2 '赋值
.下底 = 3
.高 = 4
MsgBox "梯形面积:" & .面积
End With
End Sub
4. 万能计算器类
创建一个类对数值进行求和、平均数和个数的计算,并输出结果到立即窗口。
①创建类模块
Option Explicit
Dim rng As Range '设置公共变量,因为计算要用相同区域
Property Set 单元格区域(rg As Range) '生成可读取属性
Set rng = rg
End Property
Sub 求和()
Debug.Print "求和:" & Application.Sum(rng)
End Sub
Sub 平均数()
Debug.Print "平均数:" & Application.Average(rng)
End Sub
Sub 求个数()
Debug.Print "个数:" & Application.CountA(rng)
End Sub
② 调用
Sub 计算()
Dim 计算 As New 万能计算器
With 计算
Set .单元格区域 = Sheets("sheet3").Range("a1:a10")
.求和
.平均数
.求个数
End With
End Sub
运行结果
六、小结
其实以上的功能直接在模块中写也可以的,但设置了类模块,让代码更简洁、可读性更强了。
来个复习,把上面的日报表和梯形面积的代码在模块中写:
- 日报表
语句代码其实和类模块中一致
Sub 设置模板(sh As Worksheet)
sh.Range("A1:G1").Merge
sh.Range("A1") = "营业日报表"
sh.Range("A1").HorizontalAlignment = xlCenter
End Sub
使用的时候,直接调用宏:
Sub 设置模板工作表调用宏方法()
设置模板 Sheets("sheet2")
End Sub
2. 梯形面积
设置为自定义函数
Function mianji(上底, 下底, 高)
mianji = (上底 + 下底) * 高 / 2
End Function
使用时调用自定义函数:
Sub 面积之自定义函数()
MsgBox mianji(2, 3, 4)
End Sub