ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3941|回复: 7

[已解决] 从SQL数据库提数 到EXCEL不连续区域

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-7-8 17:02 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:ADO技术
本帖最后由 feifangsiyue 于 2013-7-9 15:05 编辑

通过VBA直接从SQL数据库里面抓取表格。比如:select ID,Name,Sex from table
我要把ID内容放在EXCEL的A列,把Name,sex 分别放在E和F列,就是EXCEL表B、C、D列原来的内容不能被覆盖。

补充:1、不希望分两次查询,比如先查ID 放在A列,再查Name和Sex放在E列。(现在就是这样做的,这样对排序字段要求太高,绝对不能有重复值,不小心就回错行)
           2、不能用查询空白来占位,就是不能用select ID,'','','',Name,Sex from table来做,因为实际情况下,B\C\D列的内容比较多,真不能覆盖后重写。

求指点,谢谢!

表格样式

表格样式



点评

知识树索引内容:7楼  发表于 2013-9-23 13:38

TA的精华主题

TA的得分主题

发表于 2013-7-8 18:15 | 显示全部楼层
你这个可以用getrows(,,array("ID","Name","Sex"))方法把记录取到数组里,然后工作表从数组取数。

TA的精华主题

TA的得分主题

发表于 2013-7-8 21:54 | 显示全部楼层
你看这样写行不?


  1.     For i = 0 To rs.RecordCount - 1
  2.         Cells(i, 1) = rs.Fields(0)
  3.         Cells(i, 5) = rs.Fields(1)
  4.         Cells(i, 6) = rs.Fields(2)
  5.         rs.MoveNext
  6.     Next
复制代码

TA的精华主题

TA的得分主题

发表于 2013-7-8 23:09 | 显示全部楼层
一个查询Set rs = cnn.Execute(SQL),分2次输出

第一次使用CopyFromRecordset 方法:

[a2].CopyFromRecordset rs, , 1
第二次把后面两列写入数组:
    rs.movefirst
    arr = rs.GetRows(, , Array(1, 2))
    [e2].Resize(UBound(arr, 2) + 1, 2) = Application.Transpose(arr)

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-9 11:18 | 显示全部楼层
zhaogang1960 发表于 2013-7-8 23:09
一个查询Set rs = cnn.Execute(SQL),分2次输出

第一次使用CopyFromRecordset 方法:


    rs.movefirst
    arr = rs.GetRows(, , Array(5, 6, 7, 8, 9))
    sht.[AB11].Resize(UBound(arr, 2) + 1, 5) = Application.Transpose(arr)

这个样子的话报错"类型不匹配"真不知道是什么原因。
还有提取的数字构成文本  写入EXCLE后变成常规格式,有些0开头的文本就变了。
不知道有没有处理过?

TA的精华主题

TA的得分主题

发表于 2013-7-9 12:45 | 显示全部楼层
feifangsiyue 发表于 2013-7-9 11:18
rs.movefirst
    arr = rs.GetRows(, , Array(5, 6, 7, 8, 9))
    sht.[AB11].Resize(UBound(a ...

一、Array(1, 2)中的1、2是第2、3个字段,第一个字段是0
二、数组处理数字时不会区别原数据格式

建议:放弃“不希望分两次查询”,两次查询不仅不会出现格式问题,速度也不会慢

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-9 13:49 | 显示全部楼层
本帖最后由 feifangsiyue 于 2013-7-9 15:04 编辑
一指禅62 发表于 2013-7-8 21:54
你看这样写行不?


帮我看看返回的记录数怎么老是-1
--------------------------------------------最后补充,问题解决了--------------------------------------
rs.CursorLocation = 3   道理不是很懂,不过加上这一句问题暂时解决了。


  1. Sub GetGDD()

  2. Dim i%, strCn$, serIP$, uid$, pwd$, dbName$, strSQL$
  3. Dim sht As Worksheet

  4. Dim cn As New ADODB.Connection
  5. Dim rs As New ADODB.Recordset

  6. Dim stime As Date, etime As Date
  7. stime = Timer

  8. serIP = "192.168.1.1"
  9. uid = "sa"
  10. pwd = "123"
  11. dbName = "AAA"

  12. strCn = "Provider=sqloledb;Server=" & serIP & ";Database=" & dbName & ";Uid=" & uid & ";Pwd=" & pwd & "; "

  13. '-------------------------增加了期间输入步骤------------------------------------------------------------------

  14. TX = 201304
  15. If TX = "" Or Len(TX) <> 6 Then
  16. MsgBox "期间输入错误,请检查!"
  17. Else

  18. cn.Open strCn

  19. strSQL = " DECLARE  @YM char(6) set @YM='201204'"
  20. strSQL = strSQL & " SELECT Rtrim(TA001+'-'+TA002),Rtrim(TA006),TA035,TA015,TA040,"
  21. strSQL = strSQL & " TA011,left(TA006,8) ,TA034,TA022 ,TA032 ,TA015 ,TA016,TA017 ,TA018 ,TA009 ,TA010,TA014 ,CREATE_DATE"
  22. strSQL = strSQL & " FROM MOCTA Where TA013='Y' and TA001<>'52E1' and left(TA040,6) <=@YM Order by TA001 asc,TA002 asc"


  23. Set sht = ThisWorkbook.Sheets("C-100")
  24. sht.[A11:E2000].ClearContents
  25. sht.[AA11:AT2000].ClearContents

  26. rs.Open strSQL, cn, 1, 1
  27. MsgBox rs.RecordCount     '返回的记录数怎么老是-1

  28. For i = 1 To 100 ' rs.RecordCount
  29.             sht.Range("A" & i + 10).Value = rs.Fields(0).Value
  30.             sht.Range("B" & i + 10).Value = rs.Fields(1).Value
  31.             sht.Range("C" & i + 10).Value = rs.Fields(2).Value
  32.             sht.Range("D" & i + 10).Value = rs.Fields(3).Value
  33.             sht.Range("E" & i + 10).Value = rs.Fields(4).Value
  34.             
  35.             sht.Range("AG" & i + 10).Value = rs.Fields(5).Value
  36.             sht.Range("AH" & i + 10).Value = rs.Fields(6).Value
  37.             sht.Range("AI" & i + 10).Value = rs.Fields(7).Value
  38.             sht.Range("AJ" & i + 10).Value = rs.Fields(8).Value
  39.             sht.Range("AK" & i + 10).Value = rs.Fields(9).Value
  40.             sht.Range("AL" & i + 10).Value = rs.Fields(10).Value
  41.             sht.Range("AM" & i + 10).Value = rs.Fields(11).Value
  42.             sht.Range("AN" & i + 10).Value = rs.Fields(12).Value
  43.     rs.MoveNext
  44.     Next i

  45. rs.Close
  46. cn.Close
  47. Set rs = Nothing
  48. Set cn = Nothing
  49. etime = Timer
  50. MsgBox "提取工单信息完成" & Format(etime - stime, "0.00") & "秒,更新完毕!"
  51. End If
  52. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2013-7-9 20:06 | 显示全部楼层
feifangsiyue 发表于 2013-7-9 13:49
帮我看看返回的记录数怎么老是-1
--------------------------------------------最后补充,问题解决了 ...

似懂非懂。这是搜索到的帖子:

http://club.excelhome.net/forum. ... 414&ordertype=1
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 14:42 , Processed in 0.044258 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表