经典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.再举几个常见的例子吧。
经典Excel_VBA_SQL语句
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=excel 8.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=excel 8.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='excel 8.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&(1 To 30), 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='excel 8.0;hdr=no;';data source=" & ThisWorkbook.Path & "\" & fRange("d5").CopyFromRecordset cn.Execute("select f4 from [基表1$a5:d65536]")cn.CloseFor i = 1 To 30arr(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&(1 To 25, 1 T o 3), 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='excel 8.0;hdr=no;';data source=" & ThisWorkbook.Path & "\" & fRange("b6").CopyFromRecordset cn.Execute("select f2,f3,f4 from [基表3$a6:e65536]")cn.CloseFor i = 1 To 25For j = 1 To 3arr(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 Objects 2.0 Library“ 对象'设置对象conn 为一个新的ADO 链接实例,也可以用set conn = New ADODB.Connection。
Excel VBAADOSQL实例集锦
1, 包含空值的记录f13 is null‘‘订单生成系统.xls‘f6-第6列,f2-第2列Private Sub Worksheet_Activate()On Error Resume NextDim x As Object, yy As Object, sql As StringSet x = CreateObject("ADODB.Connection")x.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;hdr=no;';Data Source=" & ActiveWorkbook.FullNamesql = "select f6,f2,f3,f4,f5,f7,f13,f24 -f25 from [sheet1$] where f24 -f25<f17 and (f13<>'C3' or f13 is null)" ‘不等于字符串用‘C3’包含空值用is nullSet yy = x.Execute(sql)Range("a:h").ClearContentsRange("a1:h1") = Array("编号", "品名", "规格", "产地", "单位", "件装", "属性", "计划") ‘表头另外赋值[a2].CopyFromRecordset yySet yy = NothingSet x = NothingEnd Sub2,用ADO Connection对象查询Option ExplicitPublic conn As ADODB.ConnectionSub Myquery()Dim sConnect$, sql1$Set conn = CreateObject("adodb.connection")Sheets("sheet1").Cells.ClearContentssConnect = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;" & _"Data Source=" & ThisWorkbook.Path & "\" & sql1 = "select 物料代码,物料描述,属性,单位from [物料代码表$] where 属性= '采购' " '表格名要用[$],条件部分用单引号''ThisWorkbook.Sheets("sheet1").Cells(2, 1).CopyFromRecordset conn.Execute(sql1) 'copy 后面紧接SQL查询执行语句With Sheets("sheet1").Range("A1") = "物料代码" '建立表头.Range("B1") = "物料描述".Range("C1") = "属性".Range("D1") = "单位"End With'conn.Close '可不用每次关闭数据源的连接End Sub3,用记录集执行单个查询Option ExplicitSub Myquery()Dim rd As ADODB.RecordsetDim i%, j%, k%, sConnect$, sql1$, str$Set rd = New ADODB.Recordsetstr = "外协"Sheets("sheet1").Cells.ClearContentssConnect = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;" & _"Data Source=" & ThisWorkbook.Path & "\" & 'conn.Open sConnect '打开数据源sql1 = "select 物料代码,物料描述,属性,单位from [物料代码表$] where 属性= '采购' " '表格名要用[$],条件部分用单引号''rd.Open sql1, sConnect, adOpenForwardOnly, adLockReadOnlyThisWorkbook.Sheets("sheet1").Cells(2, 1).CopyFromRecordset rdWith Sheets("sheet1").Range("A1") = "物料代码" '建立表头.Range("B1") = "物料描述".Range("C1") = "属性".Range("D1") = "单位"End Withrd.Close '关闭记录集Set rd=Nothing '关闭End Sub4,引用一列,如A列‘引用单列、单行、单个单元格.xls'引用一列,如A列Sub onecolumn()Dim Sql$Set Conn = CreateObject("Adodb.Connection")Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no';data source=" & ThisWorkbook.Path & "\1.xls"Sql = "select f1 from [sheet1$]"Cells.Clear[a1].CopyFromRecordset Conn.Execute(Sql)Conn.CloseSet Conn = NothingEnd SubSub dgzbhz()'2008/12/2‘‘Book12021.xls‘由于分表的第2列表头是“金额”,不用它,改为“一中”,所以要用hdr=no无标题,拷贝时把第一行表头归零,所以最后要加表头。
经典VBA_SQL语句
D、根据本文件夹下其他工作簿多个表区域的单列区域查询求和sub 本文件夹下其他工作簿的每个工作簿的第4列30行查询求和Dim cn As Object, f$, arr&(1 To 30), 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='excel 8.0;hdr=no;';data source=" & ThisWorkbook.Path & "\" & fRange("d5").CopyFromRecordset cn.Execute("select f4 from [基表1$a5:d65536]")cn.CloseFor i = 1 To 30arr(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&(1 To 25, 1 To 3), 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='excel 8.0;hdr=no;';data source=" & ThisWorkbook.Path & "\" & fRange("b6").CopyFromRecordset cn.Execute("select f2,f3,f4 from [基表3$a6:e65536]")cn.CloseFor i = 1 To 25For j = 1 To 3arr(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 Objects 2.0 Library“ 对象'设置对象conn 为一个新的ADO 链接实例,也可以用set conn = New ADODB.Connection。
Excel VBA 实现读取SQL数据
Private Sub CommandButton1_Click()Worksheets("Sheet2").SelectCells.SelectSelection.Delete Shift:=xlUpRange("A1").Select'清除在Excel中的数据,确保导入信息不出现与原Excel数据进行叠加Dim cnnConnect As ObjectDim rstRecordset As ObjectColumns("A:C").SelectRange("A1").ActivateSelection.Delete Shift:=xlToLeftSet cnnConnect = CreateObject("ADODB.connection")Set rstRecordset = CreateObject("ADODB.Recordset")cnnConnect.Open "Provider=SQLOLEDB;" & _"Data Source=10.11.1.4;" & _"User ID=finWork;Password=finwork;"rstRecordset.Open _Source:="Select code, name, email From hm_employees where status=1", _ActiveConnection:=cnnConnect'建立数据库连接,Source为数据库数据服务器IP,及连接用户名与密码,在实现时确保用户对K3数据库有读取权限With ActiveSheet.QueryTables.Add( _Connection:=rstRecordset, _Destination:=Range("A1")).Name = "Contact List".FieldNames = True.RowNumbers = False.FillAdjacentFormulas = False.PreserveFormatting = True.RefreshOnFileOpen = False.BackgroundQuery = True.RefreshStyle = xlInsertDeleteCells.SavePassword = True.SaveData = True.AdjustColumnWidth = True.RefreshPeriod = 0.PreserveColumnInfo = True.Refresh BackgroundQuery:=FalseEnd With'导入K3数据到Excel中,Range("A1").Value = "工号"Range("B1").Value = "姓名"Range("C1").Value = "Email"ActiveWorkbook.Worksheets("Sheet2").QueryTables(1).Sort.SortFields.ClearActiveWorkbook.Worksheets("Sheet2").QueryTables(1).Sort.SortFields.Add Key:= _ Range("A2:A483"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _:=xlSortNormalWith ActiveWorkbook.Worksheets("Sheet2").QueryTables(1).Sort.Header = xlYes.MatchCase = False.Orientation = xlTopToBottom.SortMethod = xlPinYin.ApplyEnd WithMsgBox "OK"'提示完成End Sub。
Excel2007VBASQL代码解析fromExcelhome
Excel2007VBASQL代码解析fromExcelhomeSub Example()Dim cnn As ADODB.ConnectionSet cnn = New ADODB.Connection'创建连接设置字符串,用OLEDB方式连接Dim lian As Stringlian = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;" _& "HDR=yes;" _& "IMEX=2';" _& "Data Source=" & ThisWorkbook.FullName'HDR=Yes,代表Excel 档中的工作表第一行是标题栏,No,代表Excel 档中的工作表无标题行'IMEX 汇入模式 0 只读 1 只写 2 可读写'Data Source 存储查询数据来源的工作薄名称'Provider 连接方式或连接提供程序 Extended Properties 连接方式的扩展属性、证书'Extended Properties='Excel 12.0 ---EXECL 2007'Extended Properties='Excel 8.0 ---EXECL 2003cnn.Open lian' ' 创建连接设置字符串,用ODBC方式打开连接.' Dim lian As String' lian = "Driver={Microsoft Excel Driver(*.xls,*xlsx,*.xlsm,*xlsb)};" _' & "ReadOnly=False;" _' & "DBQ=" & ThisWorkbook.FullName'' 'driver ODBC连接驱动属性' 'ReadOnly 相当于IMEX属性' 'DBQ 连接数据源' con.Open lian' 检查是否完成连接' If cnn.State = adStateOpen Then' 'cnn.State -->adstratclosed 关闭状态 adstartopen 打开状态' 'adstartconnecting 连接中 adstartexecuting 执行命令中' MsgBox "Welcome to Pubs!"' Else' MsgBox "Sorry. No Pubs today."' End If'关闭connection对象cnn.Close'销毁连接Set cnn = Nothing'设置SQL命令的字符串Dim SqlCommandStr As StringSqlCommandStr = "SELECT top 10 存货编码 from [主材汇总$] "'[主材汇总$]--连接数据源中的具体表名,可指定具体的range,直接跟在表名后即可,也可使用在表中定义的名称'如果设置第一行为标题,则可直接使用第一行数据为字段名'SqlCommandStr = "SELECT 存货名称from [主材汇总$A1:M100] where 存货编码='A01020506001500200'"'执行SQl命令'A、不要返回值'cnn.Execute SqlCommandStr' Execute方法:Execute <SQL命令文本>,[recordsaffected 查询作用范围],[options 参数选项]' [recordsaffected 查询作用范围] 如:1NumAffected 仅第一条记录' [options 参数选项] -- SQL命令类型 or 执行方式' SQL命令类型:' adcomdtext: 原始 SQL字符串' adcomdtable: 表的名称,向连接提供驱动提供类似SELECT * from_name的语句' adcmdstoreproc: 存储过程' adcmdtabledirect:表名,不同于table的是不会产生类似SELECT * from_name的SQL语句' SQL命令执行方式:' adasyncexecute: 异步执行命令,立即执行代码' adexecutenorecords: 不构建recoredset对像' 如:adcmdtext or adexecutenorecords'B、需要返回值Dim jilu As ADODB.RecordsetSet jilu = New ADODB.Recordsetjilu.Open SqlCommandStr, lian' open方法:open <SQL命令文本或数据源>,<activeconnection>,[cursortype],[locktype],[options 参数选项]' <activeconnection> 指定用于查询的连接设置,可以OPEN方法以前将一个字符串赋值给Recordset的activeconnection属性,那么该记录集则自动产生' 一个connection对像' [cursortype] 打开记录集时的数据指针类型:默认值为adopenforwardonly' adopenforwardonly-->只能向下移动且不能修改,常规查询' adopenstatic -->静态指针,用于脱机记录集,允许完全操作' 此参数不同于OPEN方法之前设置的Recordset的cursorlocation属性(规定recordset使用的数据指针类型:' aduserclient --客户端数据指针' aduseserver-- 服务器端数据指针,默认值)' [locktype] 打开记录时的数据源锁定类型:' adlockreadonly:常规查询使用,锁定源记录' adlockbatchoptimistic:脱机记录集使用,开放式批量更新' [options 参数选项] -- SQL命令类型 or 执行方式 connection 对象的Execute方法设置相同Do While Not jilu.EOF '如果指针不是未尾则表示记录内有数据'EOF --指针位于记录集最后一条记录之后 BOF --指针位于记录集第一条记录之前(Recordset对象的属性)MsgBox jilu.Fields(0).Value'Fields对象:记录集所包括的所有字段,带有Name,Item,Value等属性与Append等方法jilu.MoveNext'Move方法:' MoveFirst:移动到第一条记录' MoveLast: 移动最后一条记录' MoveNext:移动到下一条记录Loopjilu.Filter = "存货编码 like 'A0202*'"'.Filter属性:对记录按一定条件进行选择过滤但不删除数据,将过滤条件设置为空则恢复所有数据,多个条件可以使用逻辑运算符进行联接Do While Not jilu.EOF MsgBox jilu.Fields(0).Value Loop'关闭Recordsetjilu.Close'销毁RecordsetSet jilu = NothingEnd Sub。
ExcelVBAADOSQL入门教程014:多表连接查询(上)
ExcelVBAADOSQL入门教程014:多表连接查询(上)1.连接查询……有时称多表查询……有时又称多表连接查询……名字有差异,但意思总是一样——在多表之间创建指定关系的连接,并按指定连接条件进行数据查询。
在语句形式上,连接查询通常有两种实现方式。
一种是FROM子句列出所有需要连接的表,然后通过WHERE子句列出筛选条件;另一种是通过关键字JOIN建立表和表之间的连接,再通过关键字ON指定连接条件。
2.我们今天先聊简单、粗暴的第一种方法,该方法在语法上可以简单总结如下:SELECT 字段名 FROM 表1,表2 WHERE 表1.字段名=表2.字段名FROM子句列出需要连接查询的多个表,不同表名之间使用英文逗号间隔,然后WHERE子句指定了筛选的条件,最后SELECT子句指定需要提取字段的名称。
举个小栗子。
如下图所示,有两张表,左边是花名册,右边是成绩表。
现在我们需要查询班组为'二组’的人员成绩明细……查询结果如下:这问题是不是有点眼熟?我们好像在哪见过你还得吗?是的,我们上期刚分享过子查询的解决方案,不知道相关语句你是否还记得……使用连接查询的方式,SQL语句如下:SELECT 花名册$.组别,花名册$.姓名,成绩表$.成绩 FROM [花名册$] , [成绩表$] WHERE 花名册$.组别='二组' AND 花名册$.姓名=成绩表$.姓名以上语句中,花名册$和成绩表$两个表名反复出现,使代码书写和阅读都趋于复杂,此时我们可以使用表的别名进行简化。
和字段别名一样,定义表的别名关键字也是AS,但和字段别名不同的是,在对表定义别名时,关键字AS可以省略。
比如以下语句,我们将[花名册$]定义别名为a , [成绩表$]定义别名为b:SELECT a.组别,a.姓名,b.成绩FROM [花名册$]a , [成绩表$]b WHERE a.组别='二组' AND a.姓名=b.姓名代码也可以写成:SELECT 组别,a.姓名,成绩FROM [花名册$]a , [成绩表$]b WHERE 组别='二组' AND a.姓名=b.姓名对比上一条的语句,不难发现部分字段名省略了表名,这是因为相关字段名称在连接表中是独一无二的;而'姓名’是花名册和成绩表都存在的字段名,则必须提供表名,否则系统无法识别字段来源,会发出错误提示:说完表的别名,我们再说下语句的含义和运算过程。
使用VBA执行SQL
使用VBA执行SQLVBA是一种Visual Basic的应用,它是一个宏编程语言,由微软公司开发。
VBA可以用来开发Office应用程序,如Word,Excel,PowerPoint和Access,并且可以用它连接到支持ODBC(Open Database Connectivity)或OLEDB(Object Linking and Embedding Database)的外部数据源,以执行使用SQL语言的查询。
SQL(结构化查询语言)是一种用于存取数据库的语言。
它可以用于,插入,更新和删除数据库中的信息。
使用VBA执行SQL语句可以很容易地从Excel文件中访问外部数据库,并将其内容插入表格中或编写查询来获取信息。
要执行使用VBA执行SQL,首先需要使用ADO(ActiveX Data Objects)对象模型,它是一种允许开发人员建立应用程序来访问和操作数据库的框架。
使用ADO对象模型可以建立连接和会话以连接到数据库(如SQL Server,Oracle,Access,FoxPro,Text等),并使用Recordset对象中的查询来执行SQL语句。
下面是使用VBA执行SQL语句的典型示例://创建ADO连接Dim conn As ADODB.ConnectionSet conn = New ADODB.Connection//设置数据库连接信息conn.Open "provider=System.OleDb.OleDbConnection;" & _"Data Source=c:\mydatabase.mdb"//创建SQL查询Dim sql As Stringsql = "SELECT * FROM Products WHERE Price > 30"//使用SQL查询创建RecordsetDim rs As ADODB.RecordsetSet rs = conn.Execute(sql)//打印查询结果Do Until rs.EOFDebug.Print rs!Name, rs!Pricers.MoveNextLoop//关闭连接conn.Close上面的示例显示了如何使用VBA执行SQL语句,以便从数据库中获取信息。
VBA使用SQL语句检索Excel数据
VBA使⽤SQL语句检索Excel数据把Excel当做数据库,⽤ActiveX Data Objects打开连接并使⽤Select语句来查询数据,效率要⽐Workbook.Open和Range().Value效率⾼的多。
下⾯来看以个例⼦:Sub ExeSQL()' 引⽤Microsoft ActiveX Data Objects 2.5' 引⽤Microsoft Scripting RuntimeDim conn As New ADODB.ConnectionDim rs As New ADODB.RecordsetDim fs As New FileSystemObjectDim extenName$, connStr$, sqlStr$extenName = fs.GetExtensionName(ThisWorkbook.FullName) ' ⽂件扩展名If extenName = "xls" Then '03connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;" & _"Data Source=" & ThisWorkbook.FullNameElseIf extenName = "xlsx" Then '07connStr="Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;" & _"Data Source=" & ThisWorkbook.FullNameEnd IfSet fs = NothingsqlStr = "select x.来源,x.访问次数,x.订单总数,y.成功交易量,y.销售额" & _" from [订单表$] as x inner join [收⼊表$] as y" & _" on x.来源=y.来源"conn.Open connStrSet rs = conn.Execute(sqlStr)Sheets("新表").Range("A2").CopyFromRecordset rs' Sheets("新表").Range("A2").CopyFromRecordset conn.Open(connStr)Set rs = Nothing: conn.Close: Set conn = NothingEnd Sub说明:1、数据库的ConnectionString(连接字符串)的获取,我推荐⼀个⽹址:/;2、ConnectionString⾥的DataSource(数据源)是ThisWorkbook.FullName(本⼯作薄);3、Excel作为数据源时,默认⼯作表的第⼀⾏为字段;3、本⼯作薄⾥⾯有“订单表”、“收⼊表”和“新表”三个表,第⼀⾏(字段)分别为[来源],[访问次数],[...]等。
Excel使用VBA宏生成SQL语句
Excel使用VBA宏生成SQL语句有时候需要将Excel文件中的数据导入到数据库中,常用的做法是使用程序读取Excel,然后存入数据库;这里换一个方法,用Excel生成SQL语句,然后用这些SQL语句来更新数据库。
本文主要说明Excel如何使用VB宏构造需要的SQL语句,并生成文件。
2、如何添加按钮:依次打开:视图–工具栏–控件工具箱,选择“命令按钮”,自己画一个就行了;依次打开:右键–属性,可以修改名称、样式等。
具体操作可以上网找找。
3、如何使用VB宏:依次打开:工具–宏–安全性,看看你的Excel是否允许使用“宏”。
然后打开:工具–宏–Visual Basic 编辑器,双击左侧的“Sheet1”,然后在右侧的代码区域粘贴如下代码:'最大行数Const MAX_NUM_ROW = 5000'导出文件路径所在单元格Const PATH_OUTPUT_ROW = 3Const PATH_OUTPUT_COL = 3'定义列常量Const NAME_COL = 1Const GENDER_COL = 2Const PHONE_COL = 3Const EMAIL_COL = 4'读取数据开始行数Const START_ROW = 5'定义数据实体类Private Type TmpltNAME As StringGENDER As StringPHONE As StringEMAIL As StringEnd Type'行数变量Dim noOfTmplts As Integer'数据实体类数组Dim TmpltArray(MAX_NUM_ROW) As Tmplt'点击按钮触发事件Private Sub CommandButton1_Click()generateSQLEnd Sub'生成SQLPrivate Sub generateSQL()makedirinitDatawriteToFileEnd Sub'构建文件输出路径Private Sub makedir()On Error Resume NextMkDir Sheet1.Cells(PATH_OUTPUT_ROW, PA TH_OUTPUT_COL)End Sub'读取Excel数据,填充实体类数组Private Sub initData()Erase TmpltArraynoOfTmplts = 0Dim j As Integer'循环读取Excel数据行For j = START_ROW To MAX_NUM_ROWTmpltArray(noOfTmplts).NAME = Sheet1.Cells(j, NAME_COL) TmpltArray(noOfTmplts).GENDER = Sheet1.Cells(j, GENDER_COL) TmpltArray(noOfTmplts).PHONE = Sheet1.Cells(j, PHONE_COL) TmpltArray(noOfTmplts).EMAIL = Sheet1.Cells(j, EMAIL_COL) noOfTmplts = noOfTmplts + 1NextEnd Sub'读取实体类数组,生成SQL并写入文件Private Sub writeT oFile()Dim lvOutputPath As String'输出文件路径lvOutputPath = Sheet1.Cells(PATH_OUTPUT_ROW, PA TH_OUTPUT_COL) If lvOutputPath = "" ThenMsgBox "没有找到输出文件路径!"Exit SubEnd IffileNum = FreeFile'打开输出文件Open lvOutputPath For Output As fileNumDim lvUserSql As StringDim nameStr As StringDim genderStr As StringDim phoneStr As StringDim emailStr As String'循环生成SQLFor j = 0 To noOfTmplts - 1nameStr = TmpltArray(j).NAMEgenderStr = TmpltArray(j).GENDERphoneStr = TmpltArray(j).PHONEemailStr = TmpltArray(j).EMAILIf nameStr <> "" ThenlvUserSql = "Insert into Students(name,gender,phone,email) values('" & nameStr & "','" & genderStr & "','" & phoneStr & "','" & emailStr & "');"Print #fileNum, lvUserSqlEnd IfNextClose fileNumMsgBox "文件生成完成!"Exit SubErr_Open_File:Close lvFileNumIf Err.Number = 76 Then'路径未找到MsgBox Err.DescriptionExit SubElseMsgBox Err.DescriptionExit SubEnd IfEnd SubOK,这样就可以了!点击你的按钮,看看生成文件了吗?如果按钮还是编辑状态,关了再打开就行了。
VBA:Excel使用SQL进行查询
VBA:Excel使⽤SQL进⾏查询Sub 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'设置连接字符串,根据版本创建连接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 Select'设置SQL查询语句strSQL = "SELECT DISTINCT 发站 FROM [LMSData2016.12$]"Conn.Open strConn '打开数据库链接Set Rst = Conn.Execute(strSQL) '执⾏查询,并将结果输出到记录集对象With Sheet1.Cells.ClearFor i = 0To Rst.Fields.Count - 1'填写标题.Cells(1, i + 1) = Rst.Fields(i).NameNext i.Range("A2").CopyFromRecordset Rst.Cells.EntireColumn.AutoFit '⾃动调整列宽End WithRst.Close '关闭数据库连接Conn.CloseSet Conn = NothingSet Rst = NothingEnd Sub。
vba sql 查询语句 -回复
vba sql 查询语句-回复在VBA编程中,使用SQL查询语句是非常常见且强大的功能。
SQL (Structured Query Language)是一种用于管理关系型数据库的编程语言,它可以帮助我们从数据库中检索、修改、添加和删除数据。
在本文中,我们将一步一步地回答关于VBA中SQL查询语句的一些常见问题。
首先,让我们简要介绍一下VBA。
VBA(Visual Basic for Applications)是一种用于自动化办公软件的编程语言,如Microsoft Excel,Word和Access等。
它可以帮助我们通过编写宏来实现自动化操作,提高工作效率。
在VBA中使用SQL查询语句的第一步是建立与数据库的连接。
可以使用ADODB对象来实现与数据库的连接。
下面是建立连接的代码:vbaDim conn As New ADODB.ConnectionDim rs As New ADODB.Recordsetconn.Open "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\path\to\database.accdb"'进行一些操作conn.Close在上面的代码中,我们创建了一个ADODB.Connection对象`conn`,并使用Open方法打开一个名为`database.accdb`的数据库。
根据自己的需求,可以使用不同的数据库提供程序和不同的数据源。
接下来,我们可以使用SQL查询语句从数据库中检索数据。
SQL查询语句通常由SELECT语句组成。
下面是一个示例代码:vbaDim sqlQuery As StringDim conn As New ADODB.ConnectionDim rs As New ADODB.Recordsetconn.Open "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\path\to\database.accdb"sqlQuery = "SELECT * FROM TableName"rs.Open sqlQuery, conn'处理返回的结果rs.Closeconn.Close在上面的代码中,我们定义了一个名为`sqlQuery`的变量,并将查询语句赋值给它。
ExcelVBAADOSQL入门教程015:多表连接查询(中
ExcelVBAADOSQL入门教程015:多表连接查询(中1.咱们上期说,在语句形式上,多表连接查询通常有两种实现方式,当时也聊了第1种,也就是简单粗暴的FROM WHERE,今天咱们就来聊第2种方式,JOIN ON……语法如下:SELECT column FROM join_table JOIN_TYPE join_table ON( join_condition)Join_table是指定参与连接的表名。
JOIN_TYPE是连接的类型。
ON (join_condition)是指定连接的条件,通常由字段名和比较运算符、逻辑运算符构成。
连接的类型(JOIN_TYPE)常用的有3种,内连接(INNER JOIN)、外连接(OUT JOIN)和交叉连接(CROSS JOIN)。
我们先来说交叉连接(CROSS JOIN)……为什么先说CROSS JOIN?次要原因是在这个早晨它总是让我想起笛卡尔,想起博尔赫斯,想起博尔赫斯《小径分叉的花园》,这让我难过;更次要原因是我们对它是比较熟悉的……咦,为什么说我们对他比较熟悉……交叉连接是返回连接表所有数据行的笛卡尔积,也就是列出连接表之间所有行的可能性组合——这和我们上期分享的FROM WHERE 是不是如出一辙?Excel VBA ADO SQL入门教程014:多表连接查询(上)事实上,FROM WHERE的多表连接实质便是交叉连接;以下两个表达式也完全是等价的。
SELECT 字段名 FORM 表1,表2SELECT 字段名 FROM 表1 CROSS JOIN 表2举个小例子…………还是不举了不举例子的原因是,EXCEL和ACCESS并不支持CROSS JOIN语句,如果需要交叉连接,请使用FROM WHERE的方式。
这就是我们先聊CROSS JOIN的主要原因——没得聊。
卒。
2.再说下内连接。
内连接通过关键字INNER JOIN 将多表连接,并通过关键字ON,指定连接条件。
- 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。