在简化程序编写-查找里,已经介绍过了查找数据的方法,里面演示的数据非常简单,数据源是没有重复的。
如果数据源里存在重复的时候,结果将会是这样的:

这个和使用Excel的习惯是不一致的,一般在Excel里使用VLookup查找的话,取的会是第一条满足条件的数据;如果是使用VBA字典的方式,获取的是最后放入字典的数据。
也就是只会出现一条记录,很多时候在Excle里处理数据的习惯就是想得到一条结果。
如果要满足这样的情况,使用ADO来处理的话,就要使用sql语句先对数据源做一下处理,先把重复的情况去除掉,再使用原来的sql语句进行查找:
Sub ADOSearchFirst()
Dim AdoConn As Object
Set AdoConn = VBA.CreateObject("ADODB.Connection")
'打开数据库
AdoConn.Open "Provider =Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.fullname & ";Extended Properties=""Excel 12.0;HDR=YES"";"
Range("G2").CopyFromRecordset AdoConn.Execute("select A.项目,B.数据 from [Sheet1$A1:A6] A Left Join (select 项目,First(数据) as 数据 from [Sheet1$D1:E7] group by 项目) B On A.项目=B.项目", , 1)
AdoConn.Close
Set AdoConn = Nothing
End Sub改造一下sql语句可以,通过这条语句:
select 项目,First(数据) as 数据 from [Sheet1$D1:E7] group by 项目获取到一个没有重复的数据源,然后再进行查找。
这里主要用到group by分组,获取First第一个出现的数据,将这条语句放在括号里,相当于括号里的就是一张新的表格,有点类似Excel里公式的嵌套使用。
同时要注意的是,First这个函数不是每一种数据库都可以支持的。
可以单独的运行下这条语句,看下出来的结果就能够更容易理解。
