ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-11 10:57 | 显示全部楼层
我把所有的采购单都打开的时候 程序跑到少品牌列的那个采购单时 出现一个错误
运行时错误 ’-2147217904  至少一个参数没有被指定值
点击调试 发现这句出了问题
      Range("a" & [b65536].End(3).Row + 1).CopyFromRecordset _
       conn.Execute(strsql)
兄弟们帮忙看看!

TA的精华主题

TA的得分主题

发表于 2019-10-11 12:23 | 显示全部楼层
selen 发表于 2019-10-11 10:57
我把所有的采购单都打开的时候 程序跑到少品牌列的那个采购单时 出现一个错误
运行时错误 ’-2147217904   ...

已经解决这个问题 采用的sql语句查询打开的采购单的字段名称有没有品牌 然后生成sql语句查询。
  1. Option Explicit
  2. Sub tj3()
  3.     '声明变量
  4.     Dim conn, 结果记录集, 字段名称记录集
  5.     Dim 文件路径 As String, 文件名 As String, 订单号 As String, 项目名称 As String, 订购日期 As String, strsql As String, FieldsName As String, s As String, StrConn As String
  6.     Dim i As Long, j As Long
  7.     Dim Bol_PinPai As Boolean
  8.     Dim FieldsNames()
  9.     Application.ScreenUpdating = False '关闭屏幕刷新
  10.     '创建后期引用对象变量
  11.     Set conn = CreateObject("ADODB.Connection")
  12.     Set 结果记录集 = CreateObject("ADODB.Recordset")
  13.     Set 字段名称记录集 = CreateObject("ADODB.Recordset")
  14.     StrConn = "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName '连接字符串
  15.     conn.Open StrConn   '打开数据库连接
  16.     Range("a3:l65536").ClearContents            '清除统计表历史数据
  17.     文件路径 = ThisWorkbook.Path & ""          '获取当前工作表路径
  18.     文件名 = Dir(文件路径 & "*.xls")            '获取当前路径下要汇总的Excel文件名
  19.     Do While 文件名 <> ""
  20.         If 文件名 <> ThisWorkbook.Name Then     '非本文件
  21.             strsql = "select * from [" & 文件路径 & 文件名 & "].[order$a10:g19]"
  22.             With 结果记录集
  23.                 .Open strsql, conn, 1, 3
  24.                 .movelast
  25.                 .movefirst
  26.                 订单号 = Mid(.Fields(0).Value, 6)
  27.                 .movelast
  28.                 项目名称 = Mid(.Fields(0).Value, 6)
  29.                 .movefirst
  30.             End With
  31.             Debug.Print "============================================="
  32.             strsql = "select * from [" & 文件路径 & 文件名 & "].[order$a23:i24]"
  33.             FieldsName = ""
  34.             With 字段名称记录集
  35.                 .Open strsql, conn, 1, 3
  36.                 .movelast
  37.                 .movefirst
  38.                 If .RecordCount = 1 Then
  39.                     Bol_PinPai = False
  40.                     ReDim FieldsNames(1 To .Fields.Count)
  41.                     For i = LBound(FieldsNames) To UBound(FieldsNames)
  42.                         FieldsNames(i) = "" '初始化字段名称数组为空
  43.                     Next i
  44.                     For i = 1 To .Fields.Count
  45.                         FieldsNames(i) = .Fields(i - 1).Value   '填入字段名称到数组
  46.                         If Not Bol_PinPai Then
  47.                             If .Fields(i - 1).Value = "品牌" Then Bol_PinPai = True '判断有无品牌关键字
  48.                         End If
  49.                     Next i
  50.                     FieldsName = IIf(Bol_PinPai, "", " 品名, '', ") '根据是否有品牌关键字 拼凑不同的查询字段表
  51.                     For i = IIf(Bol_PinPai, 2, 3) To UBound(FieldsNames)
  52.                         FieldsName = FieldsName & IIf(FieldsNames(i) <> "", FieldsNames(i) & ",", "'',")
  53.                     Next i
  54.                     FieldsName = Left(FieldsName, Len(FieldsName) - 1)  '去掉最后一位逗号
  55.                 End If
  56.                 .Close  '关闭对象
  57.             End With
  58.             s = IIf(Bol_PinPai, "有品牌", "无品牌")
  59.             If IsNull(结果记录集.Fields(6).Value) Then  '读取日期
  60.                 订购日期 = Mid(结果记录集.Fields(5).Value, 6)
  61.                 Rem strsql = "select 序号,'" & 订单号 & "','" & 订购日期 & "','" & 项目名称 & "'," & FieldsName & " from [" & 文件路径 & 文件名 & "].[order$a24:i65536] where not 交货日期 is null"
  62.             Else
  63.                 订购日期 = Mid(结果记录集.Fields(6).Value, 6)
  64.                 Rem strsql = "select 序号,'" & 订单号 & "','" & 订购日期 & "','" & 项目名称 & "'," & FieldsName & " from [" & 文件路径 & 文件名 & "].[order$a24:i65536] where not 交货日期 is null"
  65.             End If
  66.             Rem 将上面得到的字符串拼接为动态查询语句
  67.             strsql = "select 序号,'" & 订单号 & "','" & 订购日期 & "','" & 项目名称 & "'," & FieldsName & " from [" & 文件路径 & 文件名 & "].[order$a24:i65536] where not 交货日期 is null"
  68.             Debug.Print "【" & 文件名 & "----" & s & "】 SQL:"; strsql  '打印最终查询的sql语句到立即窗口
  69.             Range("a" & [b65536].End(3).Row + 1).CopyFromRecordset conn.Execute(strsql) '把查询结果复制到工作表
  70.             结果记录集.Close  '关闭对象
  71.         End If
  72.         文件名 = Dir()      '获取下一个文件名
  73.     Loop
  74.     conn.Close      '关闭对象
  75.     Set 结果记录集 = Nothing
  76.     Set 字段名称记录集 = Nothing
  77.     Set conn = Nothing
  78.     [a3] = 1
  79.     [a3].AutoFill Range("a3:a" & [b65536].End(3).Row), xlFillSeries
  80.     Application.ScreenUpdating = True       '开启屏幕刷新
  81. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-10-11 12:33 | 显示全部楼层
任浪漫 发表于 2019-10-11 12:23
已经解决这个问题 采用的sql语句查询打开的采购单的字段名称有没有品牌 然后生成sql语句查询。

请问一下,你的这个代码复制用的是什么软件,可以列出序号,但复制代码时不会把序号复制到,这种格式非常好,但是一直没有弄清楚方法,如愿意的话,请告诉一下。

TA的精华主题

TA的得分主题

发表于 2019-10-11 12:40 | 显示全部楼层
cui26896 发表于 2019-10-11 12:33
请问一下,你的这个代码复制用的是什么软件,可以列出序号,但复制代码时不会把序号复制到,这种格式非常 ...

是论坛的代码块工具

提交代码块工具指示

提交代码块工具指示

TA的精华主题

TA的得分主题

发表于 2019-10-11 13:09 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-11 22:14 | 显示全部楼层
任浪漫 发表于 2019-10-11 12:23
已经解决这个问题 采用的sql语句查询打开的采购单的字段名称有没有品牌 然后生成sql语句查询。

写的非常清晰!谢谢兄弟!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-20 01:01 , Processed in 0.040309 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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