类模块详解
一、类模块入门
- vba 中的类模块的概念和其他面向对象的语言里面的类的概念是类似的,就是抽取共性进行封装以便能够重复使用
- 类模块的插入
- 类模块的相关语句如下
1、let:设置对象属性
2、get:获取对象属性
- 梯形类定义
Option Explicit
Dim sd, xd, gao
Property Let 上底(a)
sd = a
End Property
Property Let 下底(b)
xd = b
End Property
Property Let 高(c)
gao = c
End Property
Property Get 高()
高 = gao
End Property
Property Get 面积()
面积 = (sd + xd) * gao / 2
End Property
- 梯形类使用
Sub test1()
Dim t1 As New 梯形
With t1
.上底 = 2
.下底 = 3
.高 = 10
MsgBox .高
MsgBox .面积
End With
End Sub
3、set:设置子对象
- 类模块 setTest
Property Set redCell(rg As Range)
rg.Interior.ColorIndex = 3
End Property
- 使用类:先创建类的实例,再使用实例的子对象、方法和属性
Dim st As New setTest
Sub test()
Set st.redCell = Range("a1:a10")
End Sub
4、sub 和 function:类的方法
- 类的代码
'这是类模块 SheetFunc 的代码
Sub SheetsAdd(str As String)
Dim sht As Worksheet
For Each sht In Sheets
If sht.Name = str Then
k = 1
Exit Sub
End If
Next
Set sht = Sheets.Add
sht.Name = str
End Sub
Function SheetsDel(str As String)
Dim sht As Worksheet
Application.DisplayAlerts = False
For Each sht In Sheets
If sht.Name = str Then
sht.delete
End If
Next
Application.DisplayAlerts = True
End Function
- 测试代码
Sub addsht()
Dim sf As New SheetsFunc
sf.SheetsAdd "四月"
End Sub
Sub delsht()
Dim sf As New SheetsFunc
sf.SheetsDel "三月"
End Sub
二、类模块事件
- 就是在类模块中声明 public 的对象属性
- 然后类模块可以将这个对象的相关事件进行接管,这样我们就可以在类模块中统一定义事件响应代码了
1、命令按钮点击示例
- 如图命令按钮,点击显示自己的 caption 属性,通过类模块完成此功能
- 类模块代码
Option Explicit
Public WithEvents butt As msforms.CommandButton
Private Sub butt_Click()
MsgBox butt.Caption
End Sub
- 窗体代码
Dim butts(1 To 6) As New EventTest
Private Sub UserForm_Initialize()
For i = 1 To 6
Set butts(i).butt = Me.Controls("CommandButton" & i)
Next i
End Sub
- tips:获取工作表插入的image控件
Sub test11()
Set obj = ActiveSheet.OLEObjects("image1").Object
MsgBox obj.BackColor
End Sub
三、类模块封装
- 过程封装
'类模块SubBox代码
Sub red(rg As Range)
rg.Interior.ColorIndex = 3
End Sub
'测试代码
Sub test23()
Dim sb As New SubBox
sb.red Range("a1:b4")
End Sub
- 函数封装
'类模块 Funcs 代码
Function aver(rg As Range)
aver = Application.WorksheetFunction.Average(rg)
End Function
Sub test24()
Dim sb As New Funcs
Debug.Print sb.aver(Range("b1:b3"))
End Sub
- 窗体API封装 (略)
四、类模块的导入导出
- 导出为 cls 后缀文件
- 导入的时候好像先要新建一个类模块才会有导入类模块的入口
数据库操作
一、基本操作
1、VBA操作数据库
- vba 对数据库的操作基于 ADO 对象和 sql 语句
- ado 对象负责建立数据库连接,负责数据库的增删改查的操作
- sql 语句就是直接的操作数据库的指令,ado对象需要通过sql进行数据库操作
- 使用 ADO 对象前先要引入,具体的操作如下
2、简单操作示例
- vba 中一行代码太长可以使用
_
换行
Sub test()
Dim conn As New Connection
Dim rst As New Recordset
Dim excelStr, sqlStr As String
' 这里是换行写的
excelStr = "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" & Excel.ThisWorkbook.Path _
& "\database.xlsm" & ";Extended Properties='Excel 12.0;HDR=YES'"
sqlStr = "select * from [sheet3$]"
conn.Open excelStr
rst.Open sqlStr, conn
Do While Not rst.EOF
Debug.Print rst.Fields("name") & "-" & rst.Fields("age") & "-" & rst.Fields("sex")
rst.MoveNext
Loop
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing
End Sub
3、两个重要的对象
Connection 对象
- 建立数据库连接和操作数据库都靠它,用完后需要释放资源
- connection 对象用 execute 方法来执行 sql 语句,根据是否返回结果集有两种处理方式
'返回结果集
Set rs =conn.Execute("SQL 查询语言")
'不返回结果集,但是可以取到语句影响的行数,后面两参数可选,RecordAffected可返回影响行数
conn.Execute "SQL 操作性语句" [,RecordAffected][, Option]
recordset对象
- 也可以用来操作数据库,但是效率没有 Connection 对象高
- 可以取得查询数据库得到的数据集合,并对数据集进行一定的操作
- 可以通过 addNew 添加数据
rst.Open sqlStr, conn, 0, 3
rst.AddNew Array("name", "age", "sex"), Array("mike11", 23, "woman")
- 可以通过 getRows 获取所有的数据到数组,放到表格的话还需要转置;第一个参数是取的行数,第二个参数是开始行数,前2个参数和最后的参数不匹配的话会报错的,最好不要同时使用
arr = rst.GetRows(, , Array("name", "age"))
参考资料
二者的创建
- 如果已经引入了相应的支持可以直接 new 该对象来使用
dim conn as new Connection
dim rst as new RecordSet
- 不然直接使用 createObject 方法来直接创建
set conn = createObject("adodb.connection")
set rst= createObject("adodb.recordset")
二、参考代码段
- 多种数据库的连接字符串
'连接 sqlserver
sqlserverStr = "Provider=sqloledb;Server=NIKEY-980114BB0;Database=pubs;Uid=sa;Pwd=sa;"
'连接 excel 数据源
excelStr = "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" & Excel.ThisWorkbook.Path _
& "\database.xlsm" & ";Extended Properties='Excel 12.0;HDR=YES'"
'连接 mysql
mysqlStr = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1" _
& "139;DB=test;UID=root;PWD=abc;OPTION=3;"
'连接 oracle
oracleStr = "Provider=OraOLEDB.Oracle.1; user id=" & db_user _
& "; password=" & db_pass & "; data source = " & db_sid & "; Persist Security Info=True"