VBA在处理大量的数据/计算时如果使用常规方法会比较慢,因此需要对其进行性能优化以提高运行速度,一般的方法是数组计算或者sql计算。SQL计算的速度最快,限制也是最多的,数组速度其次,灵活性也更高
如果要在vba中调用sql处理数据基本可以遵循一个套路,只要修改其中的SQL语句即可
调用sql处理数据VBA代码如下,其中’##### #####中的地方是每次运行时要根据情况修改的:
Sub Sql_Query()Dim Conn As Object, Rst As ObjectDim strConn As String, strSQL As StringDim i As Integer, PathStr As StringSet Conn = CreateObject("ADODB.Connection")Set Rst = CreateObject("ADODB.Recordset")PathStr = ThisWorkbook.FullName Select Case Application.Version * 1 '设置连接字符串,根据版本创建连接(不同版本的excel连接是不同的)Case Is <= 11strConn = "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties=excel 8.0;Data source=" & PathStrCase Is >= 12strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & PathStr & ";Extended Properties=""Excel 12.0;HDR=YES"";"""End SelectstrSQL = "Select * FROM [rawdata$]" '####在这里改SQL查询语句####Conn.Open strConn '打开数据库链接Set Rst = Conn.Execute(strSQL) '执行查询,并将结果输出到记录集对象With ThisWorkbook.Sheets("sql data") '#####在这里更改输出的位置对应的表名####.Cells.ClearFor i = 0 To Rst.Fields.Count - 1 '填写标题.Cells(1, i + 1) = Rst.Fields(i).Name '在第一行输出字段名Next i.Range("A2").CopyFromRecordset Rst '从A2单元格开始输出.Cells.EntireColumn.AutoFit '自动调整列宽End WithRst.Close '关闭数据库连接Conn.CloseSet Conn = NothingSet Rst = NothingEnd Sub
接下来,开始学习SQL语句语法
1.基于一张工作表的查询语法
SQL语法格式比较固定,只需要根据特定的语法顺序,再根据需求加减关键字即可。首先我们给出一个比较全的格式如下:
SELECT [DISTINCT] [TOP <数值> [PERCENT]] 列标题 [聚合函数] [[AS] <别名列标题>] FROM 表或查询 [[AS] <别名>] [WHERE <筛选条件>] [ORDER BY <排序项> [ASC|DESC]]
说明:
- <>表示必选项,[]表示可选项,|表示多选一。
- SQL语句中不区分大小写,上述式中的的大写意为SQL中关键字
- SELECT 关键字:选取关键字
- DISTINCT关键字:去除重复的行
- TOP 关键字:显示前几条记录
- PERCENT关键字:TOP 与 PERCENT 组合在SQL语句中的使用可以按照百分比提取数据
- AS关键字:给标题列重新命一个新名称
- FROM关键字:给定数据源的名称
- WHERE关键字:筛选条件语句
- ORDER BY关键字:排序,一般和ASC|DESC一起使用,将结果升序或者降序排列。
接下来详细讲解每一个关键字的使用:
SELECT关键字和FROM 关键字
SELECT关键字和FROM 关键字是每个SQL语句中都必须要有的关键字。SELECT关键字可以选取最终需要显示所有字段,而FROM关键字则用于告诉程序数据源的位置在哪里。VBA中一个最基本的SQL语句写法如下:
SELECT 列字段名1,列字段名2,列字段名3...... FROM [工作表名称$]
例如我们需要从student这一个sheet中取出ID,name,address,score这四列数据:
select ID,name,address,score from [student$]
也可以使用[]将列名括起来表示这是一个列名
select [ID],[name],[address],[score] from [student$]
如果需要取所有的列,可以直接使用“*”号来取全部的列,从而减少代码量
#*号是代表全部列
select * from [sheet1$]
AS关键字
AS关键字用于给字段或者数据源表取别名,从而简化一些比较长的表名或字段名
#从student表中选取姓名列,并重命名为Name
SELECT 姓名 AS Name FROM [Student$]
DISTINCT关键字
DISTINCT关键字功能是去重,语法结构为:
SELECT DISTINCT 要去重复值的字段1,要去重复值的字段2...... FROM [工作表名$]
举例如下:
#选取所有不重复的name
Select Distinct name From [student$]
#选取name和ID都不重复的数据
Select Distinct name,ID From [student$]
WHERE关键字
where关键字可以按条件筛选数据。WHERE语句后可以有一个或多个条件,条件之间可以用操作符AND 或者OR进行连接。
WHERE语句的语法结构如下:
SELECT 列字段名称 FROM [表名称$] WHERE 条件
where后的条件语句可以是运算符或逻辑判断,包含大于、小于、等于、不等于、大于或等于、小于或等于、IN、 BETWEEN、AND、NOT等。
#选取取消费金额等于100的数据
SELECT * FROM [test$] where 消费金额=100
#选取级别为A的数据
SELECT * FROM [test$] where 级别='A'