VBA数据库解决方案第二十六讲 工作表中不存在的数据在数据表中批量删除

《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实践经验,全部浓缩在下面的各个教程中:

相关推荐
VBA633717 天前
AI批量PDF数据抓取工具
vba
Access开发易登软件20 天前
我全新开发了一套 Access 通用 Excel 导入工具,现在开源了
数据库·microsoft·excel·mfc·vba·access·access开发
VBA633720 天前
VBA之Word应用第五章第九节 Range对象的方法(三)
vba
wuchunyu00224 天前
VBA 行内容相同时字体变灰
vba
VBA63371 个月前
VBA 64位API声明语句第025讲
vba
Access开发易登软件1 个月前
Access 导入 Markdown 表格:把文档里的数据写进表
前端·html·vba·markdown·access开发
zhongwei2281 个月前
vba将一个文件夹的内容复制到另外一个文件夹的函数,若存在则是否覆盖的参数。复制前检查源文件夹是否存在。若目标文件夹不存在,则新建
前端·vba
Access开发易登软件2 个月前
Access 复杂业务计算,SQL 写在 VBA 还是存储过程?
microsoft·vba·access·access开发
SunnyDays10112 个月前
如何使用 Python 添加和编辑 Excel VBA 宏(无需安装 Excel)
开发语言·python·excel·vba