玖叶教程网

前端编程开发入门

ADO如何解决数据在多个工作表中查找

大家好,今日继续讲解VBA数据库解决方案,今日讲解第40讲:利用ADO实现同一文件的多个工作表精确查询.其实这讲的内容利用我之前讲解的知识点也可以自己完成.这里只是拿出来让大家再熟悉一下EXCEL的ADO连接,及RS多次打开记录集后的查询.

实例:在我的文件<VBA与数据库操作>.xlsm中有两页"两表查询数据"和"查询数据",一些基础的数据在这两页文件中:如下截图:

同时我在某页工作表中存在如下数据,要在上述的两个工作表中查出对应的数据资料放在后面:

这个实例也是在工作中经常遇到的,如果扩展使用会更多。

下面看我给出代码:

Sub mynzexcels_40()

'第40讲,利用ADO,实现同一文件的确认查询

Dim cnADO, rsADO As Object

Dim strPath, strTable, strSQL As String

Dim SH As Worksheet

Set cnADO = CreateObject("ADODB.Connection")

'建立连接

strPath = ThisWorkbook.FullName

cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath

i = 2

Do While Cells(i, 1) <> ""

WW = Cells(i, 1)

If InStr(WW, ":") > 0 Then WW = Left(WW, InStr(WW, ":") - 1)

For Each SH In Worksheets

If SH.Name = "两表查询数据" Or SH.Name = "查询数据" Then

strTable = "[" & SH.Name & "$]"

strSQL = "select F2,F3,F4,F5 from " & strTable & " where F1='" & WW & "'"

Set rsADO = New ADODB.Recordset

rsADO.Open strSQL, cnADO, 1, 3

If rsADO.EOF Then GoTo 200

If rsADO.RecordCount > 0 Then

Cells(i, 2).CopyFromRecordset cnADO.Execute(strSQL)

GoTo 100

End If

End If

200:

Next

100:

rsADO.Close

i = i + 1

Loop

cnADO.Close

Set cnADO = Nothing

Set rsADO = Nothing

End Sub

代码截图:

代码讲解:

1 WW = Cells(i, 1)

If InStr(WW, ":") > 0 Then WW = Left(WW, InStr(WW, ":") - 1)

此处我做了一个实例,就是如果在需要查找的数据中含有":"那么要取冒号之前的数据。这是非常实用的一个实例,大家要记住上面的代码。

2 For Each SH In Worksheets 这里使用了一个FOR EACH循环,遍历工作表。

3 If SH.Name = "两表查询数据" Or SH.Name = "查询数据" Then 由于我事先知道我要在两页工作表中查询,所以我精确的控制了两页的工作表名称

4 If rsADO.RecordCount > 0 Then

Cells(i, 2).CopyFromRecordset cnADO.Execute(strSQL)

GoTo 100

End If

上述代码作用:当存在这样的记录,即记录数大于0那么提取数据。

代码的运行:

备注:我写这讲的目的原想是能提高一下在很多的工作表中查询时能提高程序的运行速度,但我在几十个工作表中测试时发现运行的速度反而不如FIND的速度快,这里只是提供给大家一个方法吧。

今日内容回向:

1 如何实现利用ADO在多表中查询?

2 如果用FIND来编写上述代码该如何写呢?

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言