![bc5df6096bff070bd34aaf02fa0702c4.png](https://i-blog.csdnimg.cn/blog_migrate/d8054b951d34e9800acd840c24910165.png)
大家好,我们今日继续讲解VBA数据库解决方案的第26讲内容:利用VBA,把工作表中不存在的记录在数据表中批量删除。在前两讲中,我们讲了根据工作表的数据删除数据表数据的方法,大家要在工作中多利用,很多的知识点是非常灵活的,当你一旦利用了这些方法,工作中的数据处理就会得心应手,效率也会大大的提高,知识是用来利用的,VBA的每个知识点,利用好了都会收到很好的效果.
我们今天讲的内容是上面两讲内容的延伸:在处理数据的时候,我们往往会遇到很多情况,其中最常见的是数据的核对,比如我们的数据库中有很多的数据,是否准确呢?我们要定期核对.核对最基本的方法是导出数据,和现场逐一核对,然后在EXCEL表格中做成标识,没有的删除,这个时候如何把数据表中的数据也同步处理呢?今日我们需要解决的就是这个问题。
实例:如下的工作表数据,和数据库中相应的数据不是完全一致的,数据库中的数据肯定是比数据表中的数据多,要把数据库中多余的数据一次性删除.
![d973c7d7f8d7ad6081eaba6ef2120e25.png](https://i-blog.csdnimg.cn/blog_migrate/ac6786dedac2e2876142e000e170707f.jpeg)
该怎么处理呢?为了在之后的运行过程中验证数据,我们先把数据表中的数据导出看一下:
![a787bcdf7b65a712538208aec475317e.png](https://i-blog.csdnimg.cn/blog_migrate/9130ad3b7226db1e1fa771d3845cf063.jpeg)
我们发现在数据库中多余的数据是100020。下面我们着手解决。代码:
Sub mynzCreateDataTable_4() '第26讲 工作表不存在,数据表中纯在的多余记录记录删除
Dim cnADO, rsADO As Object
Dim strPath, strTable, strWhere, strSQL, strMsg As String
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.Path & "mydata2.accdb"
strTable = "员工信息"
cnADO.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & strPath
strSQL = "SELECT * FROM " & strTable
rsADO.Open strSQL, cnADO, 1, 3
'汇报给用户记录数
MsgBox "删除前记录数为:" & rsADO.RecordCount
rsADO.Close
strWhere = " WHERE NOT EXISTS(SELECT * FROM [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" _
& Range("a1").CurrentRegion.Address(0, 0) & "] WHERE 员工编号=" & strTable & ".员工编号)"
strSQL = "SELECT 员工编号 FROM " & strTable & strWhere
rsADO.Open strSQL, cnADO, 1, 3
If rsADO.RecordCount > 0 Then
strSQL = "DELETE FROM " & strTable & strWhere
cnADO.Execute strSQL
MsgBox rsADO.RecordCount & "条记录被删除。", vbInformation, "提示"
Else
MsgBox "没有发现需要删除的记录。", vbInformation, "提示"
End If
rsADO.Close
strSQL = "SELECT * FROM " & strTable
rsADO.Open strSQL, cnADO, 1, 3
'汇报给用户记录数
MsgBox "删除后记录数为:" & rsADO.RecordCount
'释放内存
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代码截图:
![9a9cc8793f18a7d49f1a46222e6ae262.png](https://i-blog.csdnimg.cn/blog_migrate/8c6a2e1be56dbd99076bf6179539f28b.jpeg)
代码讲解:
1 strWhere = " WHERE NOT EXISTS(SELECT * FROM [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" _
& Range("a1").CurrentRegion.Address(0, 0) & "] WHERE 员工编号=" & strTable & ".员工编号)"
strSQL = "SELECT 员工编号 FROM " & strTable & strWhere
rsADO.Open strSQL, cnADO, 1, 3
If rsADO.RecordCount > 0 Then
strSQL = "DELETE FROM " & strTable & strWhere
cnADO.Execute strSQL
MsgBox rsADO.RecordCount & "条记录被删除。", vbInformation, "提示"
Else
MsgBox "没有发现需要删除的记录。", vbInformation, "提示"
End If
rsADO.Close
上述代码描述了不在工作表中但存在数据表中的记录逻辑:表示为: " WHERE NOT EXISTS(SELECT * FROM [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" _
& Range("a1").CurrentRegion.Address(0, 0) & "] WHERE 员工编号=" & strTable & ".员工编号)"
打开记录后然后删除。
下面我们看运行的效果,首先提示删除前的的记录数:
![495d3cf1fe4c9f84fcc8f8fe0a533282.png](https://i-blog.csdnimg.cn/blog_migrate/15626ca189348b2f469875a2c65a3c70.jpeg)
然后提示删除的记录数:
![e211c63c308fe948ba8ab4004279a6eb.png](https://i-blog.csdnimg.cn/blog_migrate/6747c713ae1769efa534ff092c2b23d8.jpeg)
最后提示删除后的的记录数:
![533f44080c3e623cdc8fd06015b3d7fc.png](https://i-blog.csdnimg.cn/blog_migrate/5d82c7c0132dbd6970953774c2ee1468.jpeg)
我们再次显示数据库中记录:
![752e1a253e37a201611bf93d8d2baef2.png](https://i-blog.csdnimg.cn/blog_migrate/62f15f637ca0759d75c7d94fc44fad16.jpeg)
今日内容回向:
1 如何做到工作表和数据表数据的统一?
2 上述数据的处理是否还有其他的方案?
《VBA代码解决方案》系列电子书,是我将一些非常实用的VBA内容结集成册,PDF格式文件,朋友们可以从中查找到你想要解决问题的思路和方法,可以复制文中的VBA代码直接使用。有需要的朋友微信联络我NZ9668。