Excel精英培训网

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

[已解决]查询当前工作表,并清屏回填结果数据问题

[复制链接]
发表于 2014-2-13 15:20 | 显示全部楼层 |阅读模式
本帖最后由 vicrly 于 2014-2-13 16:33 编辑

我的源码是这样的
Sub 查询()

Dim sql As String, cnn As Object, rs
Set cnn = CreateObject("Adodb.Connection")
Set rs = CreateObject("ADODB.Recordset")
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
sql = "Select * From [汇总表$a2:r65536] where 名称='电脑'"
rs.Open sql, cnn
Sheet4.Range("a3:r65536").ClearContents   //一旦使用这句清除,查询结果就只显示一条。不清除没有任何异常。
Sheet4.Cells(20, 1).CopyFromRecordset rs

rs.Close
Set rs = Nothing
Set cnn = Nothing
MsgBox ("执行完成!")
End Sub

因为当前表的数据较多,想查询后清理当前表内容,返回查询结果。

按照我的理解,数据已经查询完成,结果已放入Recordset对象中,为什么我清除当前表,会对查询结果有影响?请解释并给一个解决这个问题的方法,不甚感激。
已经上传附件


最佳答案
2014-2-13 15:53
  1. Sub 查询()

  2.     Dim sql As String, cnn As Object, rs
  3.     Set cnn = CreateObject("Adodb.Connection")
  4.     cnn.CursorLocation = 3
  5.     Set rs = CreateObject("ADODB.Recordset")
  6.     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
  7.     sql = "Select * From [汇总表$a2:r65536] where 名称='电脑'"
  8.     rs.Open sql, cnn
  9.     Sheet4.Range("a3:r65536").ClearContents
  10.     Sheet4.Cells(20, 1).CopyFromRecordset rs

  11.     rs.Close
  12.     Set rs = Nothing
  13.     Set cnn = Nothing
  14.     MsgBox ("执行完成!")
  15. End Sub
复制代码

自动表.rar

22.18 KB, 下载次数: 10

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-2-13 15:35 | 显示全部楼层
回复

使用道具 举报

发表于 2014-2-13 15:50 | 显示全部楼层
  1. Sub ADOQuery()
  2.     Dim AdoConn As Object, AdoRst As Object
  3.     Dim strConn$, strSQL$, strFullname$
  4.     Dim blnHasHeader As Boolean
  5.    
  6.     Const adUseClient = 3
  7.     Const adModeShareDenyWrite = 8
  8.     Const adModeReadWrite = 3
  9.     Const adModeRead = 1
  10.    
  11.     On Error GoTo ErrorHandler

  12.     blnHasHeader = True
  13.     strFullname = ThisWorkbook.FullName

  14.     Set AdoConn = CreateObject("ADODB.Connection")

  15.     strSQL = "Select * From [汇总表$a2:r65536] where 名称='电脑'"

  16.     Select Case Application.Version
  17.         Case "14.0", "15.0", "12.0"
  18.             strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source='" & _
  19.                       strFullname & "';Extended Properties='Excel 12.0;HDR=" & blnHasHeader & ";imex=1';"
  20.         Case Else
  21.             strConn = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
  22.                       "Data Source='" & strFullname & "';Extended Properties='Excel 8.0;HDR=" & blnHasHeader & ";imex=1';"
  23.     End Select

  24.     Debug.Print strConn

  25.     With AdoConn
  26.         .CommandTimeout = 5
  27.         .ConnectionTimeout = 5
  28.         .CursorLocation = adUseClient
  29.         .Mode = adModeRead
  30.         .ConnectionString = strConn
  31.         .Open
  32.     End With

  33.     Set AdoRst = AdoConn.Execute(strSQL)

  34.     If AdoRst.RecordCount > 0 Then
  35.         Application.ScreenUpdating = False
  36.         Sheet4.Range("a3:r65536").ClearContents
  37.         Sheet4.Cells(20, 1).CopyFromRecordset AdoRst
  38.         Application.ScreenUpdating = True
  39.         MsgBox "一共查询到了 " & AdoRst.RecordCount & " 条记录"
  40.     Else
  41.         MsgBox "没有符合条件的记录"
  42.     End If

  43.     AdoConn.Close
  44.     Exit Sub

  45. ErrorHandler:
  46.     MsgBox Err.Number & vbCrLf & _
  47.            Err.Description
  48.     Application.ScreenUpdating = True
  49.     Set AdoRst = Nothing
  50.     Set AdoConn = Nothing
  51. End Sub
复制代码
回复

使用道具 举报

发表于 2014-2-13 15:52 | 显示全部楼层
设置了CursorLocation后,就不会出现你说的情况了。
回复

使用道具 举报

发表于 2014-2-13 15:53 | 显示全部楼层    本楼为最佳答案   
  1. Sub 查询()

  2.     Dim sql As String, cnn As Object, rs
  3.     Set cnn = CreateObject("Adodb.Connection")
  4.     cnn.CursorLocation = 3
  5.     Set rs = CreateObject("ADODB.Recordset")
  6.     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
  7.     sql = "Select * From [汇总表$a2:r65536] where 名称='电脑'"
  8.     rs.Open sql, cnn
  9.     Sheet4.Range("a3:r65536").ClearContents
  10.     Sheet4.Cells(20, 1).CopyFromRecordset rs

  11.     rs.Close
  12.     Set rs = Nothing
  13.     Set cnn = Nothing
  14.     MsgBox ("执行完成!")
  15. End Sub
复制代码
回复

使用道具 举报

发表于 2014-2-13 16:22 | 显示全部楼层
学习了
回复

使用道具 举报

发表于 2014-2-13 16:23 | 显示全部楼层
sql 语句下面加句:
  1. rs.CursorLocation = 3
复制代码
也可以
回复

使用道具 举报

 楼主| 发表于 2014-2-13 16:30 | 显示全部楼层
hwc2ycy 发表于 2014-2-13 15:53

[em17]hwc2ycy 大大的方法果然很好用
确实设置了
  • cnn.CursorLocation = 3
这个参数就没问题了!虽然我还不是很理解这个参数的意思,先用起来。然后再去慢慢研究吧!
再次感谢 各位给予关注的朋友和版主大大。
回复

使用道具 举报

发表于 2014-2-13 17:44 | 显示全部楼层
vicrly 发表于 2014-2-13 16:30
hwc2ycy 大大的方法果然很好用
确实设置了
  • cnn.CursorLocation = 3

  • 好了就给个最佳答案吧。
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-3-29 20:42 , Processed in 0.360152 second(s), 13 queries , Gzip On, Yac On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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