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

【分享成果,随喜正能量】在这个社会上,对别人好一点,多站在别人的角度考虑,不要为小事争执,不要取笑他人,不要在别人背后嚼舌根,更不能逼人太甚。凡事退一步,对你有好处。
第三十一讲 DELETE+ADDNEW实现类似于UPDATA功能
大家好,今日我们继续VBA数据库解决方案的第31讲:用DELETE+ADDNEW的方法实现类似于UPDATA的方法实例。在最近的讲解中,我总在强调,实现目的方法有很多种,我们要灵活的对应。今日我们的内容同上一讲的目的一样,但我们要用其他的方法来实现。内容是用DELETE+ADDNEW的方法实现类似UPDATA的方法。
1 应用场景的具体分析
实例:下面的工作表为数据库中员工信息表的记录

我们要把其中部门是"一厂""二厂"的记录修正为"三厂",用DELETE+ADDNEW如何做到呢?
2 DELETE+ADDNEW方法实现批量编辑的代码及代码解读
好的,我们仍是先看看程序代码:
Sub mynz_31()
'第31讲 用DELETE+ADDNEW的方法实现UPDATA的方法
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
'汇报给用户记录数
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
'添加记录
Sheets(ActiveSheet.Name).Select
t = 2
Do While Cells(t, 1) <> ""
If rsADO.RecordCount > 0 Then rsADO.MoveLast
rsADO.addnew
For i = 0 To rsADO.Fields.Count - 1
rsADO.Fields(i) = ActiveSheet.Cells(t, i + 1)
Next i
rsADO.Update
t = t + 1
Loop
'汇报给用户最后的记录数
MsgBox "添加后记录数为:" & rsADO.RecordCount
'释放内存
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
部分代码截图:

代码的解读:
1)先删除记录:
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
这段代码实现了将工作表的数据在数据表中删除的功能,并随时汇报后台程序的进展情况。
2) 在运行完删除的功能后,将进入到下面的代码:
'添加记录
Sheets(ActiveSheet.Name).Select
t = 2
Do While Cells(t, 1) <> ""
If rsADO.RecordCount > 0 Then rsADO.MoveLast
rsADO.addnew
For i = 0 To rsADO.Fields.Count - 1
rsADO.Fields(i) = ActiveSheet.Cells(t, i + 1)
Next i
rsADO.Update
t = t + 1
Loop
'汇报给用户最后的记录数
MsgBox "添加后记录数为:" & rsADO.RecordCount
以上代码将根据工作表中提供的数据在数据表中添加记录。
下面我们看看程序的运行,首先会提示给用户删除前的记录数:

接着提示删除的记录数:

并告诉用户删除后记录数为0:

最后添加记录,并汇报添加后的记录数:

我们再次看看现在数据库中的记录情况:

今日内容回向:
1 本讲的内容利用了之前哪讲的内容?
2 通过本讲的讲解,读者是否有新的思路?
本讲内容参考程序文件:VBA与数据库操作(第一册).xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

