ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 如何用VBA+SQL在采购统计单中统计各个采购单数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-8 14:59 | 显示全部楼层 |阅读模式
本帖最后由 selen 于 2019-10-11 22:27 编辑

已解决!非常感谢liangmutou01和任浪漫两位兄弟!!



1、在同一目录下有N个采购单文件,均以order开头的文件名命名,希望在采购单统计表工作簿中自动统计各采购单中的详细清单。
2、采购单如图:
order (76).png


order (89).png

3、统计表统计结果如图:


采购单统计表.png



4、附件
采购单统计.rar (126.93 KB, 下载次数: 38)



5:说明:
     1)统计表中需要统计的数据均在24行以后
     2)采购单号、日期需要取出来。项目名称在送货地点中取 都放在统计表中
     3)有的采购单中没有品牌列
     4)采购单较多,希望用SQL处理数据

请哪位大侠帮忙看一下,能帮忙做一下更好,或者提供思路也行!





TA的精华主题

TA的得分主题

发表于 2019-10-8 15:21 | 显示全部楼层
1、搜索所有文件
2、根据文件获取第一个表的标签名
3、根据标签名指定Select行数,加上条件是日期大于0

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-8 16:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
microyip 发表于 2019-10-8 15:21
1、搜索所有文件
2、根据文件获取第一个表的标签名
3、根据标签名指定Select行数,加上条件是日期大于0

不太明白 能给个简单的实例吗?

TA的精华主题

TA的得分主题

发表于 2019-10-8 16:47 | 显示全部楼层
selen 发表于 2019-10-8 16:43
不太明白 能给个简单的实例吗?

用你的需求分析,你就不想直接打开文件,想利用SQL获取里面的数据
那么你就从获取数据的每个步骤倒推需要些什么内容就知道我说的1、2、3是什么咯

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-8 17:17 | 显示全部楼层
大概流程我知道 具体代码写起来有几个难点 我搞不定

TA的精华主题

TA的得分主题

发表于 2019-10-8 17:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这种问题,用pq处理起来更便捷

TA的精华主题

TA的得分主题

发表于 2019-10-8 22:10 | 显示全部楼层
Sub tj()
  Application.ScreenUpdating = False
  Set conn = CreateObject("ADODB.Connection")
  Set jlj = CreateObject("ADODB.Recordset")
  conn.Open "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName
  Range("a3:l65536").ClearContents
  lj = ThisWorkbook.Path & "\"
  wjm = Dir(lj & "*.xls")
  Do While wjm <> ""
    If wjm <> ThisWorkbook.Name Then
      jlj.Open "select * from [" & lj & wjm & "].[order$a10:g19]", conn, 1, 3
      djh = Mid(jlj.Fields(0).Value, 6)
      jlj.MoveLast
      mc = Mid(jlj.Fields(0).Value, 6)
      jlj.MoveFirst
      If IsNull(jlj.Fields(6).Value) Then
        rq = Mid(jlj.Fields(5).Value, 6)
        strsql = "select 序号,'" & djh & "','" & rq & "','" & mc & "',品名,'',规格要求,单位,数量,含税单价,金额,交货日期 from [" & lj & wjm & "].[order$a24:i65536] where not 交货日期 is null"
      Else
        rq = Mid(jlj.Fields(6).Value, 6)
        strsql = "select 序号,'" & djh & "','" & rq & "','" & mc & "',品名,品牌,规格要求,单位,数量,含税单价,金额,交货日期 from [" & lj & wjm & "].[order$a24:i65536] where not 交货日期 is null"
      End If
      Range("a" & [b65536].End(3).Row + 1).CopyFromRecordset _
       conn.Execute(strsql)
      jlj.Close
    End If
    wjm = Dir()
  Loop
  conn.Close
  Set jlj = Nothing
  Set conn = Nothing
  [a3] = 1
  [a3].AutoFill Range("a3:a" & [b65536].End(3).Row), xlFillSeries
  Application.ScreenUpdating = True
End Sub
Private Sub CommandButton1_Click()
  Call tj
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 15:31 | 显示全部楼层
liangmutou01 发表于 2019-10-8 22:10
Sub tj()
  Application.ScreenUpdating = False
  Set conn = CreateObject("ADODB.Connection")

你好 大侠  为什么在这个模板里可以使用 我放到我的实际采购单中总显示 外部表不是预期的格式?能不能加个威 信 请教一下 我的15501399666

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 15:33 | 显示全部楼层
liangmutou01 发表于 2019-10-8 22:10
Sub tj()
  Application.ScreenUpdating = False
  Set conn = CreateObject("ADODB.Connection")

  运行到这儿的时候    jlj.Open "select * from [" & lj & wjm & "].[order$a10:g19]", conn, 1, 3  显示错误的 外部表不是预期格式

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 15:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 selen 于 2019-10-11 22:32 编辑
liangmutou01 发表于 2019-10-8 22:10
Sub tj()
  Application.ScreenUpdating = False
  Set conn = CreateObject("ADODB.Connection")

采购单.zip (147.46 KB, 下载次数: 12)
大侠 帮我再看看!

已解决!感谢liangmutou01 大侠给出的解决方案: 采购单统计.zip (134.86 KB, 下载次数: 41) 代码如下:

  1. Sub tj()
  2.   Application.ScreenUpdating = False
  3.   Set conn = CreateObject("ADODB.Connection")
  4.   Set jlj = CreateObject("ADODB.Recordset")
  5.   conn.Open "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName
  6.   Range("a3:l65536").ClearContents
  7.   lj = ThisWorkbook.Path & ""
  8.   wjm = Dir(lj & "*.xls")
  9.   Do While wjm <> "" And wjm <> ThisWorkbook.Name
  10.     jlj.Open "select * from [" & lj & wjm & "].[order$a10:i24]", conn, 1, 3
  11.     djh = Mid(jlj.Fields(0).Value, 7)
  12.     rq = Mid(jlj.Fields(6).Value, 7)
  13.     jlj.Move (8)
  14.     mc = Mid(jlj.Fields(0).Value, 6)
  15.     jlj.MoveLast
  16.     If IsNull(jlj.Fields(8).Value) Then
  17.       strsql = "select 序号,'" & djh & "','" & rq & "','" & mc & "',品名,'',规格要求,单位,数量,含税单价,金额,交货日期 from [" & lj & wjm & "].[order$a24:i65536] where not 交货日期 is null"
  18.     Else
  19.       strsql = "select 序号,'" & djh & "','" & rq & "','" & mc & "',品名,品牌,规格要求,单位,数量,含税单价,金额,交货日期 from [" & lj & wjm & "].[order$a24:i65536] where not 交货日期 is null"
  20.     End If
  21.     Range("a" & [b65536].End(3).Row + 1).CopyFromRecordset _
  22.       conn.Execute(strsql)
  23.     jlj.Close
  24.     wjm = Dir()
  25.   Loop
  26.   conn.Close
  27.   Set jlj = Nothing
  28.   Set conn = Nothing
  29.   [a3] = 1
  30.   [a3].AutoFill Range("a3:a" & [b65536].End(3).Row), xlFillSeries
  31.   Application.ScreenUpdating = True
  32. End Sub

复制代码




您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 08:05 , Processed in 0.059215 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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