在VBA使用ADO可以高效的查询数据,但是写SQL查询语句是个有些令人头痛的事情,其实在ADO中用到的SQL语句的语法并不是很复杂,很多时候是由于即要思考SQL的语法,又要用VBA的字符串连接命令,最终搞得一团糟。
其实,这个创建SQL语句的工作可以交给VBA来完成,当然其前提是——你已经想清楚了要如何构建你的SQL。
1. 定义参数
为了和VBA中数组元素编号一致,称为“参数0”到“参数4”,共5个,分别对应SQL语句的不同部分。代码中给出了“聚合SQL”和“非聚合带排序”两个例子。
2. 使用变量
参数数组也可以用变量,比如需要查询当前年份的记录,参数3初始赋值为"[年]='?'",然后使用下面代码进行替换
aPara(2) = VBA.Replace(aPara(2), REPLACE_CHAR, Year(Date))
3. SQL语句模板
将SQL模板定义为"SELECT ? FROM ? WHERE ? ? ?",共有5个问号,对应5个参数。
4. 可选SQL关键字
由于GROUP BY和ORDER BY是可选部分,因此如果不需要相关部分的话,请将相应的参数置空,参见“非聚合带排序”。
5. 动态创建SQL字符串
准备工作已经完成,循环替换就可以创建SQL字符串,Replace方法的第5个参数需要指定为1,以实现逐个替换。
sSQL = VBA.Replace(sSQL, REPLACE_CHAR, aPara(i), 1, 1, vbTextCompare)
6. 完整代码
Sub CreateSQL()
Dim sSQL, aPara
Const REPLACE_CHAR = "?"
'==============================================================
' aPara = Array("Fields", _ 参数0: 字段
' "Table", _ 参数1: 数据表
' "Where", _ 参数2: 条件
' "Group By", _ 参数3: 分组
' "Order By") 参数4: 排序
'--------------------------------------------------------------
' 聚合SQL
' aPara = Array("[班级],[科目],SUM([成绩])", _
' "[成绩表$A:K]", _
' "[年]='2017'", _
' "[班级]", _
' "[班级],[科目]")
'--------------------------------------------------------------
' 非聚合带排序
aPara = Array("[班级],[科目],[姓名],[成绩]", _
"[成绩表$A:K]", _
"[年]='2017'", _
"", _
"[班级],[科目]")
'--------------------------------------------------------------
' 使用变量替换参数
aPara(2) = VBA.Replace(aPara(2), REPLACE_CHAR, Year(Date))
'==============================================================
sSQL = "SELECT ? FROM ? WHERE ? ? ?"
For i = 0 To 4
If i > 2 And Len(aPara(i)) > 0 Then
aPara(i) = IIf(i = 3, "GROUP BY ", "ORDER BY ") & aPara(i)
End If
sSQL = VBA.Replace(sSQL, REPLACE_CHAR, aPara(i), 1, 1, vbTextCompare)
'Debug.Print sSQL
Debug.Print sSQL
End Sub
7. SQL查询字符串
' 聚合SQL
SELECT [班级],[科目],SUM([成绩]) FROM [成绩表$A:K] WHERE [年]='2017' GROUP BY [班级] ORDER BY [班级],[科目]
' 非聚合带排序
SELECT [班级],[科目],[姓名],[成绩] FROM [成绩表$A:K] WHERE [年]='2018' ORDER BY [班级],[科目]
每次只需要稍加修改参数数组就可以创建出SQL语句,感觉不错吧!大家也可以把这个Sub过程改造成Function函数,更便于在代码中调用。
在VBA使用ADO可以高效的查询数据,但是写SQL查询语句是个有些令人头痛的事情,其实在ADO中用到的SQL语句的语法并不是很复杂,很多时候是由于即要思考SQL的语法,又要用VBA的字符串连接命令,最终搞得一团糟。 其实,这个创建SQL语句的工作可以交给VBA来完成,当然其前提是——你已经想清楚了要如何构建你的SQL。 1. 定义参数 为了...
被人问到一个这样的问题:在ACCESS中创建了窗体,在窗体内的文本框中输入参数,传递给SQLserver的存储过程中,返回结果集,生成报表.已知可以通过ACCESS的传递查询执行SQL的存储过程,问:如何把窗体中输入的参数传入到动态查询中?
以前在软件公司中工作,从来没有这样诡异地使用过ACCESS跟SQLSERVER.但现在发现在企业中,类似的看上去让人不爽的应用还是很多的...
Dim Conn As Object, Rst As Object
Dim strConn As String, strSQL As String
Dim i As Integer, PathStr As String
Set Conn = CreateObject("ADODB.Connection")
Set Rst = Crea
看似没用的东西,在真正需要的时候就会很珍贵。书到用时方恨少,技到用时方恨无啊!所以,在技术面前,要保持一颗敬畏的心。'Union (AlL) 多个select查询结果合并在一起
Sub 合并工作表数据()
Dim data As New 类1
Dim sql As String
sql = "select * from [Sheet1$a:c] union all select * fr...
大家好,我是陈小虾,是一名自动化方向的IT民工。写博客是为了记录自己的学习过程,通过不断输出倒逼自己加速成长。但功能说明:由于水平有限,博客中难免会出现一些BUG,或者有更优方案恳请各位大佬不吝赐教!微信公众号:万能的Excel
在日常工作中,在海量数据中筛选出有用的数据是最常见的工作之一,虽然大部分功能都能通过EXCEL公式,例如VLOOKUP/HLOOKUP/LOOKUP 缺点是速度慢,而且不够灵活添加删除数据。
那么小编今天就带你试试用SQL查询数据:
SELECT * FROM [表名$.
Excel VBA 可以通过 ADODB 对象库来使用 SQL 语句。
首先,需要在 VBA 编辑器中打开“工具”菜单,选择“引用”并勾选“Microsoft ActiveX Data Objects x.x Library”(x.x 为版本号,通常为最新版本)。
接下来,可以使用 ADODB 对象来连接数据库、执行 SQL 查询、更新数据库等操作。下面是一个示例代码,演示如何使用 SQL 查询获...
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
每每提到Excel办公自动化,我们脑海里能想到的就是公式、数据透视表、宏、VBA,这也是我们大部分人数据分析的进阶之路。当我们对于常用VBA技巧已经相当熟练后,往往会有一种“我的VBA知识够用啦”的错觉,其实那只是因为我们收到的实际需求还不够复杂和多样化。
一旦哪天碰