ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 导入ACCESS数据速度太慢,求大神帮忙。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-28 09:56 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 kohaddf 于 2015-11-28 11:30 编辑

     各位大神,因为工作上要处理的数据的太多,用EXCEL处理太慢。自己在网上找了参照的教程弄了一个功能,主要是将一些固定的工作薄数据导入到ACCESS中,然后再进行操作。但是发现导入的速度太慢了,一万多条数据,耗时28分钟。。。至少都要有十几万的数据。。在这里求大神看看,是我的程序有哪些需要改进的地方,或者有没有其他可以提高速度的方式,前提是可以减少人工操作。
下面操作是打开指定文件,将数据库里面不存在的运单编号存入,有运单编号的查看扫描时间,取扫描时间比较大的数据。
    For Each selectfiles In fd.SelectedItems
        Workbooks.Open selectfiles
        arr0 = ActiveWorkbook.Sheets(1).Range("A1").CurrentRegion
        head = WorksheetFunction.Index(arr0, 1, 0)
        With rs
        For i = 2 To UBound(arr0, 1) Step 1
            arr1 = WorksheetFunction.Index(arr0, i, 0)
            Set rs = New ADODB.Recordset
            sql = "select * from " & djb & " where 运单编号=""" & arr1(1) & """"
            rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
            If IsNumeric(arr1(1)) = False Or arr1(1) = "" Then
                Exit For
            ElseIf rs.RecordCount = 0 Then
                rs.AddNew head, arr1
                allcount = allcount + 1
             ElseIf rs.RecordCount > 0 Then

                If Format(rs.Fields(4), "yyyy-mm-dd hh:mm:ss") < Format(arr1(5), "yyyy-mm-dd hh:mm:ss") Then
                    For j = 1 To rs.Fields.Count
                        rs.Fields(j - 1) = arr1(j)
                    Next j
                    rs.Update
                    allcount = allcount + 1
                End If
            Else
            End If

            progressbar i, UBound(arr0, 1), ActiveWorkbook.Name
            DoEvents
        Next
        End With
        ActiveWorkbook.Close
    Next selectfiles

    'Set the object variable to Nothing.
    tim = Timer - tim
    MsgBox "导入完成,共导入" & allcount & "行数据,耗时" & Int(tim \ 3600) & "小时" & Int(tim Mod 3600) \ 60 & "分" & Int(tim Mod 60) & "秒"
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
    Set fd = Nothing


测试.zip

41.26 KB, 下载次数: 15

TA的精华主题

TA的得分主题

发表于 2015-11-30 12:08 | 显示全部楼层
创建那么多记录集,想快估计也快不到哪里去吧?
Set rs = New ADODB.Recordset
For Each selectfiles In fd.SelectedItems
        Workbooks.Open selectfiles
        arr0 = ActiveWorkbook.Sheets(1).Range("A1").CurrentRegion
        head = WorksheetFunction.Index(arr0, 1, 0)
        With rs
        For i = 2 To UBound(arr0, 1) Step 1
            arr1 = WorksheetFunction.Index(arr0, i, 0)
            
            sql = "select * from " & djb & " where 运单编号=""" & arr1(1) & """"
            rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
            If IsNumeric(arr1(1)) = False Or arr1(1) = "" Then
                Exit For
            ElseIf rs.RecordCount = 0 Then
                rs.AddNew head, arr1
                allcount = allcount + 1
             ElseIf rs.RecordCount > 0 Then

                If Format(rs.Fields(4), "yyyy-mm-dd hh:mm:ss") < Format(arr1(5), "yyyy-mm-dd hh:mm:ss") Then
                    For j = 1 To rs.Fields.Count
                        rs.Fields(j - 1) = arr1(j)
                    Next j
                    rs.Update
                    allcount = allcount + 1
                End If
            Else
            End If

            progressbar i, UBound(arr0, 1), ActiveWorkbook.Name
            DoEvents        Next
        End With
       rs.close
        ActiveWorkbook.Close
    Next selectfiles

    'Set the object variable to Nothing.
    tim = Timer - tim
    MsgBox "导入完成,共导入" & allcount & "行数据,耗时" & Int(tim \ 3600) & "小时" & Int(tim Mod 3600) \ 60 & "分" & Int(tim Mod 60) & "秒"

    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
    Set fd = Nothing
可能改不了多少,如果可以最好用Access自身的功能来导入【例如先链接Excel表,再通过追加查询进行处理】。

TA的精华主题

TA的得分主题

发表于 2015-12-1 09:48 | 显示全部楼层
从代码来看,你的数据比较规整,如果在ACCESS里做程序的话。效率会更高,但高主要不是在于代码方面
而是ACCESS有提供一种链接表方式,可以把比较规整的Excel的sheet在ACCESS里形成一个可以直接使用的表(就当作是一个快捷方式的表),使用起来,和正常表差不多
这样,在数据写入进,就不用着循环字段或数组了,并且,这个链接表,可以只建立一个,随使用更改链接地址就行,前提呢,你的EXCEL的sheet文件是规整的,比如第一行就是列名,后面的都 是数据行等

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-1 14:44 | 显示全部楼层
谢谢,两位。数据量太大了,用单个导入的确效率太慢了。我转入学习ACCESS了,谢谢!

TA的精华主题

TA的得分主题

发表于 2015-12-1 15:11 | 显示全部楼层
kohaddf 发表于 2015-12-1 14:44
谢谢,两位。数据量太大了,用单个导入的确效率太慢了。我转入学习ACCESS了,谢谢!

这样的recordset+field的两项嵌套循环,哪种写法都快不到哪去啊。
在ACCESS里,从过程看来,Field可能可以不用,并且recordset也可以减少一些(至少时间上的那个判断就不用写了)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 03:43 , Processed in 0.043186 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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