VBA数据库解决方案第三十一讲 DELETE+ADDNEW实现类似于UPDATA功能

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

相关推荐
Access开发易登软件2 小时前
Access 用 VBA 操作 SQLite,不用装任何驱动
jvm·数据库·sqlite·vba·access·access开发
Access开发易登软件6 天前
Access 和 SQLite,根本不在一个赛道上
java·jvm·数据库·sqlite·excel·vba·access开发
sduwcgg18 天前
Zotero插入的文献添加交叉引用
vba
VBA633721 天前
如何学习VBA之1.4 理解4---事件
vba
专注VB编程开发20年1 个月前
傻瓜式Office 功能区插件 / Ribbon开发模板
ribbon·excel·vba·插件·扩展宏
weitingfu2 个月前
Excel VBA 入门到精通(十):实战项目——自动化报表系统开发
ai·信息可视化·自动化·excel·vba·office·报表系统
VBA63372 个月前
如何学习VBA之1:初学VBA人员要重视程序文件
vba
VBA63372 个月前
VBA高级应用30例应用6 第2部分:利用XML文件修改Excel单元格字符
vba