咔片PPT · AI自动生成演示文稿,模板丰富、排版精美 讯飞智文 · 一键生成PPT和Word,高效应对学习与办公

大家好,今日我们继续VBA与数据库的学习,最近的讲解是ADO与EXCEL的连接,从而实现许多方便快捷的操作,这里的EXCEL是作为数据库应用的,在本书数据库的讲解中,连接详细讲解的就只有accdb数据库和excel数据库了,两者各有不同,对于EXCEL而言是非常大众化的数据处理软件,利用的非常广泛,而accdb数据库是一个专门的数据库。两个可以相互的取长补短,比如excel数据库我在讲解的时候,尽可能的不去执行实际打开的操作,只是提取数据的处理。这样可以发挥EXCEL的优点,而避开文件容易改动的缺点。

今日讲解的是如何利用ADO完成相对复杂的数据运算,我们先看下面的EXCEL数据:

这时几种药品在1到6月份的销售情况,记录在15年.xlsx的工作表sheet3中,我们要提出数据,但我们关心的不是每月的销售情况,而关心的是每月销售的增加情况,和每种药品在上半年的销售总额是多少,我们要把每月销售的增减和半年的销售总额汇总出来,而不打开文件,这个程序用ADO连接该怎么写呢?

看下面的代码:

Sub mynzexcels_5()

'第36讲,利用ADO,实现EXCEL工作表数据的复杂计算

Dim cnADO, rsADO, Z As Object

Dim strPath, strTable, strSQL As String

Set cnADO = CreateObject("ADODB.Connection")

strPath = ThisWorkbook.Path & "" & "15年.xlsx"

strTable = "[sheet3$a2:G9]"

'建立连接,提取数据

cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath

strSQL = "select F1,F3-F2,F4-F3,F5-F4,F6-F5,F7-F6,F2+F3+F4+F5+F6+F7 from " & strTable

Set Z = cnADO.Execute(strSQL)

Range("a:g").ClearContents

Range("a1:g1") = Array("药品名", "2月-1月", "3月-2月", "4月-3月", "5月-4月", "6月-5月", "半年合计")

[a2].CopyFromRecordset Z

cnADO.Close

Set cnADO = Nothing

End Sub

代码截图;

代码讲解:

1 strTable = "[sheet3$a2:G9]" 这里设定了数据库的取值范围是A2:G9的单元格

2 strSQL = "select F1,F3-F2,F4-F3,F5-F4,F6-F5,F7-F6,F2+F3+F4+F5+F6+F7 from " & strTable 在这句中,就SQL语句我们分别定义了几个列的值分别来自上述的数据范围,这几个列的值是F1: 数据源工作表的第一列;F3-F2: 数据源工作表的第3列减去第2列;F4-F3: 数据源工作表的第4列减去第3列;F5-F4, 数据源工作表的第5列减去第4列;等等,最后的一列是F2+F3+F4+F5+F6+F7,是数据源工作表的6列数值相加。

3 Range("a1:g1") = Array("药品名", "2月-1月", "3月-2月", "4月-3月", "5月-4月", "6月-5月", "半年合计") 这句是把上述数据提取出来后要再安上列的标题。

下面看我们的运行情况:

最后的运行结果:

大家要清楚,为什么要引入ADO来操作数据库和EXCEL呢?操作速度是非常快的。

今日内容回向:

1 如何利用ADO 实现多数据的复杂计算?

2 上述代码是否真的清楚了呢?