ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 五万行excel 数据导入ACCESS,需要半小时,如何提速?

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-18 05:20 | 显示全部楼层
感激老师您的无私帮助,我下载下来,好好体会

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-18 05:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
老师:数据库里的更新,而且保证是唯一的值,这个效果已经达到了,但是还有个问题没有解决,就是工作表里,虽然取的也是唯一的姓名和手机,但是不是最后一行的,而是第一行的值,不知道您是否听的懂,(比如说:当前工作表里,有四行数据,其中有两行的姓名和手机是相同的,但是我需要的是取,最后两行的数据),不知道您是否明白我的意思?
也就是说,工作表中有相同的姓名和手机时,我们只取最后面那一行的值,添加到数据库,或者更新数据库?
         很感激您无私的帮助,让我走到了这里,真的很幸运!

TA的精华主题

TA的得分主题

发表于 2013-4-18 13:01 | 显示全部楼层
沉默的流星 发表于 2013-4-18 05:47
老师:数据库里的更新,而且保证是唯一的值,这个效果已经达到了,但是还有个问题没有解决,就是工作表里, ...
  1. Sub 插入数据()
  2.     Dim tt
  3.     tt = Timer
  4.     Dim cnn As Object, rs As Object, SQL$
  5.     Dim arr, i&, s$, s2$, t$
  6.     arr = Range("A1", [iv1].End(1))
  7.     For i = 1 To UBound(arr, 2)
  8.         If arr(1, i) <> "姓名" And arr(1, i) <> "手机" Then
  9.             s = s & ",last(" & arr(1, i) & ") as " & arr(1, i)
  10.             s2 = s2 & ",a." & arr(1, i) & "=b." & arr(1, i)
  11.         Else
  12.             s = s & "," & arr(1, i)
  13.         End If
  14.     Next
  15.     Set cnn = CreateObject("adodb.connection")
  16.     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\通讯录.mdb"
  17.     SQL = "update 通讯录 a,[Excel 8.0;Database=" & ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" & [a1].CurrentRegion.Address(0, 0) & "] b set " & Mid(s2, 2) & " where a.姓名=b.姓名 and a.手机=b.手机"
  18.     cnn.Execute SQL '不判断,更新可能存在的姓名和手机记录
  19.     SQL = "select a.* from (select " & Mid(s, 2) & " from [Excel 8.0;Database=" & ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" & [a1].CurrentRegion.Address(0, 0) _
  20.         & "] group by 姓名,手机) a  left join 通讯录 b on a.姓名=b.姓名 and a.手机=b.手机  where b.姓名 is null"
  21.     Set rs = CreateObject("adodb.recordset")
  22.     rs.Open SQL, cnn, 1, 3
  23.     If rs.RecordCount Then
  24.         SQL = "insert into 通讯录 " & SQL
  25.         cnn.Execute SQL
  26.         MsgBox rs.RecordCount & "行数据已经添加到数据库!用时" & Timer - tt & "秒", vbInformation
  27.     Else
  28.          MsgBox "工作表的数据数据库中已经存在。", vbInformation
  29.     End If
  30.     rs.Close
  31.     cnn.Close
  32.     Set rs = Nothing
  33.     Set cnn = Nothing
  34. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-4-18 13:04 | 显示全部楼层
说明:按照最后出现的记录插入到数据库可以实现,但根据工作表内容更新数据库却不是按照最后出现的记录,因为更新语句不能使用查询
请看附件
工作表数据上传Access.rar (204.74 KB, 下载次数: 188)

TA的精华主题

TA的得分主题

发表于 2013-4-18 14:57 | 显示全部楼层
zhaogang1960 发表于 2013-4-18 13:04
说明:按照最后出现的记录插入到数据库可以实现,但根据工作表内容更新数据库却不是按照最后出现的记录,因 ...

感谢版主耐心指导,EXCEL做前台,ACCESS数据库做后台,学习中

TA的精华主题

TA的得分主题

发表于 2013-4-18 16:15 | 显示全部楼层
把EXCEL内容添加到ACCESS中,学习!

TA的精华主题

TA的得分主题

发表于 2013-4-18 17:25 | 显示全部楼层
zhaogang1960 发表于 2013-4-18 13:01

赵老师您好,您能解释一下这个代码吗?[iv1].end(1)这是什么啊?然后就是那个s字符串中的last是什么意思呢?谢谢啦

TA的精华主题

TA的得分主题

发表于 2013-4-18 17:31 | 显示全部楼层
YincyHe 发表于 2013-4-18 17:25
赵老师您好,您能解释一下这个代码吗?.end(1)这是什么啊?然后就是那个s字符串中的last是什么意思呢?谢 ...

[iv1].end(1)——光标定位在IV1,按住Ctrl,同时按下向左键,下面是录制宏:
Sub Macro1()
    Range("IV1").Select
    Selection.End(xlToLeft).Select'xlToLeft可用1表示
End Sub
last函数——取分组中本字段最后一个,楼主的记录有重复,去掉重复要保留最后一个

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-18 18:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
老师:您好!
      我想了好久,你看可不可以这样,我在数据库中建一个“temp”表,第一步:这个表接收当前工作表中唯一的姓名和手机,(如果有重复的姓名和手机,去最后一个的值),第二步:将“temp”表的值,追加或者更新到“通讯录”表中,我改了一下,您帮我看看,是否可行?是否可以优化?我试了一下,五万行数据,进行这样的操作,大概需要30秒,不过已经可以满足我的需求了。还有一个问题,为什么,导入到“temp”表的数据,是按姓名排序的啊,我没有进行排序啊,这是什么原因呢?谢谢您的帮助和及时的讲解,你的那些语句,我还没完全懂,我会好好的消化的,呵呵,我把附件上传,您帮我把把脉!!!

access数据上传.rar

1.99 MB, 下载次数: 25

点评

access数据库没有行号的概念,导入的数据肯定是按照某个字段排序过的  发表于 2013-4-18 19:22

TA的精华主题

TA的得分主题

发表于 2013-4-18 19:32 | 显示全部楼层
沉默的流星 发表于 2013-4-18 18:48
老师:您好!
      我想了好久,你看可不可以这样,我在数据库中建一个“temp”表,第一步:这个表接收当 ...

有个概念性错误,你导入临时表的数据不是工作表表不重复记录(相同记录取最后的),而是数据库中不存在的记录,这样会导致更新语句无效
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 08:12 , Processed in 0.047942 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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