达永编程网

程序员技术分享与交流平台

VBA|以SQL的方式操作(查询、汇总)工作表

在VBA中,可以将Excel工作表作为数据库进行访问,通过ADO(活动数据访问对象)访问Excel中的数据。同时,在Excel中也可以访问数据库(如Access、SQ LServer等)中的数据,并将数据填充到Excel工作表中。

因为Excel具有易用性、通用性和庞大的用户群,在一些小的应用程序中,可以将Excel作为后台数据库,用来保存用户的数据。

ADO(ActiveX Data Objects)是微软的一种数据访问技术,它被设计用来提供通用数据访问。ADO 对象模型定义了一个可编程的分层对象集合,主要由三个对象成员(Connection、Command 和Recordset),以及几个集合对象Errors、Parameters 和Fields 等组成。

可以使用Connection 对象连接到数据源,通过该对象可生成ADO 层次中的其他对象。

在VBA 中使用ADO 对象,必须先为当前工程引用ADO 的对象库,选择菜单“工具/引用”,打开“引用”对话框,在列表框中找到“Microsoft ActiveX Data Objects 2.8 Library”选项并选中,如下所示。

将ADO 对象库添加到当前工程中后,就可以使用ADODB.Connection 定义数据库连接对象变量,以及其他ADO 对象变量。

有如下工作表(表名是数据库):

商品名称

规格型号

颜色

单位

单价

期初库存

三星手机

E508

3500.00

5

诺基亚手机

3200

2800.00

5

诺基亚手机

7260

3200.00

2

三星手机

808

1000.00

2

摩托罗拉手机

1200

3880.00

2

摩托罗拉手机

V3

1560.00

1

摩托罗拉手机

V3i

2200.00

1

按商品名称模糊查询记录:

Sub 以SQL方式查询数据()
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strSql As String, str1 As String
    
    On Error Resume Next

    Set cnn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Extended Properties=Excel 8.0;" _
            & "Data Source=" & ThisWorkbook.FullName
    str1 = ActiveSheet.Range("A2")
    strSql = "Select * FROM [数据库$] Where 商品名称 like '%" & str1 & "%'"
    rs.Open strSql, cnn, adOpenStatic
    
    With ActiveSheet
        .Range("A5:G1000").ClearContents
        .Range("A5").CopyFromRecordset rs
    End With
    
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
End Sub

活动工作表的效果如下:

查找名称






三星












商品名称

规格型号

颜色

单位

单价

期初库存

三星手机


3500

5.00

三星手机

808

1000

2.00

记录集返回从数据库取回的查询结果集,可使用记录集的Open 方法打开记录集,该方法的语法格式如下:

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

各参数的含义如下。

● Source:为变量名、SQL 语句、表名、存储过程调用等。

● ActiveConnection:为连接数据库的连接字符串。

● CursorType:确定提供者打开Recordset 时应该使用的游标类型。

● LockType:确定提供者打开Recordset 时应该使用的锁定(并发)类型。

● Options:用于指示提供者如何计算Source 参数(如果它代表的不是Command 对象),或从以前保存Recordset 的文件中恢复Recordset。

据按“商品名称”进行汇总:

Sub 汇总数据()
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strSql As String, str1 As String
    
    On Error Resume Next

    Set cnn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Extended Properties=Excel 8.0;" _
            & "Data Source=" & ThisWorkbook.FullName
    strSql = "Select 商品名称, sum(期初库存) FROM [数据库$] group by 商品名称"
    rs.Open strSql, cnn, adOpenStatic
    
    With Sheet1
        .Range("A2:G1000").ClearContents
        .Range("A2").CopyFromRecordset rs
    End With
    
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
End Sub

将Excel 作为数据库可用在一些小型应用中,对于需要处理大量的数据时,更多的还是使用专业的数据库系统(如Access、SQL Server 数据库系统等)。在很多情况下,用户希望从这些专业的数据库系统中获取部分数据,然后在Excel 中进行分析处理。

ref

吴永佩,成丽君 《征服Excel VBA:让你工作效率倍增的239 个实用技巧 》

-End-

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言