博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VBA学习资料分享-4
阅读量:6272 次
发布时间:2019-06-22

本文共 2240 字,大约阅读时间需要 7 分钟。

工作中经常要从数据库把数据跑出来放到EXCEL上,才能进行下一步的操作,那么VBA如何结合SQL提取数据呢?答案就是ADO。

声明和实例变量

引用法——引用Microsoft ActiveX Data Objects x.x Library,Microsoft ActiveX Data Objects Recordset x.x Library,声明的同时使用New实现了初始实例化

Dim conn as New ConnectionDim rre as New Recordset

创建法——使用createobject函数创建

Dim conn as objectDim rre as objectSet conn=CreateObject("adodb.connection")Set rre=CreateObject("adodb.recordset")

设置连接属性

conn.ConnectionTimeout = 10000  '指示在终止尝试和产生错误前建立连接期间所等待的时间。 conn.CommandTimeout = 10000  '指示在终止尝试和产生错误之前执行命令期间需等待的时间。 connstr = "Provider = SQLOLEDB;Server = XXXXX;Trusted_Connection=yes"  '无需密码时的连接connstr = "Provider = SQLOLEDB;Data Source = XXXXX;Initial Catalog = XXXXX;User ID =XXXXX;Password = XXXXX;"  '需要密码时的连接conn.ConnectionString = connstr

执行SQL语句

conn.OpenSql = "select * from ......"Set rre = conn.Execute(Sql)'rre.Open Sql, conn, adOpenKeyset, adLockOptimistic  '另一种用法'多条SQL语句可以分句执行Sql0="Use DataBase"Sql1="IF object_id('tempdb.dbo.#t1') is not null drop table #t1"Sql2="alter table #t1 add ......"Sql3="update #t1 set ......"Sql4="select * from ......"Set rre = conn.Execute(Sql0)Set rre = conn.Execute(Sql1)Set rre = conn.Execute(Sql2)Set rre = conn.Execute(Sql3)Set rre = conn.Execute(Sql4)

读写查询结果

if rre.RecordCount=0 then    '判断结果是否为空Msgbox "没有查到任何数据"exit subend ifFor i = 0 To rre.Fields.Count - 1    '循环读写字段名ThisWorkbook.Sheets(1).Cells(1,i+1) = rre.Fields(i).NameNextThisWorkbook.Sheets(1).Range("A2").CopyFromRecordset rre    '批量读写结果r=2While Not rre.EOF    '循环读写结果    For i = 0 To rre.Fields.Count - 1    Sheet1.Cells(r, i + 1) = rre.Fields(i).Value        Next i    r = r + 1        rre.MoveNextWend

关闭缓存和释放内存

rre.Closeconn.Closeset rre=Nothingset conn=Nothing

 如果是调用存储过程而不是直接执行SQL语句的,可以这么写:

Dim conn As New ADODB.ConnectionDim cmd As New ADODB.CommandDim rst As New ADODB.Recordsetconn.Open "Provider=SQLOLEDB;Data Source=XXXXX;Initial Catalog=XXXXX;User Id=XXXXX;Password=XXXXX"cmd.CommandType = adCmdStoredProccmd.CommandText = "dbo.XXXXX"cmd.CommandTimeout = 10000cmd.ActiveConnection = connrst.Open cmd, , adOpenForwardOnly, adLockReadOnlyThisWorkbook.Sheets(1).Range("a2").CopyFromRecordset rstrst.Closeconn.CloseSet rst = NothingSet conn = Nothing Set cmd = Nothing

 

转载于:https://www.cnblogs.com/JTCLASSROOM/p/10876579.html

你可能感兴趣的文章
课堂练习:ex 4-20
查看>>
20155328 2016-2017-2 《Java程序设计》 第8周学习总结
查看>>
python操作redis--string
查看>>
echarts图表初始大小问题及echarts随窗口变化自适应
查看>>
Inherits、CodeFile、CodeBehind的区别
查看>>
创建一个SimpleDlg
查看>>
使用XML生成菜单
查看>>
udp,tcp对于socket的写法
查看>>
第二周个人赛
查看>>
推断Windows版本号新方法
查看>>
2017-4-18 ADO.NET
查看>>
RSuite 一个基于 React.js 的 Web 组件库
查看>>
技术博客网址收藏
查看>>
python 金融分析学习
查看>>
授人以渔不如授人以鱼
查看>>
matlab练习程序(图像Haar小波变换)
查看>>
【Java】从域名得到ip
查看>>
Mysql索引会失效的几种情况分析
查看>>
LVM逻辑卷
查看>>
zoj3591 Nim(Nim博弈)
查看>>