经典EXCEL VBA SQL语句
ExcelVBAADOSQL入门教程022:EXECUTE

ExcelVBAADOSQL入门教程022:EXECUTE1.诸君好,我们今天聊Connection对象的Execute方法;该方法可以向数据库提交查询,比如SQL语言,是我们系列教程中经常使用到的——其语法如下:Connection.Execute CommandText,RecordsAffected, Options第1个参数CommandText为字符串类型,是必须的,用来指定提交的查询,比如SQL语句。
第2个参数RecordsAffected是可选的输出参数,用来指定查询影响的行数。
第3个参数Options也是可选参数,用于指定命令类型和可能的CommandTypeEnum值的详细信息。
第2~3参数,作为新手我们基本用不到,所以就当没看到。
2.Execute方法有两种使用形式。
一种是Cnn.Execute SQL;另一种是Cnn.Execute(SQL)。
没错。
两者看似一样,但以鲁迅他老人家两棵枣树般寂寞的情怀发誓,其实并不一样后者比前者多了一对括号……当Execute执行的SQL语句是不需要返回记录集时,例如对数据库数据的删除、新增、更新等,Execute方法的参数,既可以加括号,也可以不加括号,比如:Cnn.Execute 'delete from 成绩表 where 姓名='马可波罗''也可以写成:Cnn.Execute ('delete from 成绩表 where 姓名='马可波罗'')而当Execute指定的SQL语句是需要返回记录集,也就是SELECT 查询语句时,由于VB语法规定带返回值的调用其参数必须加括号,因此就需要对SQL语句加上一对括号了。
……举个例子:Sub DoExecute2()Dim cnn As Object, rst As ObjectDim i As Long, Sql As StringSet cnn = CreateObject('adodb.connection')cnn.Open 'Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=' & ThisWorkbook.FullName '创建到代码所在工作簿的连接,Excel版本非03版Sql = 'select * from [成绩表$]' 'Sql语句Set rst = cnn.Execute(Sql) 'Execute执行Sql语句Cells.ClearContentsFor i = 0 To rst.Fields.Count - 1'遍历获取记录集中的标题Cells(1, i 1) = rst.Fields(i).NameNextRange('a2').CopyFromRecordset rst'获取记录集中的记录cnn.Close '关闭连接Set cnn = Nothing '释放内存End Sub上面的代码Set rst = cnn.Execute(Sql),得到一个新的、只读属性的Recordset记录集,该记录集由标题和记录行两部分构成;我们通过遍历循环的方式,将该记录集的标题名()依次放置到表格的第1行;并使用单元格的CopyFromRecordset方法,将查询记录放置到右上角为A2单元格的区域内。
Excel如何用VBASQL筛选多个工作表的数据?VBA,SQL,筛选,数据

Excel如何用VBASQL筛选多个工作表的数据?VBA,SQL,筛选,数据免责声明:本文来源于网络,版权归原创作者所有,如有侵权,请联系删除。
学习一下版主的代码,把字段名也用代码加入Sub a()Range('A1:L1000').ClearContents '清空A2:L1000区域的数据Set Conn = CreateObject('adodb.connection') '创建ADO链接方式Set rs = CreateObject('adodb.recordset')Conn.Open 'provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=' & ThisWorkbook.FullName '打开数据源链接For i = 1 To Sheets.Count - 1 '循环第一个到倒数第二个工作表Sq = Sq & 'select * from [' & Sheets(i).Name & '$] where 积分 > 10 ' & ' union all ' '每个数据表的符合积分大于10分的数据都进行连接起来Next iSq = Left(Sq, Len(Sq) - 11) '因为循环倒数第二个工作表时,sq语句最后还是链接到 union all ,一共有11个字符,这时要提取sq字符串中不包含最后11个字符的字符串Set rs = Conn.Execute(Sq)For i = 1 To rs.Fields.Count '把选取的字段名写到表格Sheets('查询').[a1].Cells(1, i) = rs.Fields(i - 1).NameNextSheets('查询').[A2].CopyFromRecordset rs '在A2执行该SQL语句,并且使用了CopyFromRecordset执行方法Conn.CloseSet Conn = NothingEnd Sub。
分享ExcelVBA中SQL查询模块代码

分享ExcelVBA中SQL查询模块代码分享Excel VBA中SQL查询模块代码更多最近一直在写VBA,因为涉及到的统计比较多,且资料量也比较大,所以比较喜欢用ADO+SQL的方法,但这样就在程序中多次出现定义对象--连接数据库--执行查询--输出结果这个过程,所以干脆整理出来,做一个模块,这样以后随时可以调用,且应用起来比较方便,不会被一大堆的代码搞晕。
模块名称为queryinfo,参数ssql为SQL语句,biaoming为结果输出的表名称,weizhi为输出表位置的左上角单元格。
引用示例:Call queryinfo("SELECT field1,field2 FROM [sheet1$]","sheet2","A2")表示查询表1中的第一、第二字段的数据输出到表2,在表2中从A2单元格开始写入数据。
模块代码:Sub queryinfo(ssql As String, biaoming As String, weizhi As String)Dim conn As ADODB.ConnectionSet conn = New ADODB.Connectionconn.Open "Provider=Microsoft.Jet.Oledb.4.0;" & _"Extended Properties=Excel 8.0;" & _"Data Source=" & ThisWorkbook.Path & "\" & If conn.State = adStateOpen ThenSheets(biaoming).Range(weizhi).CopyFromRecordset conn.Execute(ssql)conn.CloseEnd IfSet conn = NothingEnd Sub。
ExcelVBAADOSQL入门教程013:子查询

ExcelVBAADOSQL入门教程013:子查询1.诸君好,今天咱们聊SQL查询语句中的子查询……什么是子查询?简单理解,子查询就是嵌套在查询中的查询。
为什么要使用子查询?……很多时候,我们对数据的查询处理不是一个查询语句就可以完成的;不能完成的原因,可能是查询条件比较复杂,也可能是受困于SQL自身语法的限制;介时,子查询作为查询条件的重要组成部分,用在WHERE子句以及HAVING子句中,可以帮助我们快速灵活的完成查询操作……举个栗子。
SELECT 姓名 FROM [成绩表$] WHERE 语文>(SELECT MIN(语文) FROM [成绩表$] )(SELECT MIN(语文) FROM [成绩表$] )是一个子查询,计算成绩表中语文的最低分,外面的那层SELECT查询语句是主查询。
整个语句的意思就是查询成绩表中语文成绩大于最低分的’姓名’记录。
可能有朋友问,为什么语句不直接写成:SELECT 姓名 FROM [成绩表$] WHERE 语文>MIN(语文)问的好,鼓掌,变脸——出门左拐,重看第10章吧:Excel VBA+ADO+SQL入门教程010:分组聚合……如上例所示,从语句形式上来看,子查询有两个特点:1),子查询需要包含在括号内。
2),子查询通常放在比较条件的右侧;这不是必需的,但系是约定成俗的。
另外,从查询结果上来看,子查询可以分为两个类别:1),单行子查询:或称单值子查询,顾名思义,子查询的结果集是一个值。
2),多行子查询:再次顾名思义,子查询的结果集是多行。
需要提前说明的是,单值子查询是常见且实用的;多行子查询则是相对少见的;从效率上来讲,多行子查询通常也不是解决问题的最优方案,大都可以使用连接查询代替;因此……建议初学者掌握单值子查询,了解多行子查询。
2.先说单值子查询……单值子查询,由于只返回一个值,我们可以使用<、>、=、>=、<><>等运算符对其进行判断运算。
excel vba sql语句示例

excel vba sql语句示例Excel VBA中SQL语句示例-以中括号为主题在Excel VBA中,SQL(Structured Query Language)是一种用于管理关系数据库的语言。
它允许用户从数据库中检索数据,更新和删除数据,并与数据库进行交互。
中括号[]在SQL语句中用于标识数据表或字段名称。
本文将介绍几个常用的Excel VBA中使用SQL语句并涉及中括号的示例。
1.查询数据表中所有字段使用SELECT语句可以从数据表中选择一条或多条记录。
要选择所有字段,可以使用“*”或字段列表。
使用“*”选取所有字段非常方便,但不建议在大型数据表中使用。
以下是一个示例,它使用“*”选取数据表中的所有字段。
Sub SelectAllFields()'Define variablesDim cn As ADODB.ConnectionDim rs As ADODB.RecordsetDim strQuery As String'Open connection to the databaseSet cn = New ADODB.Connectioncn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\User\Documents\Database.accdb;Persist Security Info=False;"cn.Open'Create SQL query to select all fields from the data tablestrQuery = "SELECT * FROM [Data Table]"'Execute the query and store the result in a recordsetSet rs = cn.Execute(strQuery)'Close the database connectioncn.CloseSet cn = NothingEnd Sub2.根据条件查询数据表中的记录使用WHERE子句可以根据指定的条件从数据表中检索一条或多条记录。
VBA与SQL语句的结合与应用实例

VBA与SQL语句的结合与应用实例在现代信息化时代,数据处理已经成为各个行业中不可或缺的一环。
在处理大量数据时,使用Excel和SQL数据库是非常常见的选择。
而结合VBA(Visual Basic for Applications)和SQL语句,可以将两者的优势发挥到极致,提高数据处理的效率和准确性。
本文将通过一些实例来展示VBA与SQL语句的结合与应用。
案例一:数据导入与清洗假设我们有一个存储了客户订单的Excel表格,我们需要将其中的数据导入到SQL数据库中进行进一步处理。
这时,我们可以使用VBA编写一个宏来实现自动将Excel中的数据导入到数据库表中。
首先,我们需要在Excel中添加一个按钮,通过宏来触发数据导入的操作。
然后,我们可以使用VBA代码来连接到数据库,并执行相应的SQL语句将数据导入。
示例代码如下:```vbaSub ImportDataToSQL()Dim conn As ObjectDim rs As ObjectDim strSQL As StringDim rng As RangeDim cell As RangeSet conn = CreateObject("ADODB.Connection")conn.ConnectionString = "Provider=<provider>; Data Source=<data_source>; Initial Catalog=<catalog>; User ID=<user_id>; Password=<password>"conn.OpenSet rng = ThisWorkbook.Sheets("Sheet1").Range("A2:D10") ' 假设数据范围为A2:D10strSQL = "INSERT INTO TableName (Column1, Column2, Column3, Column4) VALUES (?,?,?,?)"For Each cell In rngSet rs = CreateObject("ADODB.Recordset")rs.Open strSQL, connrs.AddNewrs.Fields("Column1").Value = cell.Offset(0, 0).Valuers.Fields("Column2").Value = cell.Offset(0, 1).Valuers.Fields("Column3").Value = cell.Offset(0, 2).Valuers.Fields("Column4").Value = cell.Offset(0, 3).Valuers.Updaters.CloseSet rs = NothingNext cellconn.CloseSet conn = NothingEnd Sub```在上述示例代码中,我们需要替换掉连接字符串中的`<provider>`、`<data_source>`、`<catalog>`、`<user_id>`和`<password>`,以便正确连接到目标数据库。
ExcelVBAADOSQL入门教程007:条件查询(上)

ExcelVBAADOSQL入门教程007:条件查询(上)主要内容:单条件查询多条件查询模糊匹配查询1.Where?Where!我们上期聊了SQL排序,这期来聊筛选,或者说条件查询……在第一期的时候,我们说SQL是声明式语言,当时还举了个小例子,不知道您是否还有印象:那个栗子中的SQL代码我们使用了where子句。
它定义了筛选条件,成绩>=80,从而对FROM子句返回的结果集进行筛选,将不符合条件的剔除,只保留符合条件的记录。
事实上,where子句的筛选条件可以是简单的单条件(如上述示例),也可以是复杂的多条件,可以精确匹配筛选,也可以搭配通配符等进行模糊匹配筛选。
SELECT 字段名 FROM 表名 WHERE 筛选条件这是它的语法。
下面我们就通过几个栗子来了解下where子句的常用套路。
2.一个栗子如下图所示,是一份名为学生表的Excel工作表,A列是班级,B 列是姓名,C-E列分别是性别、年龄、爱好。
3.单条件查询倘若需要查询上述示例中班级为“插班生”的学生名单,SQL代码如下:SELECT 班级,姓名 FROM [学生表$] WHERE 班级='插班生'查询结果如下:班级='插班生'就是where子句的筛选条件,它使用了等号来判断班级字段值和条件值是否相等。
需要说明的是,和Excel一样,当条件值是文本时,应该使用引号包起来,数值则不用,例如:SELECT 班级,姓名 FROM [学生表$] WHERE 年龄>=14昨个公众号后台有朋友问了个和下面的问题类似的问题:为什么班级='插班生'使用的是单引号,而不是双引号?这个问题我们之前有解释过,这里再说一下。
在OLE DB法使用的SQL语句里,单双引号都可以,只是在VBA中,通常SQL语句本身就是作为字符串存在的,外围已经存在了一对双引号,因此SQL语句内一般就使用单引号。
4.多条件查询先说一下“与”关系(也就是并且关系)的多条件筛选。
ExcelVBAADOSQL入门教程019:UPDATE更新

ExcelVBAADOSQL入门教程019:UPDATE更新我们上一章留了个小尾巴,说对于EXCEL文件,SQL可以删除单元格内的值,但不能使用DELETE语句删除整条记录,或者说删除单元格自身;否则会收到错误提示——那么如何删除单元格内的值呢?请使用UPDATE语句。
UPDATE,顾名思义,修改或更新数据库中的数据之意;它的基础语法如下:UPDATE 表名 SET 列名称=新值举个例子。
夏天到了,酷暑难当,某公司决定为每位员工的工资增加200元防暑降温费。
SQL语句如下:UPDATE [工资表$] SET 工资=工资 200完整VBA代码如下:Sub DoSql()Dim cnn As Object, Sql As StringSet cnn = CreateObject('adodb.connection')cnn.Open 'Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=' & ThisWorkbook.FullName Sql = 'UPDATE [工资表$] SET 工资=工资 200'cnn.Execute (Sql)cnn.CloseSet cnn = NothingEnd Sub更新后的数据如下:但等到发工资前的晚上,半夜12点,领导辗转反侧后忽然改主意了。
他认为男女应该区别对待,男生的防暑降温费应改为150,女生改为250……以为领导是照顾女同胞?不系滴,毕竟公司男多女少嘛,能省一点是一点。
对此,我们得将代码中的SQL语句修改如下:UPDATE [工资表$] SET 工资=工资 IIF(性别='男',150,250)语句使用IIF函数对性别进行判断,如果是男生,则返回数值150,否则返回250.更新后的工资表如下图所示:2.再举几个常见的例子吧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EXCEL(VBA)~SQL经典写法范本汇集2008年03月30日星期日下午07:21EXCEL(VBA)~SQL经典写法范本汇集****************************************************************A、根据本工作簿的1个表查询求和写法范本Sub查询方法一()Set CONN=CreateObject("ADODB.Connection")CONN.Open"provider=microsoft.jet.oledb.4.0;extended properties=excel8.0;data source="& ThisWorkbook.FullNamesql="select区域,存货类,sum(代销仓入库数量),sum(代销仓出库数量),sum(日报数量)from[sheet4$a:i]where区域='"&[b3]&"'and month(日期)='"&Month(Range("F3"))&"'group by区域,存货类"Sheets("sheet2").[A5].CopyFromRecordset CONN.Execute(sql)CONN.Close:Set CONN=NothingEnd Sub-----------------Sub查询方法二()Set CONN=CreateObject("ADODB.Connection")CONN.Open"dsn=excel files;dbq="&ThisWorkbook.FullNamesql="select区域,存货类,sum(代销仓入库数量),sum(代销仓出库数量),sum(日报数量)from[sheet4$a:i]where区域='"&[b3]&"'and month(日期)='"&Month(Range("F3"))&"'group by区域,存货类"Sheets("sheet2").[A5].CopyFromRecordset CONN.Execute(sql)CONN.Close:Set CONN=NothingEnd Sub**************************************************************************************************B、根据本工作簿2个表的不同类别查询求和写法范本Sub根据入库表和回款表的区域名和月份分别求存货类发货数量和本月回款数量查询()Set conn=CreateObject("adodb.connection")conn.Open"provider=microsoft.jet.oledb.4.0;"&_"extended properties=excel8.0;data source="&ThisWorkbook.FullNameSheet3.ActivateSql="select a.存货类,a.fh,b.hk from(select存货类,sum(本月发货数量)"_&"as fh from[入库$]where存货类is not null and区域='"&[b2]_&"'and month(日期)="&[d2]&"group by存货类)as a"_&"left join(select存货类,sum(数量)as hk from[回款$]where存货类"_&"is not null and区域='"&[b2]&"'and month(开票日期)="&[d2]&""_&"group by存货类)as b on a.存货类=b.存货类"Range("a5").CopyFromRecordset conn.Execute(Sql)End Sub*******************************************************************C、根据本文件夹下其他工作簿1个表区域的区域求和Sub在工作表1汇总本文件夹下001工作薄的表1分数列查询汇总()Set conn=CreateObject("ADODB.Connection")conn.Open"dsn=excel files;dbq="&ThisWorkbook.Path&"\001.xls"sql="select sum(分数)from[sheet1$]"Sheets(1).[a2].CopyFromRecordset conn.Execute(sql)conn.Close:Set conn=NothingEnd Sub---------------------Sub在工作表1汇总本文件夹下001工作薄的表1A1:A10查询汇总()Set conn=CreateObject("ADODB.Connection")conn.Open"provider=microsoft.jet.oledb.4.0;extended properties='excel8.0;hdr=no;';data source="& ThisWorkbook.Path&"\001.xls"sql="select sum(f1)from[sheet1$a1:a10]"Sheets(1).[A5].CopyFromRecordset conn.Execute(sql)conn.Close:Set conn=NothingEnd Sub-----------------------Sub在工作表1汇总本文件夹下001工作薄的表1分数列A1:A7查询并msgbox表达汇总()Set conn=CreateObject("ADODB.Connection")Set rr=CreateObject("ADODB.recordset")conn.Open"dsn=excel files;dbq="&ThisWorkbook.Path&"\001.xls"sql="select sum(分数)from[sheet1$a1:a7]"Sheets(1).[A8].CopyFromRecordset conn.Execute(sql)rr.Open sql,conn,3,1,1MsgBox rr.fields(0)conn.Close:Set conn=NothingEnd Sub******************************************************************************************D、根据本文件夹下其他工作簿多个表区域的单列区域查询求和sub本文件夹下其他工作簿的每个工作簿的第4列30行查询求和Dim cn As Object,f$,arr&(1To30),i%Application.ScreenUpdating=FalseSet cn=CreateObject("adodb.connection")f=Dir(ThisWorkbook.Path&"\*.xls")Do While f<>""If f<> Thencn.Open"provider=microsoft.jet.oledb.4.0;extended properties='excel8.0;hdr=no;';data source="& ThisWorkbook.Path&"\"&fRange("d5").CopyFromRecordset cn.Execute("select f4from[基表1$a5:d65536]")cn.CloseFor i=1To30arr(i)=arr(i)+Range("d"&i+4)Next iEnd Iff=DirLoopRange("d5").Resize(UBound(arr),1)=WorksheetFunction.Transpose(arr)Application.ScreenUpdating=TrueEnd Sub**************************************************************************************************E、根据本文件夹下其他工作簿多个表区域的多列区域查询求和sub本文件夹下其他工作簿的每个工作簿的第B\C\D列25行查询求和Dim cn As Object,f$,arr&(1To25,1To3),i%Application.ScreenUpdating=FalseSet cn=CreateObject("adodb.connection")f=Dir(ThisWorkbook.Path&"\*.xls")Do While f<>""If f<> Thencn.Open"provider=microsoft.jet.oledb.4.0;extended properties='excel8.0;hdr=no;';data source="& ThisWorkbook.Path&"\"&fRange("b6").CopyFromRecordset cn.Execute("select f2,f3,f4from[基表3$a6:e65536]")cn.CloseFor i=1To25For j=1To3arr(i,j)=arr(i,j)+Cells(i+5,j+1)Next jNext iEnd Iff=DirLoopRange("b6").Resize(UBound(arr),3)=arrApplication.ScreenUpdating=TrueEnd Sub***********************************************************************************F、其他相关知识整理'用excel SQL方法'conn是建立的连接对象,用open打开'通过CreateObject("ADODB.Connection")这一句建立了一个数据库连接对象conn'在工程中就不再需要引用“Microsot ActiveX Data Objects2.0Library“对象'设置对象conn为一个新的ADO链接实例,也可以用set conn=New ADODB.Connection。