《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64位OFFICE系统测试。
这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:VBA数据库解决方案第二十六讲 工作表中不存在的数据在数据表中批量删除

【分享成果,随喜正能量】成长必须分清主次:第一,自己的事情优先,别人的事情靠后。比如你要健身,别人找你逛街,不好意思,健身优先;第二,成长的事情优先,兴趣爱好靠后。比如你要考研,但你很喜欢画画,不好意思,考研优先。人的时间非常有限,没有优先意识,必然劳而无功。
第二十六讲 工作表中不存在的数据在数据表中批量删除
大家好,我们今日继续讲解VBA数据库解决方案的第26讲内容:利用VBA,把工作表中不存在的记录在数据表中批量删除。在前两讲中,我们讲了根据工作表的数据删除数据表数据的方法,大家要在工作中多利用,很多的知识点是非常灵活的,当你一旦利用了这些方法,工作中的数据处理就会得心应手,效率也会大大的提高,知识是用来利用的,VBA的每个知识点,利用好了都会收到很好的效果.
1 应用场景的具体分析
我们今天讲的内容是上面两讲内容的延伸:在处理数据的时候,我们往往会遇到很多情况,其中最常见的是数据的核对,比如我们的数据库中有很多的数据,是否准确呢?我们要定期清洗。清洗数据最基本的方法是导出数据,和现场逐一核对,然后在EXCEL表格中做成标识,没有的删除,这个时候如何把数据表中的数据也同步处理呢?今日我们需要解决的就是这个问题。
实例:如下的工作表数据,和数据库中相应的数据不是完全一致的,数据库中的数据肯定是比工作表中的数据多,要把数据库中多余的数据一次性删除。

该怎么处理呢?为了在之后的运行过程中验证数据,我们先把数据表中的数据导出看一下:

我们发现在数据库中多余的数据是100036、100040。下面我们着手解决。
2 删除工作表不存在,数据表中存在多余记录的代码及代码解读
代码:
Sub mynz_26() '第26讲 工作表不存在,数据表中存在的多余记录删除
Dim cnADO As Object, rsADO As Object
Dim strPath As String, strTable As String, strWhere As String, strSQL As String, 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
代码截图:

代码讲解:
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 & ".员工编号)"
打开记录后然后删除。对于这种连接方式,我在后续的讲解中会的讲到,
下面我们看运行的效果(由于测试数据库在反复使用,您测试时数据可能与此略有不同),首先提示删除前的的记录数:

然后提示删除的记录数:

最后提示删除后的的记录数:

我们再次显示数据库中记录:

今日内容回向:
1 如何做到工作表和数据表数据的统一?
2 上述数据的处理是否还有其他的方案?
我20多年的VBA实践经验,全部浓缩在下面的各个教程中: 


