ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

希望通过SQL提取数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-12 16:10 | 显示全部楼层 |阅读模式
按FILE“INV_Check"的“rule" sheet 中,按填入的条件去其他DOWNLOAD file中查找符合条件的整行数据提取到sheet "result"中。应为DOWNLOAD文件很大而且有很多,希望通过SQL等高效的方式提取,谢谢了

New folder (4).zip

201.36 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2015-11-12 17:02 | 显示全部楼层
请参考:
  1. Sub SQL法()
  2.     Dim Fso As Object, File As Object, cnn As Object, rs As Object, SQL$, arr, a, b, s$, m&, n&, i&, j&, r
  3.     Application.ScreenUpdating = False
  4.     arr = Sheets("Rule").[a7].CurrentRegion
  5.     a = Array("", "", "'", "'", "#", "'", "'", "")
  6.     b = Array("SEGMENT1", "VENDOR_NAME", "INVOICE_DATE", "INVOICE_NUM", "INVOICE_CURRENCY_CODE", "INVOICE_AMOUNT")
  7.     For i = 2 To UBound(arr)
  8.         s = s & " or "
  9.         m = 0
  10.         For j = 2 To 7
  11.             If Len(arr(i, j)) Then
  12.                 m = m + 1
  13.                 If m = 1 Then
  14.                     s = s & b(j - 2) & "=" & a(j) & arr(i, j) & a(j)
  15.                 Else
  16.                     s = s & " and " & b(j - 2) & "=" & a(j) & arr(i, j) & a(j)
  17.                 End If
  18.             End If
  19.         Next
  20.     Next
  21.     If s = "" Then Exit Sub
  22.     r = 2
  23.     Set Fso = CreateObject("Scripting.FileSystemObject")
  24.     Set cnn = CreateObject("adodb.connection")
  25.     With Sheets("Result")
  26.         .UsedRange.Offset(1).ClearContents
  27.         For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
  28.             If File.Name Like "*.xlsx" Then
  29.                 n = n + 1
  30.                 If n = 1 Then
  31.                     cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & File
  32.                     SQL = "select " & Join(b, ",") & " from [Download_Invoice_Capex$] where " & Mid(s, 4)
  33.                 Else
  34.                     SQL = "select " & Join(b, ",") & " from [Excel 12.0;Database=" & File & ";].[Download_Invoice_Capex$] where " & Mid(s, 4)
  35.                 End If
  36.                 Set rs = CreateObject("adodb.recordset")
  37.                 rs.Open SQL, cnn, 1, 3
  38.                 If rs.RecordCount Then
  39.                     .Range("A" & r).CopyFromRecordset rs
  40.                     r = r + rs.RecordCount
  41.                 End If
  42.             End If
  43.         Next
  44.     End With
  45.     rs.Close
  46.     cnn.Close
  47.     Set rs = Nothing
  48.     Set cnn = Nothing
  49.     Set File = Nothing
  50.     Set Fso = Nothing
  51.     Application.ScreenUpdating = True
  52. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-11-12 17:03 | 显示全部楼层
请测试附件
New folder (4).rar (207.2 KB, 下载次数: 37)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-12 17:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

万分感谢斑竹的回复,发现一个问题,DOWNLOAD文件原来每个SHEET的名字都有差别,可以定义为第一个sheet, 或文件中所有SHEET吗?

TA的精华主题

TA的得分主题

发表于 2015-11-12 17:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jackyljc 发表于 2015-11-12 17:16
万分感谢斑竹的回复,发现一个问题,DOWNLOAD文件原来每个SHEET的名字都有差别,可以定义为第一个sheet,  ...

  1. Sub SQL法()
  2.     Dim Fso As Object, File As Object, cnn As Object, rs As Object, rst As Object, SQL$, arr, a, b, s$, m&, n&, i&, j&, r, tb$
  3.     Application.ScreenUpdating = False
  4.     arr = Sheets("Rule").[a7].CurrentRegion
  5.     a = Array("", "", "'", "'", "#", "'", "'", "")
  6.     b = Array("SEGMENT1", "VENDOR_NAME", "INVOICE_DATE", "INVOICE_NUM", "INVOICE_CURRENCY_CODE", "INVOICE_AMOUNT")
  7.     For i = 2 To UBound(arr)
  8.         s = s & " or "
  9.         m = 0
  10.         For j = 2 To 7
  11.             If Len(arr(i, j)) Then
  12.                 m = m + 1
  13.                 If m = 1 Then
  14.                     s = s & b(j - 2) & "=" & a(j) & arr(i, j) & a(j)
  15.                 Else
  16.                     s = s & " and " & b(j - 2) & "=" & a(j) & arr(i, j) & a(j)
  17.                 End If
  18.             End If
  19.         Next
  20.     Next
  21.     If s = "" Then Exit Sub
  22.     r = 2
  23.     Set Fso = CreateObject("Scripting.FileSystemObject")
  24.     With Sheets("Result")
  25.         .UsedRange.Offset(1).ClearContents
  26.         For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
  27.             If File.Name Like "*.xlsx" Then
  28.                 Set cnn = CreateObject("adodb.connection")
  29.                 cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & File
  30.                 Set rst = cnn.OpenSchema(20)
  31.                 Do Until rst.EOF
  32.                     If rst.Fields("TABLE_TYPE") = "TABLE" Then
  33.                         tb = rst("TABLE_NAME").Value
  34.                         If Right(tb, 1) = "$" Then
  35.                             SQL = "select " & Join(b, ",") & " from [" & tb & "] where " & Mid(s, 4)
  36.                             Set rs = CreateObject("adodb.recordset")
  37.                             rs.Open SQL, cnn, 1, 3
  38.                             If rs.RecordCount Then
  39.                                 .Range("A" & r).CopyFromRecordset rs
  40.                                 r = r + rs.RecordCount
  41.                             End If
  42.                         End If
  43.                     End If
  44.                     rst.MoveNext
  45.                 Loop
  46.             End If
  47.         Next
  48.     End With
  49.     rs.Close
  50.     rst.Close
  51.     cnn.Close
  52.     Set rs = Nothing
  53.     Set rst = Nothing
  54.     Set cnn = Nothing
  55.     Set File = Nothing
  56.     Set Fso = Nothing
  57.     Application.ScreenUpdating = True
  58. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-11-12 17:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
SQL不能确定每个工作簿中的第一个工作表,下面附件复制所有工作表数据
New folder (4).rar (208.98 KB, 下载次数: 35)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-12 17:40 | 显示全部楼层
zhaogang1960 发表于 2015-11-12 17:27
SQL不能确定每个工作簿中的第一个工作表,下面附件复制所有工作表数据

显示“Data type mismatch in criteria expression" error

TA的精华主题

TA的得分主题

发表于 2015-11-12 18:12 | 显示全部楼层
jackyljc 发表于 2015-11-12 17:40
显示“Data type mismatch in criteria expression" error

应该是数据类型不正确,我测试没有发现这个问题,你是否已经更换了数据源?如果是请上传出错附件分析一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-12 18:17 | 显示全部楼层
本帖最后由 jackyljc 于 2015-11-12 18:22 编辑

就是加了这个文件,原文件太大传布了,只截取10000行

trade_00000_2001(5)-1.zip

821.57 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2015-11-12 22:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zhaogang1960 于 2015-11-12 22:21 编辑
jackyljc 发表于 2015-11-12 18:17
就是加了这个文件,原文件太大传布了,只截取10000行

INVOICE_NUM字段数字文本混排,不适合作为查询条件,也不适合使用SQL方法:
INVOICE_NUM
175
181
176
180
182
DSMD0514-295738
DF183
177
179
184
DSMD0614-297848
185
192
190
DSMD0914-304608
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 15:52 , Processed in 0.027851 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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