Excel VBA(09)类模块和数据库操作

类模块详解

一、类模块入门

  • 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 属性,通过类模块完成此功能
    Excel VBA(09)类模块和数据库操作_第1张图片
  • 类模块代码
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 对象前先要引入,具体的操作如下
    Excel VBA(09)类模块和数据库操作_第2张图片

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"))

参考资料

  • http://www.360doc.com/content/18/0929/17/2548375_790737083.shtml
  • https://www.sohu.com/a/238562802_417040
二者的创建
  • 如果已经引入了相应的支持可以直接 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"

IE与网络操作(略)

API函数使用(略)

代码和函数封装(略)

你可能感兴趣的:(其他)