![c3937fca51cab369013ba25cd994bef2.png](https://i-blog.csdnimg.cn/blog_migrate/c02c228ab6c5ac6cd0f20636e3989d61.png)
大家好,我们今日继续讲解VBA数据库解决方案的第25讲内容:利用VBA,把工作表中提供的数据在数据表中批量删除的方法。在上一讲中,我们讲了实现在数据表中删除记录的一般方法,这种方法可以对重复的数据进行处理,但实际的情况是,我们的数据记录很多时候是没有重复的,而且如果数据量很大,该怎么处理呢?今日我们就讲解如何在记录集中批量删除给定记录的方法。
实例:我们有一个员工的信息表,导出的数据如下:
![55b76357afe3711f80c09296b5d416d0.png](https://i-blog.csdnimg.cn/blog_migrate/f0ef8abcd1bd6d26312958b2e0233175.jpeg)
在工作实际中我们需要删除其中的100014,100015,100017,100018,的记录,当然还可以更多,如下表格是需要在数据库中删除的数据信息:
![e9381dde56867b74374063c8883305ce.png](https://i-blog.csdnimg.cn/blog_migrate/a3e4f03ac6e0cd716c8dc7172224754c.jpeg)
也就是说我们要删除的数据中是以员工编号为索引的记录,这个时候需要如何处理?代码该如何写呢?如果仍采用上讲的办法也是可以的,但今天我们将介绍一种新的方法。代码如下:
Sub mynzCreateDataTable_3() '第25讲 利用VBA把工作表中提供的数据在数据表中批量删除的方法
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 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
代码截图:
![340939f75a32497eb105bd4d752b7b63.png](https://i-blog.csdnimg.cn/blog_migrate/3736c0f9bcd225f820e62db63e4b3a47.jpeg)
代码讲解:
1 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
在上述的代码中我们用的是后期绑定的方法,建立了ADO连接,并且汇报当前的记录数,
2 strWhere = " WHERE 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语句把EXCEL工作表和数据表进行了连接,并打开了符合要求的记录集。关于EXCEL的连接方式,在这本书中有介绍,这里不再多说,打开记录后仍旧用DELETE的方法进行删除,之后弹出对话框告诉用户删除的数量。
下面我们看运行情况:
上述代码在执行过程中首先会提示删除数据前的记录数:
![deaa0860697742b5eda1b706a5aa1d24.png](https://i-blog.csdnimg.cn/blog_migrate/cea689e62593a327c03bc76496cb6d86.jpeg)
然后提供删除记录的信息:
![ae5e91902a62e691efbe54377efe8911.png](https://i-blog.csdnimg.cn/blog_migrate/d5901640931eef8804175c7b4852f576.jpeg)
最后提供删除后的记录提示:
![83311ef4c0d7411b8f2a82527695a766.png](https://i-blog.csdnimg.cn/blog_migrate/d1edb33cdfd71a360a57f05ed1665c70.jpeg)
为了验证数据我们需要再次显示记录数,点击显示记录即可:
![3172165ea591bfe75304fc0cdc39b141.png](https://i-blog.csdnimg.cn/blog_migrate/652ca79b92e8e7dc6fa968babda29407.jpeg)
今日内容回向:
1 如何批量删除数据表中的数据?
2 如何连接EXCEL的工作表?
《VBA代码解决方案》系列电子书,是我将一些非常实用的VBA内容结集成册,PDF格式文件,朋友们可以从中查找到你想要解决问题的思路和方法,可以复制文中的VBA代码直接使用。有需要的朋友微信联络我NZ9668。