ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: YincyHe

[求助] Access VBA根据特定的条件,将excel表中的数据更新到Access数据库中

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-6-3 16:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
YincyHe 发表于 2013-6-3 16:40
谢谢老师的多次回答,这个确实没法用update来更新的,因为它就是有重复的,所以我自己用了另外的方法,就 ...

你提供的3个字段判断似乎不够,存在重复记录,使用什么方法都不好更新,建议再加一个字段作为条件,以排除重复

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-3 16:44 | 显示全部楼层
zhaogang1960 发表于 2013-6-3 16:43
你提供的3个字段判断似乎不够,存在重复记录,使用什么方法都不好更新,建议再加一个字段作为条件,以排除 ...

这个没有办法,只能用这三个字段,所以就无法更新了

点评

此问题挺有代表性,我专门发了一帖请参考: http://club.excelhome.net/thread-1023636-1-1.html  发表于 2013-6-3 22:59

TA的精华主题

TA的得分主题

发表于 2013-6-3 16:55 | 显示全部楼层
YincyHe 发表于 2013-6-3 16:44
这个没有办法,只能用这三个字段,所以就无法更新了

如果有重复,可考虑用逐条记录更新的方法,每次仅更新一个记录,稍候我研究一下

TA的精华主题

TA的得分主题

发表于 2013-6-3 17:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
YincyHe 发表于 2013-6-3 16:44
这个没有办法,只能用这三个字段,所以就无法更新了
  1. Sub 更新插入数据()
  2.     Dim cnn As Object, rs As Object, SQL$
  3.     Dim arr, i&, t$, d As Object, ds As Object
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set ds = CreateObject("scripting.dictionary")
  6.     arr = [a1].CurrentRegion
  7.     Set cnn = CreateObject("adodb.connection")
  8.     cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\test.accdb"
  9.     For i = 2 To UBound(arr)
  10.         t = arr(i, 1) & Chr(9) & arr(i, 2)
  11.         d(t) = d(t) + 1 '记录工作表中LastName和FirstName出现的次序
  12.         SQL = "select * from Sheet1 where LastName='" & arr(i, 1) & "' and  FirstName='" & arr(i, 2) & "'"
  13.         Set rs = CreateObject("adodb.Recordset")
  14.         rs.Open SQL, cnn, 1, 3
  15.         If rs.RecordCount = 0 Then
  16.             rs.AddNew
  17.             For j = 1 To 7
  18.                 rs.Fields(j - 1).Value = arr(i, j)
  19.             Next j
  20.             rs.Update
  21.         Else
  22.             t = rs.Fields(0).Value & Chr(9) & rs.Fields(1).Value
  23.             ds(t) = ds(t) + 1 '记录数据库中LastName和FirstName出现的次序
  24.             If ds(t) = d(t) Then '如果两个出现次序相同,则更新改记录
  25.                 For j = 3 To 7
  26.                     rs.Fields(j - 1).Value = arr(i, j)
  27.                 Next j
  28.                 rs.Update
  29.             End If
  30.         End If
  31.     Next

  32.     MsgBox "数据保存完毕!", vbInformation + vbOKOnly
  33.     rs.Close
  34.     cnn.Close
  35.     Set rs = Nothing
  36.     Set cnn = Nothing
  37. End Sub



复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-6-3 17:18 | 显示全部楼层
test.rar (31.52 KB, 下载次数: 63)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-6-3 17:30 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-6-3 17:48 编辑

改进一下:
  1. Sub 更新插入数据()
  2.     Dim cnn As Object, rs As Object, SQL$
  3.     Dim arr, i&, t$, d As Object, ds As Object
  4.     Set d = CreateObject("scripting.dictionary")
  5.     arr = [a1].CurrentRegion
  6.     Set cnn = CreateObject("adodb.connection")
  7.     cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\test.accdb"
  8.     For i = 2 To UBound(arr)
  9.         t = arr(i, 1) & Chr(9) & arr(i, 2)
  10.         d(t) = d(t) + 1 '记录工作表中LastName和FirstName出现的次序
  11.         SQL = "select * from Sheet1 where LastName='" & arr(i, 1) & "' and  FirstName='" & arr(i, 2) & "'"
  12.         Set rs = CreateObject("adodb.Recordset")
  13.         rs.Open SQL, cnn, 1, 3
  14.         If rs.RecordCount Then
  15.             Set ds = CreateObject("scripting.dictionary")
  16.             For l = 1 To rs.RecordCount
  17.                 t = rs.Fields(0).Value & Chr(9) & rs.Fields(1).Value
  18.                 ds(t) = ds(t) + 1 '记录数据库中LastName和FirstName出现的次序
  19.                 If ds(t) = d(t) Then '如果两个出现次序相同,则更新改记录
  20.                     For j = 1 To 7
  21.                         rs.Fields(j - 1) = arr(i, j)
  22.                     Next j
  23.                     rs.Update
  24.                     Exit For
  25.                 End If
  26.                 rs.movenext
  27.             Next
  28.         End If
  29.     Next
  30.    
  31.     SQL = "select a.* from [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" & [a1].CurrentRegion.Address(0, 0) _
  32.         & "] a left join Sheet1 b on a.LastName=b.LastName and a.FirstName=b.FirstName  where b.LastName is null"
  33.     Set rs = CreateObject("adodb.recordset")
  34.     rs.Open SQL, cnn, 1, 3
  35.     If rs.RecordCount Then
  36.         SQL = "insert into Sheet1 " & SQL
  37.         cnn.Execute SQL
  38.         MsgBox rs.RecordCount & "行数据已经添加到数据库!", vbInformation
  39.     Else
  40.          MsgBox "工作表的数据数据库中已经存在。", vbInformation
  41.     End If
  42.    
  43.     rs.Close
  44.     cnn.Close
  45.     Set rs = Nothing
  46.     Set cnn = Nothing
  47. End Sub



复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-6-3 17:31 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-6-3 17:49 编辑

请看附件
test.rar (32.65 KB, 下载次数: 153)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-4 11:23 | 显示全部楼层
zhaogang1960 发表于 2013-6-3 17:31
请看附件

真的是太感谢老师您了!

TA的精华主题

TA的得分主题

发表于 2013-8-30 22:57 | 显示全部楼层
又从ZHAO大哥贴子中学习了,有问题想请教下,如数据不是保存在SHEET1中,而是另有名称,如SHEET("123")
原代码SQL = "insert into Sheet1 " & SQL,是改成SQL = "insert intoSHEET("123")" & SQL么

TA的精华主题

TA的得分主题

发表于 2013-8-30 23:28 | 显示全部楼层
庞文 发表于 2013-8-30 22:57
又从ZHAO大哥贴子中学习了,有问题想请教下,如数据不是保存在SHEET1中,而是另有名称,如SHEET("123")
原代码 ...

Sheet1是数据库中的数据表,不能用intoSHEET("123")表示,数据表名可以是123:
SQL = "insert into 123 " & SQL
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-25 20:33 , Processed in 0.036273 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表