ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] ADO将EXCEL导入ACCESS有选择地导入

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-4-12 14:08 | 显示全部楼层
Bettyexcel 发表于 2016-4-12 12:56
谢谢赵版。
还有一个问题,发货记录表的标题实际是这样的,更新了附件,别人的标题我没有权力更改,请您 ...

最好是格式、标题都一样,至少是格式要一样,就是说每列对应的数据内容、数据类型是一样的才能用一个查询语句来完成导入操作

TA的精华主题

TA的得分主题

发表于 2016-4-12 14:26 | 显示全部楼层
Bettyexcel 发表于 2016-4-12 12:56
谢谢赵版。
还有一个问题,发货记录表的标题实际是这样的,更新了附件,别人的标题我没有权力更改,请您 ...

Sub Macro1()
    Dim Fso As Object, File As Object, cnn As Object, SQL$, arr, arrf$(), i&, j&, l&, u&, v&, n&, d As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    ReDim arrf(1 To Fso.GetFolder(ThisWorkbook.Path).Files.Count)
    For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
        If File.Name Like "发货记录表*.xlsx" Then
            n = n + 1
            arrf(n) = File
        End If
    Next
    Set d = CreateObject("scripting.dictionary")
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Database.accdb"
    For l = n To 1 Step -1
        SQL = "select f1,f7,f5 from [Excel 12.0;hdr=no;Database=" & arrf(l) & ";].[发货$c6:j] WHERE f8='临时'"
        Set rs = cnn.Execute(SQL)
        If Not rs.EOF Then
            arr = rs.GetRows
            For i = 0 To UBound(arr, 2)
                If Not d.Exists(arr(0, i)) Then
                    d(arr(0, i)) = ""
                    SQL = "select * from 临时 where [Order]='" & arr(0, i) & "'"
                    Set rs = CreateObject("adodb.Recordset")
                    rs.Open SQL, cnn, 1, 3
                    If rs.RecordCount = 0 Then
                        rs.AddNew
                        u = u + 1
                    Else
                        v = v + 1
                    End If
                    For j = 0 To rs.Fields.Count - 1
                        rs.Fields(j) = arr(j, i)
                    Next
                    rs.Update
                End If
            Next
        End If
    Next
    MsgBox "添加" & u & "条记录,更新" & v & "条记录。", vbInformation
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
    Set Fso = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2016-4-12 14:27 | 显示全部楼层
请测试附件
发货记录.rar (56.37 KB, 下载次数: 133)

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-12 14:27 | 显示全部楼层
xd3210 发表于 2016-4-12 14:08
最好是格式、标题都一样,至少是格式要一样,就是说每列对应的数据内容、数据类型是一样的才能用一个查询 ...

格式类型是一样的,只是需要把人家的标题按我的来规范。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-12 14:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

谢谢赵版。有时候文件夹里是没有“发货记录表”的,当文件夹没有此表时,运行后出现了错误提示:
Run time error 424
Object required
想要的结果是,如果文件夹里没有发货记录表时也能顺利运行宏代码。

TA的精华主题

TA的得分主题

发表于 2016-4-12 14:52 | 显示全部楼层
本帖最后由 zhaogang1960 于 2016-4-12 14:54 编辑
Bettyexcel 发表于 2016-4-12 14:46
谢谢赵版。有时候文件夹里是没有“发货记录表”的,当文件夹没有此表时,运行后出现了错误提示:
Run ti ...

如果没有“发货”工作表的不是需要的数据源:
cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Database.accdb"
下面加一句错误处理语句:
On Error Resume Next

如果数据源工作表名不确定,则需要修改程序,自动识别工作表名

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-12 15:08 | 显示全部楼层
zhaogang1960 发表于 2016-4-12 14:52
如果没有“发货”工作表的不是需要的数据源:
cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Sourc ...

非常非常感谢赵版。顺利执行了。强大!!!

TA的精华主题

TA的得分主题

发表于 2016-4-12 15:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub Macro1()
    Dim Fso As Object, File As Object, cnn As Object, SQL$, arr, arrf$(), i&, j&, l&, u&, v&, n&, d As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    ReDim arrf(1 To Fso.GetFolder(ThisWorkbook.Path).Files.Count)
    For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
        If File.Name Like "发货记录表*.xlsx" Then
            n = n + 1
            arrf(n) = File
        End If
    Next
    Set d = CreateObject("scripting.dictionary")
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;;Data Source=" & ThisWorkbook.Path & "\Database.accdb"
    For l = n To 1 Step -1
        SQL = "select f3 as 订单号,f9 as 发货日期,f7 as 发往 from [Excel 12.0;hdr=no;imex=1;Database=" & arrf(l) & ";].[发货$a6:j] WHERE f10='临时'"
        Set rs = cnn.Execute(SQL)
        If Not rs.EOF Then
            arr = rs.GetRows
            For i = 0 To UBound(arr, 2)
                If Not d.Exists(arr(0, i)) Then
                    d(arr(0, i)) = ""
                    SQL = "select * from 临时 where [Order]='" & arr(0, i) & "'"
                    MsgBox SQL
                    Set rs = CreateObject("adodb.Recordset")
                    rs.Open SQL, cnn, 1, 3
                    If rs.RecordCount = 0 Then
                        rs.AddNew
                        u = u + 1
                    Else
                        v = v + 1
                    End If
                    For j = 0 To rs.Fields.Count - 1
                        rs.Fields(j) = arr(j, i)
                    Next
                    rs.Update
                End If
            Next
        End If
    Next
    MsgBox "添加" & u & "条记录,更新" & v & "条记录。", vbInformation
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
    Set Fso = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2016-4-12 15:48 | 显示全部楼层
Sub Macro1()
    Dim Fso As Object, File As Object, cnn As Object, SQL$, arr, arrf$(), i&, j&, l&, u&, v&, n&, d As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    ReDim arrf(1 To Fso.GetFolder(ThisWorkbook.Path).Files.Count)
    For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
        If File.Name Like "发货记录表*.xlsx" Then
            n = n + 1
            arrf(n) = File
        End If
    Next
    Set d = CreateObject("scripting.dictionary")
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;;Data Source=" & ThisWorkbook.Path & "\Database.accdb"
    For l = n To 1 Step -1
        SQL = "select f3 as 订单号,f9 as 发货日期,f7 as 发往 from [Excel 12.0;hdr=no;imex=1;Database=" & arrf(l) & ";].[发货$a6:j] WHERE f10='临时'"
        Set rs = cnn.Execute(SQL)
        If Not rs.EOF Then
            arr = rs.GetRows
            For i = 0 To UBound(arr, 2)
                If Not d.Exists(arr(0, i)) Then
                    d(arr(0, i)) = ""
                    SQL = "select * from 临时 where [Order]='" & arr(0, i) & "'"
                    MsgBox SQL
                    Set rs = CreateObject("adodb.Recordset")
                    rs.Open SQL, cnn, 1, 3
                    If rs.RecordCount = 0 Then
                        rs.AddNew
                        u = u + 1
                    Else
                        v = v + 1
                    End If
                    For j = 0 To rs.Fields.Count - 1
                        rs.Fields(j) = arr(j, i)
                    Next
                    rs.Update
                End If
            Next
        End If
    Next
    MsgBox "添加" & u & "条记录,更新" & v & "条记录。", vbInformation
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
    Set Fso = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2016-4-12 15:49 | 显示全部楼层
Sub Macro1()
    Dim Fso As Object, File As Object, cnn As Object, SQL$, arr, arrf$(), i&, j&, l&, u&, v&, n&, d As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    ReDim arrf(1 To Fso.GetFolder(ThisWorkbook.Path).Files.Count)
    For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
        If File.Name Like "发货记录表*.xlsx" Then
            n = n + 1
            arrf(n) = File
        End If
    Next
    Set d = CreateObject("scripting.dictionary")
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;;Data Source=" & ThisWorkbook.Path & "\Database.accdb"
    For l = n To 1 Step -1
        SQL = "select f3 as 订单号,f9 as 发货日期,f7 as 发往 from [Excel 12.0;hdr=no;imex=1;Database=" & arrf(l) & ";].[发货$a6:j] WHERE f10='临时'"
        Set rs = cnn.Execute(SQL)
        If Not rs.EOF Then
            arr = rs.GetRows
            For i = 0 To UBound(arr, 2)
                If Not d.Exists(arr(0, i)) Then
                    d(arr(0, i)) = ""
                    SQL = "select * from 临时 where [Order]='" & arr(0, i) & "'"
                    MsgBox SQL
                    Set rs = CreateObject("adodb.Recordset")
                    rs.Open SQL, cnn, 1, 3
                    If rs.RecordCount = 0 Then
                        rs.AddNew
                        u = u + 1
                    Else
                        v = v + 1
                    End If
                    For j = 0 To rs.Fields.Count - 1
                        rs.Fields(j) = arr(j, i)
                    Next
                    rs.Update
                End If
            Next
        End If
    Next
    MsgBox "添加" & u & "条记录,更新" & v & "条记录。", vbInformation
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
    Set Fso = Nothing
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-10 17:07 , Processed in 0.024393 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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