ExcelHome技术论坛

 找回密码
 免费注册
QQ登录 只需一步,快速开始
新浪微博登陆 只需一步, 快速开始
   
高效办公必会的Office99uu优优 永久免费,网表让Excel秒变数据库 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! 国内首部Excel函数公式学习大典 职场充电黑科技, Office微99uu优优 免费下载Excel行业应用视频
300集Office 2010微99uu优优 Tableau-数据可视化工具 突破Excel限制,用活字格提高效率 12门Excel免费公开课任你学
你的Excel 201099uu优优学习锦囊 欲罢不能, 过目难忘的 Office 新界面 免费的Excel考勤计算系统
查看: 301|回复: 11
打印 上一主题 下一主题

[求助] 使用SQL方法不打开文件获取数据

[复制链接]
TA的精华主题TA的得分主题
跳转到指定楼层
1
发表于 2017-9-13 08:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想在真正不打开文件的前提下获取工作簿内的sheet("计算")的F2:AG2的数据到本工作表的对应行的H:AJ列里
拜托给用SQL语句实现效果,一遍提高代码运行速度,具体要求在《标准作业时间查询表》里。

IE系统.rar (476.87 KB, 下载次数: 15)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享分享 有用有用1 无用无用 分享到新浪微博
TA的精华主题TA的得分主题
2
发表于 2017-9-13 09:34 | 只看该作者
TA的精华主题TA的得分主题
3
发表于 2017-9-13 10:33 | 只看该作者
↓↓↓↓↓
  • Sub test()
  • Dim path$, cPath$, sql$, i%, conn
  •     path = "D:\下載\IE系统\03-工序分析数据库"  '这里路径修改
  •     Set conn = CreateObject("ADODB.Connection")
  •     conn.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='Excel 12.0;hdr=no;';data source=" & ThisWorkbook.FullName
  •     With Sheets("工序SMV查询")
  •         For i = 3 To 5
  •             cPath = .Cells(i, "C").Value & "" & .Cells(i, "D").Value & "" & .Cells(i, "F").Value & "-" & .Cells(i, "G").Value & ".xlsm"
  •             sql = sql & "union all select * from [Excel 12.0;hdr=no;database=" & path & cPath & "].[计算$F2:AG2]"
  •         Next
  •         .[H3].CopyFromRecordset conn.Execute(Mid(sql, 11))
  •     End With
  •     conn.Close
  •     Set conn = Nothing
  • End Sub
  • 复制代码

    评分

    参与人数 2鲜花 +4 收起 理由
    朱荣兴 + 2 感谢帮助
    zpy2 + 2 值得肯定
    查看全部评分
    TA的精华主题TA的得分主题
    4
    发表于 2017-9-13 10:55 | 只看该作者

    老师,请教下这样做的话union all语句有没有个数的限制?因为如果表格内容较多的话可能会需要写到几百上千甚至更多,我记得哪位老师说过union all语句个数好像有限制。
    TA的精华主题TA的得分主题
    5
    发表于 2017-9-13 11:08 | 只看该作者
    today0427 发表于 2017-9-13 10:55
    老师,请教下这样做的话union all语句有没有个数的限制?因为如果表格内容较多的话可能会需要写到几百上 ...

    太多的话可以分批执行,比如下面两个方式判断执行:
  •     For i = 1 To 1000
  •         Sql = Sql & "union all select * from xxx ..."

  •         If i Mod 100 = 0 Then
  •             Set Rng = Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1)
  •             Rng.CopyFromRecordset conn.Execute(Mid(Sql, 11))
  •             Sql = ""
  •         End If

  • '        If Len(Sql) > 1000 Then
  • '            Set Rng = Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1)
  • '            Rng.CopyFromRecordset conn.Execute(Mid(Sql, 11))
  • '            Sql = ""
  • '        End If
  •     Next
  •     Set Rng = Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1)
  •     Rng.CopyFromRecordset conn.Execute(Mid(Sql, 11))
  • 复制代码

    评分

    参与人数 1鲜花 +2 收起 理由
    today0427 + 2 感谢帮助
    查看全部评分
    TA的精华主题TA的得分主题
    6
    发表于 2017-9-13 11:10 | 只看该作者
    解0人 发表于 2017-9-13 11:08
    太多的话可以分批执行,比如下面两个方式判断执行:

    哦对这样也可以,学习了,刚才我想的是按行循环一句一句执行写入,就是有点死板了,而且影响速度,谢谢老师解答
    TA的精华主题TA的得分主题
    7
    发表于 2017-9-13 11:17 | 只看该作者
    本帖最后由 uynayna 于 2017-9-13 21:20 编辑

    遍历文件夹及子文件夹,以C至G列数据为条件查询。
  • <div>Sub Test()
  •     Dim MyName, Dic, Did, I, T, F, TT, MyFileName
  •     Dim cnn, SQL$
  •     T = Timer
  •     Set Dic = CreateObject("Scripting.Dictionary")    '创建一个字典对象
  •     Set Did = CreateObject("Scripting.Dictionary")
  •     lj = ThisWorkbook.Path & ""
  •     Dic.Add (lj), ""
  •     I = 0
  •     Do While I < Dic.Count
  •         Ke = Dic.keys   '开始遍历字典
  •         MyName = Dir(Ke(I), vbDirectory)    '查找目录
  •         Do While MyName <> ""
  •             If MyName <> "." And MyName <> ".." Then
  •                 If (GetAttr(Ke(I) & MyName) And vbDirectory) = vbDirectory Then    '如果是次级目录
  •                     Dic.Add (Ke(I) & MyName & ""), ""  '就往字典中添加这个次级目录名作为一个条目
  •                 End If
  •             End If
  •             MyName = Dir    '继续遍历寻找
  •         Loop
  •         I = I + 1
  •     Loop
  •     For Each Ke In Dic.keys
  •         MyFileName = Dir(Ke & "*.xl*")
  •         Do While MyFileName <> "" And MyFileName <> ActiveWorkbook.Name
  •             Did.Add (Ke & MyFileName), ""
  •             MyFileName = Dir
  •         Loop
  •     Next
  •     With Sheets("工序SMV查询")
  •         r = .Range("c65536").End(xlUp).Row
  •         For j = 3 To r
  •             myarr = Array(.Cells(j, 3).Value, .Cells(j, 4).Value, .Cells(j, 5).Value, .Cells(j, 6).Value, .Cells(j, 7).Value)
  •             For Each aa In Did.keys
  •             Set cnn = CreateObject("adodb.connection")  '创建数据库连接
  •             Set rs = CreateObject("adodb.recordset")   '创建一个数据集保存数据
  •             cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes;IMEX=2';Data Source=" & aa & ""
  •             SQL = "select * from [计算$] where 产品类别='" & myarr(0) & "' and 工序部位= '" & myarr(1) & "'and 工序形态='" & myarr(2) & "'and 工序编号='" & myarr(3) & "'and 工序名称='" & myarr(4) & "'"
  •             rs.Open SQL, cnn, 1, 1
  •                 If Not rs.EOF And Not rs.Bof Then
  •                  .Range("c" & j).CopyFromRecordset rs</div><div>                rs.Close
  •                 cnn.Close
  •                 Exit For
  •                 End If
  •             Next
  •         Next
  •     End With
  •     TT = Timer - T
  •     MsgBox TT
  • End Sub</div>
  • 复制代码

    评分

    参与人数 1鲜花 +2 收起 理由
    zpy2 + 2 值得肯定
    查看全部评分
    TA的精华主题TA的得分主题
    8
    发表于 2017-9-13 11:19 | 只看该作者
    附件请测试 IE系统.rar (475.96 KB, 下载次数: 10)
    TA的精华主题TA的得分主题
    9
    发表于 2017-9-13 22:26 | 只看该作者
    TA的精华主题TA的得分主题
    10
    发表于 2017-9-13 23:28 | 只看该作者
    IE系统新.rar (477.49 KB, 下载次数: 5)
    已更新,请测试。

    评分

    参与人数 1鲜花 +2 收起 理由
    朱荣兴 + 2 感谢帮助
    查看全部评分
    您需要登录后才可以回帖 登录 | 免费注册 新浪微博登陆
    本版积分规则
    关闭

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

    关注官方微信,每天坐享新鲜教程
    手机版|关于我们|联系我们|ExcelHome    GMT+8, 2017-11-19 16:50 , Processed in 0.094441 second(s), 24 queries , Gzip On, MemCache On.
    Powered by Discuz! X3.3 © 2001-2017 Wooffice Inc.
        沪公网安备 31011702000001号 沪ICP备11019229号 本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师
    快速回复 返回顶部 返回列表
    99uu优优