ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] ADO法多文件汇总的一些细节问题。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-8-6 17:59 | 显示全部楼层 |阅读模式

大家好,我在学习用ADO法汇总同目录下多个文件时候,遇到如下问题:
用下面的语句汇总得到的结果会有部分单元格内容丢失
不知道是什么原因?希望能得到大家的帮助!
图片中黄色部分是丢失了单元格内容!
图片中蓝色部分是“数值”内容被转换成文本!

Sub ADO()
Application.ScreenUpdating = False
Application.EnableEvents = False
Mypath = ThisWorkbook.Path & "\"
MyFile = Dir(Mypath & "*.xls")
Dim cnn As Object
    Do While MyFile <> ""
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & Mypath & MyFile
    Set rs = cnn.openschema(20)
        Do Until rs.EOF
            If rs.Fields("TABLE_TYPE") = "TABLE" Then
                sh = Replace(rs("TABLE_NAME").Value, "'", "")
                    If Right(sh, 1) = "$" Then
                        SQL = "select * from [" & sh & "] where 1=2"
                        Set rst = cnn.Execute(SQL)
                            If rst.Fields(0).Name <> "F1" Then
                                On Error Resume Next
                                SQL = "select 日期,产品名称,数量 from [" & sh & "]"
                                Sheet2.Range("a" & Rows.Count).End(xlUp).Offset(1).CopyFromRecordset cnn.Execute(SQL)
                                Exit Do
                            End If
                    End If
            End If
        rs.movenext
        Loop
    MyFile = Dir()
    Loop
rst.Close
rs.Close
cnn.Close
Set rst = Nothing
Set rs = Nothing
Set cnn = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

ADO汇总.png

汇总.rar

35.89 KB, 下载次数: 141

TA的精华主题

TA的得分主题

发表于 2016-8-6 19:41 | 显示全部楼层
请更改红色行:
Sub ADO()
Application.ScreenUpdating = False
Application.EnableEvents = False
Mypath = ThisWorkbook.Path & "\"
MyFile = Dir(Mypath & "*.xls*")
Dim cnn As Object
     Do While MyFile <> ""
     Set cnn = CreateObject("adodb.connection")
     cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & Mypath & MyFile
     Set rs = cnn.openschema(20)
         Do Until rs.EOF
             If rs.Fields("TABLE_TYPE") = "TABLE" Then
                 sh = Replace(rs("TABLE_NAME").Value, "'", "")
                     If Right(sh, 1) = "$" Then
                         SQL = "select * from [" & sh & "] where 1=2"
                         Set rst = cnn.Execute(SQL)
                             If rst.Fields(0).Name <> "F1" Then
                                 On Error Resume Next
                                 SQL = "select 日期,产品名称,数量 from [" & sh & "]"
                                 Sheet2.Range("a" & Rows.Count).End(xlUp).Offset(1).CopyFromRecordset cnn.Execute(SQL)
                                 Exit Do
                             End If
                     End If
             End If
         rs.movenext
         Loop
     MyFile = Dir()
     Loop
rst.Close
rs.Close
cnn.Close
Set rst = Nothing
Set rs = Nothing
Set cnn = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub


TA的精华主题

TA的得分主题

发表于 2016-8-6 19:50 | 显示全部楼层
你的工作簿文件有两种不同版本的office文件,后缀为xls是97~03版的,07版以后都以xlsx为后缀,加个通配符解决。

TA的精华主题

TA的得分主题

发表于 2016-8-6 20:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub ADO()
Dim objWMI As Object
Const HKEY_LOCAL_MACHINE = &H80000002
Set objWMI = GetObject("winmgmts:\\.\root\default:StdRegProv")
objWMI.SetDWORDValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Office\" & Application.Version & "\Access Connectivity Engine\Engines\Excel", "TypeGuessRows", 0
Application.ScreenUpdating = False
Application.EnableEvents = False
Mypath = ThisWorkbook.Path & "\"
MyFile = Dir(Mypath & "*.xls")
Dim cnn As Object
    Do While MyFile <> ""
    If InStr(ThisWorkbook.Name, MyFile) = 0 Then
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0;imex=1';data source=" & Mypath & MyFile
    Set rs = cnn.openschema(20)
        Do Until rs.EOF
            If rs.Fields("TABLE_TYPE") = "TABLE" Then
                sh = Replace(rs("TABLE_NAME").Value, "'", "")
                    If Right(sh, 1) = "$" Then
                        SQL = "select * from [" & sh & "] where 1=2"
                        Set rst = cnn.Execute(SQL)
                            If rst.Fields(0).Name <> "F1" Then
                                SQL = "select 日期,产品名称,数量 from [" & sh & "]"
                                Sheet2.Range("a" & Rows.Count).End(xlUp).Offset(1).CopyFromRecordset cnn.Execute(SQL)
                                Exit Do
                            End If
                    End If
            End If
        rs.movenext
        Loop
    End If
    MyFile = Dir()
    Loop
rst.Close
rs.Close
cnn.Close
Set rst = Nothing
Set rs = Nothing
Set cnn = Nothing
With ActiveSheet.UsedRange
    .Value = .Value
End With
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-8-6 20:05 | 显示全部楼层
ADO对数据要求很严格,不能随心所欲使用,否则会出现意想不到的错误
建议:
一、每一列格式相同,日期列就是日期,不能有其他文字或数字,名称列也不能有数字
二、标题行放在第一行

TA的精华主题

TA的得分主题

发表于 2016-8-7 06:41 | 显示全部楼层
本帖最后由 lsc900707 于 2016-8-7 06:47 编辑
zhaogang1960 发表于 2016-8-6 20:05
ADO对数据要求很严格,不能随心所欲使用,否则会出现意想不到的错误
建议:
一、每一列格式相同,日期列 ...

赵老师,有的人根本不知道这些要求,拼凑一些数据来质疑代码,耽误您的宝贵时间,看着揪心。

TA的精华主题

TA的得分主题

发表于 2016-8-7 07:46 | 显示全部楼层
这是通过修改注册表实现的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-8 08:41 | 显示全部楼层
zhaogang1960 发表于 2016-8-6 20:05
ADO对数据要求很严格,不能随心所欲使用,否则会出现意想不到的错误
建议:
一、每一列格式相同,日期列 ...

我懂了,谢谢赵老师!!
我从代码中没看出来问题在哪里才来提问的,
原来在判断“TABLE_TYPE”的时候,就已经判断好哪些是文字,哪些是数值啦。
真是太不可思议了!!!还可以根据列的内容判断列的基本类型。
谢谢赵老师,我会细心使用您教我的方法的!


每天加班2小时,周六加班10小时,就围着这些excel汇总转。
每月4000多份excel汇总,不敢出差错,谢谢赵老师反复耐心解答和教我知识

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-8 08:44 | 显示全部楼层
lsc900707 发表于 2016-8-6 19:50
你的工作簿文件有两种不同版本的office文件,后缀为xls是97~03版的,07版以后都以xlsx为后缀,加个通配符解 ...

感谢!实在没时间系统学习这些知识!感谢教我。

TA的精华主题

TA的得分主题

发表于 2016-8-26 19:19 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 01:47 , Processed in 0.041512 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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