Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4227|回复: 22

[已解决]SQL查询时出现系统错误,求助

[复制链接]
发表于 2013-1-28 22:45 | 显示全部楼层 |阅读模式
代码如下:
  1. Sub Ado0()
  2. Dim cnn As New ADODB.Connection



  3. Dim rst As New ADODB.Recordset



  4. Dim Sql As String

  5. Dim lujing As String

  6. Dim i As Integer

  7. Dim j As Integer

  8. lujing = ThisWorkbook.Path & Application.PathSeparator & "通讯录.xls"

  9. cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties='Excel 8.0';Data Source=" & lujing


  10. Sql = "Select 姓名 From [Sheet1$] "

  11. rst.Open Sql, cnn, adOpenKeyset

  12. For i = 1 To rst.Fields.Count



  13. Sheet1.Cells(1, i) = rst.Fields(i - 1).Name



  14. Next i


  15. rst.Close

  16. cnn.Close

  17. Set rst = Nothing

  18. Set cnn = Nothing

  19. End Sub
复制代码
运行后如此这般:

QQ截图20130128224520.jpg



恳请高手帮助!!
最佳答案
2013-1-28 23:56
本帖最后由 hwc2ycy 于 2013-1-28 23:57 编辑
  1. Sub Ado0()
  2.     Dim cnn As New ADODB.Connection
  3.     Dim rst As New ADODB.Recordset
  4.     Dim Sql As String
  5.     Dim lujing As String
  6.     Dim i As Integer
  7.     Dim j As Integer
  8.     ActiveSheet.UsedRange.Clear
  9.    
  10.     lujing = ThisWorkbook.Path & Application.PathSeparator & "通讯录.xls"
  11.     cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties=""Excel 8.0;HDR=YES;IMEX=0"";Data Source=" & lujing
  12.     Sql = "Select * From [Sheet1$] "
  13.     rst.Open Sql, cnn, adOpenKeyset
  14.     For i = 1 To rst.Fields.Count
  15.         Sheet1.Cells(1, i) = rst.Fields(i - 1).Name
  16.     Next i
  17.     Range("a2").CopyFromRecordset rst
  18.     rst.Close
  19.     cnn.Close
  20.     Set rst = Nothing
  21.     Set cnn = Nothing
  22.     MsgBox "查询完毕"
  23. End Sub
复制代码
发表于 2013-1-28 22:51 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-1-28 22:56 | 显示全部楼层
hwc2ycy 发表于 2013-1-28 22:51
控件引用了没有?

控件已经引用了
xuexi.zip (10.29 KB, 下载次数: 17)
回复

使用道具 举报

发表于 2013-1-28 23:52 | 显示全部楼层
  1. Sub Ado0()
  2.     Dim cnn As New ADODB.Connection
  3.     Dim rst As New ADODB.Recordset
  4.     Dim Sql As String
  5.     Dim lujing As String
  6.     Dim i As Integer
  7.     Dim j As Integer

  8.     lujing = ThisWorkbook.Path & Application.PathSeparator & "通讯录.xls"
  9.     cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";Data Source=" & lujing ' & ""Excel 8.0;HDR=YES;IMEX=0"";"
  10.     Sql = "Select * From [Sheet1$] "
  11.     rst.Open Sql, cnn, adOpenKeyset
  12.     For i = 1 To rst.Fields.Count
  13.         Sheet1.Cells(1, i) = rst.Fields(i - 1).Name
  14.     Next i
  15.     Range("a2").CopyFromRecordset rst
  16.    
  17.     rst.Close
  18.     cnn.Close
  19.     Set rst = Nothing
  20.     Set cnn = Nothing
  21. End Sub
复制代码
回复

使用道具 举报

发表于 2013-1-28 23:55 | 显示全部楼层
sql1.gif
回复

使用道具 举报

发表于 2013-1-28 23:55 | 显示全部楼层
你工作簿下所在的文件夹下有通讯录工作簿没?
回复

使用道具 举报

发表于 2013-1-28 23:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hwc2ycy 于 2013-1-28 23:57 编辑
  1. Sub Ado0()
  2.     Dim cnn As New ADODB.Connection
  3.     Dim rst As New ADODB.Recordset
  4.     Dim Sql As String
  5.     Dim lujing As String
  6.     Dim i As Integer
  7.     Dim j As Integer
  8.     ActiveSheet.UsedRange.Clear
  9.    
  10.     lujing = ThisWorkbook.Path & Application.PathSeparator & "通讯录.xls"
  11.     cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties=""Excel 8.0;HDR=YES;IMEX=0"";Data Source=" & lujing
  12.     Sql = "Select * From [Sheet1$] "
  13.     rst.Open Sql, cnn, adOpenKeyset
  14.     For i = 1 To rst.Fields.Count
  15.         Sheet1.Cells(1, i) = rst.Fields(i - 1).Name
  16.     Next i
  17.     Range("a2").CopyFromRecordset rst
  18.     rst.Close
  19.     cnn.Close
  20.     Set rst = Nothing
  21.     Set cnn = Nothing
  22.     MsgBox "查询完毕"
  23. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-1-29 09:12 | 显示全部楼层
hwc2ycy 发表于 2013-1-28 23:56

感谢您的大力帮助,但是问题依然没有解决,也不知道是不是我太菜的原因,我想让代码指定查询,比如通讯录有姓名职务和电话,我只想查询到姓名和电话,对了,通讯录还有一个合并单元格做的表头
,如下:(抱歉隐藏下资料)
QQ截图20130128224520.jpg
我想改的代码如下:
  1. Sub Ado0()
  2. Dim cnn As New ADODB.Connection



  3. Dim rst As New ADODB.Recordset



  4. Dim Sql As String

  5. Dim lujing As String

  6. Dim i As Integer

  7. Dim j As Integer

  8. Dim r As Integer

  9. lujing = ThisWorkbook.Path & Application.PathSeparator & "通讯录.xls"

  10. cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties=""Excel 8.0;HDR=YES;IMEX=0"";Data Source=" & lujing





  11. Sql = "Select 姓名 From [Sheet1$] "


  12. rst.Open Sql, cnn, adOpenKeyset


  13. For i = 1 To rst.RecordCount



  14. For j = 0 To rst.Fields.Count - 1



  15. Sheet1.Cells(i + 1, j + 1) = rst.Fields(j)



  16. Next j



  17. rst.MoveNext



  18. Next i



  19. rst.Close

  20. cnn.Close

  21. Set rst = Nothing

  22. Set cnn = Nothing

  23. End Sub
复制代码
刚刚通过您的帮助,代码可以正常运行了,我看出来主要的改动有HDR=YES;IMEX=0,我会查查什么意思的,上面我想把SQL语句改成Select 姓名 From [Sheet1$],这时候又出现了错误,请问怎么解决呢?
QQ截图20130128224520.jpg

回复

使用道具 举报

发表于 2013-1-29 09:39 | 显示全部楼层
合并表头去掉,你的数据格式有问题。
回复

使用道具 举报

 楼主| 发表于 2013-1-29 09:47 | 显示全部楼层
本帖最后由 www1988 于 2013-1-29 10:01 编辑
hwc2ycy 发表于 2013-1-29 09:39
合并表头去掉,你的数据格式有问题。


合并表头有方法绕过吗?这个格式是固定的,不能随意更改,另外去掉后依然不能执行Select 姓名,电话 From [Sheet1$]

如果需要我再开一贴提最佳
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 10:18 , Processed in 1.207388 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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